標籤是目標的 ID。完整標準中的一般標籤 表單看起來會像這樣:
@@myrepo//my/app/main:app_binary
標籤的第一個部分是存放區名稱 @@myrepo
。雙 @
分
語法會指出這是一個標準存放區
name,這個名稱不會重複
工作區使用標準存放區名稱的標籤可明確識別目標
無論出現在哪個情境中
標準存放區名稱通常是混凝土字串,看起來像
@@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
,所以這會將 app
目標命名為 my/app
目前存放區的套件
不過,建議您使用 //my/app
參照套件,詳情請參閱
package_group
或 .bzl
檔案的規格,因為這顯然
表示套件名稱為絕對名稱,且位於頂層
相對標籤無法用於參照其他套件中的目標;這個
在這種情況下,一律必須指定存放區 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 查詢語言。
以下是可用目標名稱的詳細資訊。
目標名稱:package-name:target-name
target-name
是套件中的目標名稱。規則名稱
是 BUILD
內規則宣告中的 name
屬性值
file;檔案名稱則是相對於包含
BUILD
檔案。
目標名稱必須完全由 a
到 z
集合中的字元組成,
A
–Z
、0
–9
,以及標點符號符號 !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
。
檔案名稱必須是標準格式的相對路徑名稱,也就是說,必須
開頭或結尾不得為斜線 (例如 /foo
和 foo/
是
禁用) 且不得包含多個連續斜線做為路徑分隔符
(例如 foo//bar
)。同樣地,進階參照 (..
) 和
禁止參照目前的目錄參照 (./
)。
錯誤 - 請勿使用「..」參照其他套件中的檔案
正確 - 使用 `//package-name:filename`
雖然檔案目標名稱使用 /
是很常見的做法,但請避免使用
/
。尤其是當標籤的簡短形式
否則可能會混淆讀者//foo/bar/wiz
標籤一律是簡寫
//foo/bar/wiz:wiz
的值,即使沒有這類套件 foo/bar/wiz
也一樣;該資料來源
一律不會參照 //foo:bar/wiz
,即使該目標存在也一樣。
但在某些情況下,斜線非常方便,或 有時甚至有必要例如,特定規則的名稱必須符合 其主要來源檔案,可能位於套件的子目錄中。
套件名稱 - //package-name:target-name
套件的名稱是包含其 BUILD
檔案的目錄名稱。
相對於所含存放區的頂層目錄。
例如:my/app
。
套件名稱必須完全由模型集中的字元組成
A
-Z
、a
–z
、0
–9
、/
、-
、.
、@
和_
,
開頭是斜線
適用於具有目錄結構且對模組至關重要的語言 系統 (例如 Java) 中的目錄名稱時,請務必選擇 設定有效的 ID。
雖然 Bazel 支援工作區根套件中的目標 (例如
//:foo
),建議您保留該套件,以便所有有意義的套件
具有描述性名稱
套件名稱不得包含子字串 //
,結尾不得為斜線。
規則
規則會指定輸入和輸出之間的關係,以及 來建構輸出內容規則的執行方式有很多種 種類 (有時稱為規則類別),這些類別會產生編譯 執行檔和程式庫、測試執行檔及其他支援的 輸出內容,如「建構百科全書」一文所述。
BUILD
檔案會叫用規則來宣告目標。
在以下範例中,您會看到目標 my_app
的宣告
使用 cc_binary
規則建立政策
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
每項規則叫用都有一個 name
屬性 (必須是有效的屬性)
「target name」),宣告套件中的目標
BUILD
檔案中的
每項規則都有一組「屬性」;建立指定目標時 而每個屬性的顯著性和語意都是 會指定規則的種類請參閱《建築百科全書》 列出規則及相應屬性的清單每個屬性都有名稱 不同類型的工作屬性可以包含整數、標籤、清單等常見類型。 標籤、字串、字串清單、輸出標籤、輸出標籤清單非 請在每項規則中指定所有屬性因此屬性會形成 字典。
許多規則中的 srcs
屬性屬於「標籤清單」類型;其
值 (如果有的話) 是標籤清單,每個標籤都是
輸入到這項規則的輸入內容
在某些情況下,規則種類名稱可任意指定, 有趣的是規則產生的檔案名稱 產生的內容若需更多資訊,請參閲 一般規則:genrule。
在其他情況下,則這個名稱非常重要:對於 *_binary
和 *_test
規則,
例如,規則名稱會決定
建構過程
這張含有目標的有向非循環圖稱為「目標圖表」,或 建構依附元件圖表,也是要用來 Bazel Query Tool 就會運作,
目標 | 建構檔案 |