工作區、套件和目標

回報問題 查看來源

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

Workspace

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

包含名為 WORKSPACE 檔案的目錄會視為工作區的根目錄。因此,Bazel 會忽略位於包含 WORKSPACE 檔案的子目錄的工作區中的任何目錄樹狀結構,因為這些目錄會形成另一個工作區。

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

存放區

程式碼彙整在存放區中。包含 WORKSPACE 檔案的目錄是主要存放區的根目錄,也稱為 @。其他 (外部) 存放區是使用工作區規則在 WORKSPACE 檔案中定義,或是透過 Bzlmod 系統中的模組和擴充功能產生。詳情請參閱外部依附元件總覽

關於 Bazel 隨附的工作區規則,皆記錄在「建構百科全書」的「工作區規則」部分,以及內嵌 Starlark 存放區規則的說明文件。

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

套件

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

套件定義為包含 BUILD 檔案且名為 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。這項依附元件的影響在於 A 的標頭檔案可在編譯期間取得,A 可以在連結期間使用 B 的符號,而 A 會在執行期間取得 B 的執行階段資料。

但所有規則的例外是,規則產生的檔案一律會與規則本身屬於相同的套件;您無法將檔案產生到其他套件中。然而,規則的輸入內容通常不會來自其他套件。

套件群組是一組套件,用來限制特定規則的存取性。套件群組是由 package_group 函式定義。這些套件有三個屬性:所含套件清單、名稱,以及納入的其他套件群組。參照這些變數的唯一方法,就是從規則的 visibility 屬性或 package 函式的 default_visibility 屬性;它們不會產生或使用檔案。詳情請參閱 package_group 說明文件

標籤