Bazel 會根據在目錄樹狀結構中 (稱為工作區) 排序的原始碼建構軟體。工作區中的來源檔案會以套件巢狀階層排序,其中每個套件都是一個目錄,內含一組相關來源檔案和一個 BUILD
檔案。BUILD
檔案會指定可從來源建構哪些軟體輸出內容。
工作區
工作區是檔案系統中的目錄樹狀結構,內含要建構的軟體來源檔案。每個工作區都有一個名為 WORKSPACE
的文字檔案,可能為空白,也可能包含建構輸出內容所需的外部依附元件參照。
包含名為 WORKSPACE
的檔案的目錄會視為工作區的根目錄。因此,Bazel 會忽略根目錄為包含 WORKSPACE
檔案的子目錄的工作區中的任何目錄樹狀結構,因為這些目錄會形成另一個工作區。
Bazel 也支援 WORKSPACE.bazel
檔案做為 WORKSPACE
檔案的別名。如果兩個檔案都存在,系統會使用 WORKSPACE.bazel
。
存放區
程式碼會整理在存放區中。包含 WORKSPACE
檔案的目錄是主要存放區的根目錄,也稱為 @
。其他 (外部) 存放區則是使用工作室規則在 WORKSPACE
檔案中定義,或是從 Bzlmod 系統中的模組和擴充功能產生。詳情請參閱外部依附元件總覽。
與 Bazel 一起提供的工作區規則已記錄在Build 百科全書的「Workspace Rules」一節,以及嵌入式 Starlark 存放區規則的說明文件中。
由於外部存放區本身就是存放區,因此通常也會包含 WORKSPACE
檔案。不過,Bazel 會忽略這些額外的 WORKSPACE
檔案。請特別注意,系統不會自動新增間接依附的存放區。
套件
存放區中程式碼組織的主要單位是套件。套件是一組相關檔案,以及如何使用這些檔案產生輸出項目的規格。
套件定義為包含名為 BUILD
或 BUILD.bazel
的 BUILD
檔案的目錄。套件包含目錄中的所有檔案,以及其下方的所有子目錄,但不包含本身含有 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
說明文件。