工作區規則

回報問題 查看來源 夜間 7.2 7.1 7.0 6.5 6.4

工作區規則可用來提取外部依附元件,通常 位於主要存放區外的原始碼。

注意:除了原生工作區規則以外,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.ccsign_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

標籤;預設為 None

要別名的目標。

這個目標必須存在,但可以是任何類型的規則 (包括繫結)。

如果省略這項屬性,//external 中參照這個目標的規則 只會看到這個依附關係邊緣請注意,這與省略 完全 bind 規則:如果 //external 依附元件有誤,就會發生錯誤 沒有相關聯的 bind 規則。

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

String;必選

本機存放區目錄的路徑。

這必須是包含存放區的 WORKSPACE 檔案。路徑可以是絕對路徑,也可以是主要存放區的相對路徑 WORKSPACE 檔案。

repo_mapping

字典:字串 ->String;預設值為 {}

從本機存放區名稱到全域存放區名稱的字典。這樣一來,您就能控制 這個存放區依附元件的工作區依附元件解析功能。

舉例來說,項目 "@foo": "@bar" 會在 存放區依附於 "@foo" (例如 "@foo//some:target"),實際上應會在 全域宣告的 "@bar" ("@bar//some:target")。

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

名稱;預設為 None

要當做這個目錄 BUILD 檔案的檔案。

必須指定 build_file 或 build_file_content。

這個屬性是與主要工作區相關的標籤。這個檔案不一定要 名稱是 BUILD(類似 BUILD.new-repo-name 的用詞可能適合 與存放區的實際 BUILD 檔案加以區別)。

build_file_content

String;預設值為 ""

這個存放區的 BUILD 檔案內容。

必須指定 build_file 或 build_file_content。

path

String;必選

本機檔案系統中的路徑。

可以是絕對值或相對於主要存放區的 WORKSPACE 檔案。

repo_mapping

字典:字串 ->String;預設值為 {}

從本機存放區名稱到全域存放區名稱的字典。這樣一來,您就能控制 這個存放區依附元件的工作區依附元件解析功能。

舉例來說,項目 "@foo": "@bar" 會在 存放區依附於 "@foo" (例如 "@foo//some:target"),實際上應會在 全域宣告的 "@bar" ("@bar//some:target")。

workspace_file

名稱;預設為 None

要做為這個存放區 WORKSPACE 檔案的檔案。

可以指定 workspace_file 或 workspace_file_content 屬性,但不能兩者都指定。

這個屬性是與主要工作區相關的標籤。這個檔案不一定要 名稱是 WORKSPACE,但有可能(例如 WORKSPACE.new-repo-name 也許適用於 以便與存放區的實際 WORKSPACE 檔案進行區別)。

workspace_file_content

String;預設值為 ""

這個存放區的 WORKSPACE 檔案內容。

可以指定 workspace_file 或 workspace_file_content 屬性,但不能兩者都指定。