工作區規則可用來提取外部依附元件,通常 位於主要存放區外的原始碼。
注意:除了原生工作區規則以外,Bazel 也會嵌入各種 Starlark 工作區規則,尤其是要處理的交易規則 。
規則
繫結
bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
警告:我們不建議使用 bind()
。請參閱「考慮移除繫結」長時間
討論其問題和替代方案。具體來說,請考慮使用
repo_mapping
存放區屬性。
警告:select()
無法在 bind()
中使用。請參閱可設定屬性常見問題,
細節。
為 //external
套件中的目標提供別名。
//external
套件不是「normal」套件:沒有外部/ 目錄
因此可視為「虛擬套件」當中包含所有繫結目標。
範例
如要提供目標別名,請在 WORKSPACE 檔案中為其bind
。例如:
假設有一個名為 java_library
目標
//third_party/javacc-v2
。如要別名,請將下列程式碼新增至
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
繫結也可用於讓工作區使用外部存放區中的目標。
例如,如果存放區中有匯入了一個名為 @my-ssl
的遠端存放區
WORKSPACE 檔案,且其具有 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 "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 存放區。也就是說 存放區可在檔案系統上的任何位置定義及使用目標。
這項規則會建立 Bazel 存放區,方法是建立含有 WORKSPACE 檔案的 WORKSPACE 檔案與子目錄,
BUILD 檔案和路徑的符號連結。建構檔案應根據
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", )
這會建立連結至 /home/user/ssl 的 @my-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 屬性,但不能兩者都指定。 |