標籤

回報問題 查看來源

標籤是目標的 ID。完整標準格式的典型標籤如下所示:

@@myrepo//my/app/main:app_binary

標籤的第一個部分是存放區名稱 @@myrepo。Double-@ 語法表示這是工作區中不重複的「標準」存放區名稱。具有標準存放區名稱的標籤可以明確識別目標,無論其出現在哪個結構定義中。

標準存放區名稱通常是混用字串,看起來像 @@rules_java~7.1.0~toolchains~local_jdk。最常見的情況是加上 apparent 存放區名稱的標籤,如下所示:

@myrepo//my/app/main:app_binary

唯一的差別在於存放區名稱的前置字串是一個 @,而非兩個。這指的是具有明顯名稱 myrepo 的存放區,根據此標籤出現的結構定義可能有所不同。

在一般情況下,如果標籤參照的相同存放區,您可以省略存放區名稱部分。因此在 @@myrepo 中 第一個標籤的寫法通常是

//my/app/main:app_binary

標籤的第二個部分是不合格的套件名稱 my/app/main,即與存放區根目錄相關的套件路徑。並結合存放區名稱和不合格套件名稱,形成完整的套件名稱 @@myrepo//my/app/main。如果標籤參照使用的套件,可能會省略套件名稱 (可選擇加上冒號)。因此,在 @@myrepo//my/app/main 中,這個標籤可以採用下列任一方式編寫:

app_binary
:app_binary

為遵循慣例,系統會在檔案忽略冒號,但依規則保留該冒號,但不具其他顯著性。

在標籤冒號後方的部分,app_binary 是不符資格的目標名稱。當此項目與套件路徑的最後一個元件相符時,可能會省略它和冒號。因此,這兩個標籤相等:

//my/app/lib
//my/app/lib:lib

套件子目錄中的檔案目標名稱為檔案在套件根目錄 (包含 BUILD 檔案的目錄) 相對的路徑。因此,這個檔案位於存放區的 my/app/main/testdata 子目錄中:

//my/app/main:testdata/input.txt

//my/app@@some_repo//my/app 等字串根據使用情境而具有兩個意義:當 Bazel 預期標籤時,則分別代表 //my/app:app@@some_repo//my/app:app。但當 Bazel 預期某個套件 (例如 package_group 規格) 時,就會參照含有該標籤的套件。

BUILD 檔案中的常見錯誤是使用 //my/app 來參照套件,或參照套件中的「所有」目標,不會發生這種錯誤。請注意,這個項目等同於 //my/app:app,因此會在目前存放區的 my/app 套件中命名為 app 目標。

不過,建議您在 package_group.bzl 檔案的規格中使用 //my/app 來參照套件,因為該套件會明確說明套件名稱為絕對路徑,且位於工作區的頂層目錄中。

相對標籤無法用於參照其他套件中的目標,在此情況下,請務必指定存放區 ID 和套件名稱。舉例來說,如果來源樹狀結構同時包含 my/app 套件和 my/app/testdata 套件 (這兩個目錄都有各自的 BUILD 檔案),後者套件會包含名為 testdepot.zip 的檔案。在 //my/app:BUILD 中參照這個檔案的方式有兩種 (錯誤,一個正確):

錯誤 - testdata 是不同套件,因此您無法使用相對路徑

testdata/testdepot.zip

正確 - 以完整路徑參照 testdata

//my/app/testdata:testdepot.zip

@@// 開頭的標籤是對主要存放區的參照,即使從外部存放區仍然有效,這些存放區仍可運作。因此,如果從外部存放區參照 @@//a/b/c,就會與 //a/b/c 不同。前者會參照主要存放區,後者則尋找外部存放區本身中的 //a/b/c。在主要存放區中寫入參照主要存放區目標的規則時,尤其需要從外部存放區使用。

如要瞭解參照目標的各種方式,請參閱目標模式

標籤的語彙規格

標籤語法不建議使用對殼層具有特殊意義的中繼字元。這有助於避免不慎引用問題,並且可更輕鬆地建構操縱標籤的工具和指令碼 (例如 Bazel Query Language)。

以下是可用目標名稱的詳細資訊。

目標名稱:package-name:target-name

target-name 是套件中的目標名稱。規則名稱是 BUILD 檔案中規則宣告中 name 屬性的值,檔案名稱則是相對於包含 BUILD 檔案目錄的路徑名稱。

目標名稱必須由 azAZ09 以及標點符號 !%-@^_"#$&'()*-+,;<=>?[]{|}~/. 組合繪製的字元組成。

檔案名稱必須是標準格式的相對路徑名稱,也就是說,檔案名稱的開頭和結尾不得為斜線 (例如 /foofoo/ 遭到禁止),也不得使用多個連續斜線做為路徑分隔符 (例如 foo//bar)。同樣地,系統不允許較高層級的參照 (..) 和目前的目錄參照 (./)。

錯誤 - 請勿使用「..」參照其他套件中的檔案

正確 - 請使用 `//package-name:filename`

雖然檔案目標名稱使用 / 是很常見的做法,但請避免在規則名稱中使用 /。尤其是使用標籤的簡短形式時,可能會混淆讀者。即使沒有這類套件 foo/bar/wiz,標籤 //foo/bar/wiz 一律為 //foo/bar/wiz:wiz 的簡寫;即使該目標存在,也絕不會參照 //foo:bar/wiz

但在某些情況下,斜線很方便,甚至在某些情況下。例如,特定規則的名稱必須與其主要來源檔案相符,該檔案可能位於套件的子目錄中。

套件名稱 - //package-name:target-name

套件的名稱是包含其 BUILD 檔案的目錄名稱,相對於所含存放區的頂層目錄。例如:my/app

套件名稱必須由 A-Zaz09/-.@_ 組合繪製的字元組成,且開頭不得為斜線。

如果語言的目錄結構對其模組系統 (例如 Java) 至關重要,請務必選擇該語言中有效 ID 的目錄名稱。

雖然 Bazel 支援工作區根套件 (例如 //:foo) 中的目標,但建議您將該套件留空,讓所有有意義的套件都有描述性名稱。

套件名稱不得包含子字串 //,結尾不得為斜線。

規則

規則會指定輸入和輸出之間的關係,以及建構輸出內容的步驟。規則可以分為多種類型 (有時稱為「規則類別」),可產生已編譯的執行檔和程式庫、測試執行檔,以及其他支援的輸出內容,如「建構百科全書」所述。

BUILD 檔案會叫用規則來宣告目標

在以下範例中,我們可以看到使用 cc_binary 規則的目標 my_app 宣告。

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

每項規則叫用都有一個 name 屬性 (必須是有效的目標名稱),可在 BUILD 檔案套件中宣告目標。

每項規則都有一組「屬性」;特定規則的適用屬性,且每個屬性的顯著性和語意都是該規則的函式。如需規則及對應屬性的清單,請參閱「建構百科全書」。每個屬性都有名稱和類型屬性可以包含的常見類型包括整數、標籤、標籤清單、字串清單、字串清單、輸出標籤、輸出標籤清單。您不需要在每個規則中指定所有屬性。因此屬性會形成鍵 (名稱) 到選填的輸入值。

許多規則中存在的 srcs 屬性屬於「標籤清單」類型;其值 (如果有的話) 則是標籤清單,每個標籤都是此規則輸入的目標名稱。

在某些情況下,規則種類的名稱有點任意,更有趣的是規則產生的檔案名稱,這適用於 Genrules。詳情請參閱一般規則:genrule

在其他情況下,名稱很重要:舉例來說,對 *_binary*_test 規則而言,規則名稱會決定建構作業產生的執行檔名稱。

這個與目標有關的非循環圖稱為「目標圖表」或「建構依附元件圖表」,也是 Bazel 查詢工具運作的網域。

目標 建構檔案