存放區、工作區、套件和目標

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

Bazel 會根據原始碼建構軟體,這些原始碼以目錄樹狀結構 (稱為「存放區」) 進行排序。工作區由一組已定義的存放區組成。存放區中的來源檔案會以套件的巢狀階層方式排序,其中每個套件都是一個目錄,內含一組相關來源檔案和一個 BUILD 檔案。BUILD 檔案會指定可從來源建立哪些軟體輸出內容。

存放區

Bazel 建構作業中使用的來源檔案會整理在存放區中 (通常簡稱為repos)。存放區是根目錄中的邊界標記檔案目錄樹狀結構;此邊界標記檔案可以是 MODULE.bazelREPO.bazel,或是在舊版情境中的 WORKSPACEWORKSPACE.bazel

執行目前 Bazel 指令的 repo 稱為主要 repo。其他 (外部) 存放區則由存放區規則定義;詳情請參閱外部依附元件總覽

工作區

工作區是指從同一個主要存放區執行的所有 Bazel 指令所共用的環境。包含主要存放區和所有已定義的外部存放區。

請注意,過去「存放區」和「工作區」的概念經常會混淆;「工作區」一詞經常用來指主要存放區,有時甚至會用來指「存放區」。

套件

存放區中程式碼組織的主要單位是套件。套件是一組相關檔案,以及如何使用這些檔案產生輸出項目的規格。

套件定義為包含名為 BUILDBUILD.bazelBUILD 檔案的目錄。套件會包含目錄中的所有檔案,以及其下方的所有子目錄,但不包含本身含有 BUILD 檔案的子目錄。根據這個定義,任何檔案或目錄都不能同時屬於兩個不同的套件。

舉例來說,在下列目錄樹狀結構中,有兩個套件:my/app 和子套件 my/app/tests。請注意,my/app/data 不是套件,而是屬於套件 my/app 的目錄。

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

目標

套件是目標的容器,這些目標是在套件的 BUILD 檔案中定義。大多數的目標都是兩種主要類型之一,即「檔案」和「規則」

檔案可進一步分為兩種。來源檔案通常是由人手寫入,並提交至存放區。產生的檔案 (有時稱為衍生檔案或輸出檔案) 不會簽入,而是由來源檔案產生。

第二種目標會使用規則宣告。每個規則例項都會指定一組輸入內容與一組輸出檔案之間的關係。規則的輸入內容可能是來源檔案,但也可能是其他規則的輸出內容。

在大多數情況下,規則的輸入內容是來源檔案或產生的檔案並不重要,重要的只有該檔案的內容。因此,您可以輕鬆將複雜的原始檔案,替換為規則產生的檔案,例如當手動維護高度結構化的檔案變得太過繁重,而有人編寫程式來衍生檔案時。您不需要對該檔案的使用者進行任何變更。相反地,產生的檔案很容易被僅有本機變更的來源檔案取代。

規則的輸入內容也可能包含其他規則。這類關係的確切意義通常相當複雜,且取決於語言或規則,但從直覺上來說,這很簡單:C++ 程式庫規則 A 可能會使用另一個 C++ 程式庫規則 B 做為輸入內容。這個依附元件的效果是,A 在編譯期間可使用 B 的標頭檔案、在連結期間可使用 B 的符號,以及在執行期間可使用 B 的執行階段資料。

所有規則的變異數是,由規則產生的檔案一律會與規則本身屬於相同的套件;無法將檔案產生至其他套件。不過,規則的輸入內容來自其他套件並不少見。

套件群組是一組套件,目的是限制特定規則的存取權。套件群組是由 package_group 函式定義。它們有三個屬性:所含套件清單、名稱和所含其他套件群組。您只能透過規則的 visibility 屬性或 package 函式的 default_visibility 屬性參照這些屬性,這些屬性不會產生或使用檔案。詳情請參閱 package_group 說明文件

標籤