工作區、套件和目標

Bazel 是從名為「工作區」的目錄樹狀結構中建構的原始碼建構軟體。工作區中的原始碼檔案是採用巢狀結構的階層結構來整理,其中每個套件都是包含一組相關來源檔案和一個 BUILD 檔案的目錄。BUILD 檔案會指定可從來源建構的軟體輸出內容。

工作區

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

系統會將包含 WORKSPACE 檔案的目錄視為工作區的根。因此,Bazel 會忽略位於 WORKSPACE 檔案的子目錄中的工作區中的任何目錄樹狀結構,因為這類目錄會構成其他工作區。

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

存放區

程式碼會以存放區分類。包含 WORKSPACE 檔案的目錄是主存放區的根資料夾,也稱為 @。其他 (外部) 存放區是透過工作區規則在 WORKSPACE 檔案中定義。

與 Bazel 隨附的工作區規則,工作區規則建構百科全書以及 嵌入的 Starlark 存放區規則的 Google Ads 新帳戶重新申請驗證。

由於外部存放區本身是存放區,因此通常也包含 WORKSPACE 檔案。不過,Bazel 會忽略這些額外的 WORKSPACE 檔案。請特別注意,系統不會自動新增依賴大眾運輸的存放區。

包裹

存放區中主要的程式碼機構是套件。套件是相關檔案集合,以及如何運用這些檔案產生輸出成果。

套件已定義為包含 BUILDBUILD.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。 101}這個依附元件的影響在於,在編譯期間,A 可以使用 B 的標頭檔案,而在連結期間,A 的符號則會提供給 A,B 的執行階段資料則可供 A 執行。

所有規則的變化版本都是規則產生的檔案一律與規則本身相同。因為檔案無法儲存至其他套件。不過,規則的輸入內容通常來自其他套件,有時並不常見。

套件群組是一組套件,用途是限制特定規則的存取作業。套件群組是由 package_group 函式定義。資源有三種屬性:包含的套件清單、名稱,以及包含的其他套件群組。只能參照規則的 visibility 屬性或 package 函式的 default_visibility 屬性;不會產生或使用檔案。 詳情請參閱 package_group 說明文件

標籤