工作區、套件和目標

Bazel 會根據名為工作區的目錄樹狀結構的原始碼建構軟體。工作區中的來源檔案會整理成巢狀套件,其中每個套件都是一個目錄,其中包含一組相關來源檔案和一個 BUILD 檔案。BUILD 檔案會指定可以從來源建構哪些軟體輸出。

工作區

工作區是檔案系統中的目錄樹狀結構,其中包含您要建構的軟體的來源檔案。每個工作區都有一個名為 WORKSPACE 的文字檔案,這個檔案可以是空白的,或者可能包含建構輸出所需的外部依附元件參照。

系統會將包含名為 WORKSPACE 檔案的目錄視為工作區的根目錄。因此,Bazel 會忽略所在子目錄中具有 WORKSPACE 檔案的子目錄中的任何目錄樹狀結構,因為它們會形成另一個工作區。

Bazel 也支援 WORKSPACE.bazel 檔案做為 WORKSPACE 檔案的別名。如果兩個檔案都存在,系統會使用 WORKSPACE.bazel

存放區

程式碼會整理在存放區中。包含 WORKSPACE 檔案的目錄是主要存放區的根目錄,也稱為 @。其他 (外部) 存放區是在 WORKSPACE 檔案中使用工作區規則定義。

如要瞭解與 Bazel 搭售的工作區規則,請參閱 Build Encorlopedia工作區規則部分,以及內嵌 Starlark 存放區規則的說明文件。

由於外部存放區本身是存放區,因此通常也會包含 WORKSPACE 檔案。不過,Bazel 會忽略這些額外的 WORKSPACE 檔案。特別是,不會自動新增仰賴的存放區。

套裝組合

存放區中程式碼機構的主要單位是套件。套件是相關檔案的集合,並指定用於產生輸出成果的方式。

套件會定義為包含名為 BUILD (或 BUILD.bazel) 檔案的目錄。套件包含其目錄中的所有檔案,以及其下方的所有子目錄,但不包含 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 做為輸入內容。這項依附元件的影響是在編譯期間可以使用 B 的標頭檔案,在連結期間可以使用 B 的符號,而 A 執行期間也可使用 B 的執行階段資料。

所有規則的變量是,規則產生的檔案一律與規則本身同屬一個套件;不可將檔案產生至另一個套件。不過,規則輸入的資料來自另一個套件並不常見。

套件群組是一組套件,用途為限制特定規則的無障礙程度。套件群組是由 package_group 函式定義。這些屬性有三個屬性:其中包含的套件清單、名稱,以及其中包含的其他套件群組。僅允許的參照方式是來自規則的 visibility 屬性或 package 函式的 default_visibility 屬性;這些屬性不會產生或取用檔案。詳情請參閱 package_group 說明文件

標籤