Workspace 規則用於提取外部依附元件,通常是位於主要存放區外部的原始碼。
注意:除了原生工作區規則,Bazel 也會嵌入各種 Starlark 工作區規則,特別是處理網路上託管的 Git 存放區或封存檔。
規則
bind
查看規則來源bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
警告:不建議使用 bind()。如要深入瞭解相關問題和替代方案,請參閱「考慮移除繫結」。特別是考慮使用repo_mapping存放區屬性。
警告:select() 無法在 bind() 中使用。詳情請參閱可設定屬性常見問題。
在 //external 套件中為目標提供別名。
//external 套件並非「一般」套件:沒有外部/ 目錄,因此可視為包含所有繫結目標的「虛擬套件」。
範例
如要為目標指定別名,請在 WORKSPACE 檔案中 bind。舉例來說,假設有名為 //third_party/javacc-v2 的 java_library 目標。您可以在 WORKSPACE 檔案中新增下列內容,為這個目標設定別名:
bind(
name = "javacc-latest",
actual = "//third_party/javacc-v2",
)
現在目標可以依附於 //external:javacc-latest,而非 //third_party/javacc-v2。如果發布 javacc-v3,bind 規則可以更新,所有依附於 //external:javacc-latest 的 BUILD 檔案現在都會依附於 javacc-v3,不必經過編輯。
您也可以使用 Bind,讓外部存放區中的目標可供工作區使用。
舉例來說,如果 WORKSPACE 檔案中匯入名為 @my-ssl 的遠端存放區,且該存放區具有 cc_library 目標 //src:openssl-lib,您可以使用 bind 為此目標建立別名:
bind(
name = "openssl",
actual = "@my-ssl//src:openssl-lib",
)
然後,在工作區的 BUILD 檔案中,繫結目標可依下列方式使用:
cc_library(
name = "sign-in",
srcs = ["sign_in.cc"],
hdrs = ["sign_in.h"],
deps = ["//external:openssl"],
)
在 sign_in.cc 和 sign_in.h 中,可使用標頭檔案相對於存放區根目錄的路徑,參照 //external:openssl 公開的標頭檔案。舉例來說,如果 @my-ssl//src:openssl-lib 的規則定義如下:
cc_library(
name = "openssl-lib",
srcs = ["openssl.cc"],
hdrs = ["openssl.h"],
)
然後 sign_in.cc 的 include 可能會像這樣:
#include "sign_in.h" #include "src/openssl.h"
引數
| 屬性 | |
|---|---|
name |
名稱:必填 這個目標的專屬名稱。 |
actual
|
標籤;預設值為 這個目標必須存在,但可以是任何類型的規則 (包括繫結)。 如果省略這項屬性,參照 |
local_repository
查看規則來源local_repository(name, path, repo_mapping)
允許繫結本機目錄中的目標。也就是說,目前的存放區可以使用這個其他目錄中定義的目標。詳情請參閱繫結部分。
範例
假設目前的存放區是聊天用戶端,根目錄為 ~/chat-app。這個存放區想使用在另一個存放區 (~/ssl) 中定義的 SSL 程式庫。SSL 程式庫有目標 //src:openssl-lib。
使用者可以在 ~/chat-app/WORKSPACE 中新增下列幾行,對這個目標新增依附元件:
local_repository(
name = "my-ssl",
path = "/home/user/ssl",
)
目標會將 @my-ssl//src:openssl-lib 指定為依附元件,以依附這個程式庫。
引數
| 屬性 | |
|---|---|
name |
名稱:必填 這個目標的專屬名稱。 |
path
|
字串;必填 本機存放區目錄的路徑。這必須是包含存放區 WORKSPACE 檔案的目錄路徑。路徑可以是絕對路徑,也可以是相對於主要存放區 WORKSPACE 檔案的路徑。 |
repo_mapping
|
字典:字串 -> 字串;預設值為 舉例來說,項目 |
new_local_repository
查看規則來源new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)
允許將本機目錄轉換為 Bazel 存放區。這表示目前的存放區可以定義及使用檔案系統中任何位置的目標。
這項規則會建立 WORKSPACE 檔案和子目錄,其中包含指向指定 BUILD 檔案和路徑的符號連結,藉此建立 Bazel 存放區。建構檔案應建立相對於 path 的目標。如果目錄已包含 WORKSPACE 檔案和 BUILD 檔案,則可以使用 local_repository 規則。
範例
假設目前的存放區是聊天用戶端,根目錄為 ~/chat-app。這個存放區想使用在不同目錄 (~/ssl) 中定義的 SSL 程式庫。
使用者可以為 SSL 程式庫建立 BUILD 檔案 (~/chat-app/BUILD.my-ssl),其中包含下列內容,藉此新增依附元件:
java_library(
name = "openssl",
srcs = glob(['*.java'])
visibility = ["//visibility:public"],
)
然後,他們可以在 ~/chat-app/WORKSPACE 中新增下列程式碼行:
new_local_repository(
name = "my-ssl",
path = "/home/user/ssl",
build_file = "BUILD.my-ssl",
)
這會建立 @my-ssl 存放區,並符號連結至 /home/user/ssl。如要讓目標依附這個程式庫,請將 @my-ssl//:openssl 新增至目標的依附元件。
您也可以使用 new_local_repository 納入單一檔案,而不只是目錄。舉例來說,假設您在 /home/username/Downloads/piano.jar 有一個 jar 檔案,您可以在 WORKSPACE 檔案中新增下列內容,將該檔案加入建構作業:
new_local_repository(
name = "piano",
path = "/home/username/Downloads/piano.jar",
build_file = "BUILD.piano",
)
並建立下列 BUILD.piano 檔案:
java_import(
name = "play-music",
jars = ["piano.jar"],
visibility = ["//visibility:public"],
)
@piano//:play-music,使用 piano.jar。
引數
| 屬性 | |
|---|---|
name |
名稱:必填 這個目標的專屬名稱。 |
build_file
|
名稱:預設為 必須指定 build_file 或 build_file_content。 這項屬性是相對於主要工作區的標籤。檔案不一定要命名為 BUILD,但可以這麼做。(例如 BUILD.new-repo-name,可與存放區的實際 BUILD 檔案區別。) |
build_file_content
|
字串;預設值為 必須指定 build_file 或 build_file_content。 |
path
|
字串;必填 本機檔案系統上的路徑。可以是絕對路徑,也可以是相對於主要存放區 WORKSPACE 檔案的路徑。 |
repo_mapping
|
字典:字串 -> 字串;預設值為 舉例來說,項目 |
workspace_file
|
名稱:預設為 您可以指定 workspace_file 或 workspace_file_content,但不能兩者同時指定。 這項屬性是相對於主要工作區的標籤。檔案不一定要命名為 WORKSPACE,但可以這麼做。(例如 WORKSPACE.new-repo-name,可與存放區的實際 WORKSPACE 檔案區別。) |
workspace_file_content
|
字串;預設值為 您可以指定 workspace_file 或 workspace_file_content,但不能兩者同時指定。 |