標籤

回報問題 查看原始碼 Nightly · 7.4 . 7.3 7.2 7.1 7.0 6.5

所有目標僅屬於一個套件。目標名稱為 稱為標籤每個標籤都會以不重複的方式識別目標。標準格式的一般標籤如下所示:

@myrepo//my/app/main:app_binary

標籤的第一個部分是存放區名稱 @myrepo//。 一般情況下,標籤是指標籤對應的存放區 存放區 ID 的縮寫是 //。 因此,在 @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 目前存放區的套件

不過,在 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 查詢語言

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

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

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

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

檔案名稱必須是正常形式的相對路徑名稱,也就是說,檔案名稱開頭和結尾不得有斜線 (例如 /foofoo/ 皆為禁止的名稱),也不能包含多個連續的斜線做為路徑分隔符號 (例如 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-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 屬性 (必須是有效的屬性) 「target name」),宣告套件中的目標 BUILD檔案中的

每項規則都有一組「屬性」;建立指定目標時 而每個屬性的顯著性和語意都是 會指定規則的種類請參閱《建築百科全書》 列出規則及相應屬性的清單每個屬性都有名稱 不同類型的工作屬性可有的常見類型包括整數、標籤、標籤清單、字串、字串清單、輸出標籤、輸出標籤清單。並非每個規則都需要指定所有屬性。因此屬性會形成 字典。

許多規則中的 srcs 屬性類型為「標籤清單」;如果有值,則為標籤清單,每個標籤都是這個規則的輸入目標名稱。

在某些情況下,規則類型的名稱會有所不同,但更有趣的是規則產生的檔案名稱,這也是 genrules 的情況。若需更多資訊,請參閲 一般規則:genrule

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

這張含有目標的有向非循環圖稱為「目標圖表」,或 建構依附元件圖表,也是要用來 Bazel Query Tool 就會運作,

目標 BUILD 檔案