Bazel 會使用以下形式的原始碼來建構軟體:該原始碼在樹狀目錄中
工作區工作區中的來源檔案會以巢狀階層結構整理,
套件,其中每個套件都屬於一個目錄,內含一組相關的
來源檔案和一個 BUILD
檔案。BUILD
檔案會指定執行的軟體
可以從來源建構
工作區
工作區是檔案系統中的目錄樹狀結構,內含原始碼
適合要建構的軟體檔案每個工作區都有一個名為
WORKSPACE
可能空白,或包含對 外部的參照
建構輸出內容所需的依附元件。
包含 WORKSPACE
檔案的目錄,會視為
工作區因此,Bazel 會忽略根目錄為包含 WORKSPACE
檔案的子目錄的工作區中的任何目錄樹狀結構,因為這些目錄會形成另一個工作區。
Bazel 也支援 WORKSPACE.bazel
檔案做為 WORKSPACE
檔案的別名。如果
兩個檔案都存在,但使用 WORKSPACE.bazel
。
存放區
程式碼彙整在repositories中。包含 WORKSPACE
的目錄
檔案是主要存放區的根目錄,也稱為 @
。其他 (外部)
存放區是使用工作區規則定義在 WORKSPACE
檔案中,或
透過 Bzlmod 系統中的模組和擴充功能產生內容查看外部
依附元件總覽。
隨附 Bazel 的工作區規則會記錄在工作區 「Build」部分 百科全書和嵌入式相關說明文件 Starlark 存放區規則。
由於外部存放區本身就是存放區,因此通常會包含
WORKSPACE
檔案。不過,Bazel 會忽略這些額外的 WORKSPACE
檔案。特別是,間接依附的存放區
自動新增。
套件
存放區中程式碼組織的主要單位是套件。A 罩杯 套件是相關檔案集合,以及檔案內容 以便產生輸出構件
套件定義為包含
BUILD
檔案,名稱為 BUILD
或 BUILD.bazel
。A 罩杯
套件包含其目錄中的所有檔案,以及其下的所有子目錄,
但不包含 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
說明文件。