存放區、工作區、套件和目標

回報問題 查看來源

Bazel 會根據「存放區」樹狀結構中的原始碼建構軟體。當中含有一組定義的存放區。存放區中的來源檔案會以巢狀結構階層結構整理,其中每個套件都是一個目錄,其中包含一組相關的來源檔案和一個 BUILD 檔案。BUILD 檔案會指定可以從來源建構哪些軟體輸出。

存放區

在 Bazel 建構作業中使用的原始碼檔案會整理在「存放區」 (通常縮短成「存放區」)。存放區是目錄樹狀結構,其根層級有界線標記檔案。這類界線標記檔案可能是 MODULE.bazelREPO.bazel,或舊版內容中的 WORKSPACEWORKSPACE.bazel

執行目前 Bazel 指令的存放區稱為「主要存放區」。其他 (外部) 存放區是由存放區規則定義;詳情請參閱外部依附元件總覽

工作區

工作區是所有 Bazel 指令從同一個主存放區執行共用的環境。其中包含主要存放區和所有已定義外部存放區的組合。

請注意,過去「存放區」和「工作區」的概念已限制;「工作區」一詞經常用於指稱主要存放區,有時也會用來當做「存放區」的同義詞。

套裝組合

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

套件的定義為包含名為 BUILDBUILD.bazelBUILD 檔案的目錄。套件包含其目錄中的所有檔案,以及其下所有子目錄,但本身包含 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 說明文件

標籤