Workspace 規則

回報問題 查看原始碼

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

注意:除了原生工作區規則以外,Bazel 也會嵌入各種 Starlark 工作區規則,尤其是處理網路上代管的 Git 存放區或封存檔的規則。

規則

繫結

查看規則來源
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。例如,假設有一個 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,而無需編輯。

繫結功能也可用來在工作區提供外部存放區的目標。舉例來說,假設 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.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 可能如下所示:

#include "sign_in.h"
#include "src/openssl.h"

引數

屬性
name

Name; required

此目標的專屬名稱。

actual

Label; optional

要別名的目標。

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

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

本地存放區

查看規則來源
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

Name; required

此目標的專屬名稱。

path

String; required

本機存放區目錄的路徑。

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

repo_mapping

Dictionary: String -> String; optional

從本機存放區名稱轉換成全域存放區名稱的字典。可讓使用者控管這個存放區的依附元件依附元件解析方式。

舉例來說,項目 "@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 存放區。這表示目前的存放區可在檔案系統中的任何位置定義及使用目標。

這項規則會建立 BazelSPACE 存放區,並在其中建立含有 BUILD 檔案與路徑的符號連結。建構檔案應建立相對於 path 的目標。針對已包含 WORKSPACE 檔案和 BUILD 檔案的目錄,您可以使用 local_repository 規則。

範例

假設目前的存放區是根目錄 ~/chat-app 的即時通訊用戶端。它想要使用在不同目錄定義的 SSL 程式庫:~/ssl

使用者可以新增 SSL 程式庫 (~/chat-app/BUILD.my-ssl) 的 BUILD 檔案,加入以下項目:

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

Name; required

此目標的專屬名稱。

build_file

String; optional

要當做此目錄建立檔案的檔案。

必須指定 build_file 或 build_file_content。

此屬性是相對於主要工作區的標籤。檔案不必命名為 BUILD ,但也可以是。(例如 BUILD.new-repo-name 可能有助於與存放區的實際 BUILD 檔案區分)。

build_file_content

String; optional

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

必須指定 build_file 或 build_file_content。

path

String; required

本機檔案系統的路徑。

可以是絕對存放區的 WORKSPACE 檔案,也可能是相對位置。

repo_mapping

Dictionary: String -> String; optional

從本機存放區名稱轉換成全域存放區名稱的字典。可讓使用者控管這個存放區的依附元件依附元件解析方式。

舉例來說,項目 "@foo": "@bar" 會宣告,當這個存放區依附於 "@foo" (例如 "@foo//some:target" 的依附元件) 時,應實際在全域宣告的 "@bar" ("@bar//some:target") 中解析該依附元件。

workspace_file

String; optional

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

您可以指定 Workspace file 或 workspace_file_content,但不能同時指定兩者。

此屬性是相對於主要工作區的標籤。檔案不必命名為 WORKSPACE,但可以是。(像是 WORKSPACE.new-repo-name 就很適合用來與存放區的實際 WORKSPACE 檔案區分)。

workspace_file_content

String; optional

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

您可以指定 Workspace file 或 workspace_file_content,但不能同時指定兩者。