Bazel 構建工具介紹

原文鏈接:https://blog.csdn.net/afandaafandaafanda/article/details/82728302

什麼是 Bazel

Bazel 是一個開源的構建和測試工具,類似於Make、Maven及Gradle。它使用一種人易於理解的高級構建語言。Bazel 支持多種開發語言的項目,能夠基於多個平臺來構建。Bazel支持跨多個製品庫和大規模用戶的大型代碼倉庫。
爲什麼我們需要Bazel

Bazel 具有以下優勢:

    高級構建語言 Bazel使用一種抽象的、人易於理解的、語義級別的高級語言來描述項目的構建屬性。與其他工具不同,Bazel基於庫,二進制文件,腳本和數據集的概念進行操作,使您免於陷入將單個調用編寫到編譯器和鏈接器等工具的複雜性。

    Bazel高效可靠 Bazel緩存以前完成的所有工作,並跟蹤文件內容和構建命令的更改。通過這種方式,Bazel知道何時需要重建某些東西,並僅重建那些東西。爲了進一步加快構建速度,您可以將項目設置爲以並行和增量的方式構建。

    Bazel是跨平臺的 Bazel可以在Linux,macOS和Windows上運行。Bazel可以爲同一個項目中的多個平臺(包括桌面,服務器和移動設備)構建二進制文件和可部署軟件包。

    Bazel擴展性強 Bazel在使用100k+源文件處理構建時仍然保持良好的性能表現。它適用於多個製品存儲庫和10K用戶規模。

    Bazel是可擴展的 您可以擴展Bazel以支持您選擇的語言。

Bazel 核心概念

Bazel根據在稱爲工作空間(WORKSPACE)的目錄中組織的源代碼構建軟件。工作空間中的源文件以包的嵌套層次結構進行組織,其中每個包都是包含一組相關源文件和一個BUILD文件的目錄。BUILD文件指定可以從源構建哪些軟件輸出。
工作空間

工作空間是文件系統上的目錄,其中包含要構建的軟件的源文件,以及指向包含構建輸出的目錄的符號鏈接。每個工作空間目錄都有一個名爲WORKSPACE的文本文件,該文件可能爲空,或者可能包含對構建輸出所需的外部依賴項的引用。

工作空間中代碼組織的主要單元是包。包是相關文件的集合,以及它們之間的依賴關係的規範。包被定義爲包含名爲BUILD的文件的目錄,該文件位於工作空間中的頂級目錄下。包中包含其目錄中的所有文件,以及其下的所有子目錄,除了那些本身包含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

    1
    2
    3
    4
    5

目標

包是一個容器。包的元素稱爲目標。大多數目標是兩種主要類型之一,即文件和規則。此外,還有另一種目標,包組,但它們的數量要少得多。

文件進一步分爲兩種。源文件通常由開發者的努力編寫,並簽入代碼存儲庫。生成的文件(有時稱爲派生文件)不會簽入,而是由構建工具根據特定規則從源文件生成。

第二種目標是規則。規則指定一組輸入和一組輸出文件之間的關係,包括從輸入中導出輸出的必要步驟。規則的輸出始終是生成的文件。規則的輸入可以是源文件,但也可以是生成的文件; 因此,一條規則的輸出可能是另一條規則的輸入,允許構建長鏈規則。

在大多數情況下,規則的輸入是源文件還是生成的文件都是無關緊要的; 重要的只是該文件的內容。這一事實使得用規則生成的生成文件替換複雜的源文件變得容易,例如當手動維護高度結構化文件的負擔變得太煩人時,有人編寫程序來派生它。該文件的使用者無需更改。相反,生成的文件可以很容易地被僅具有本地更改的源文件替換。

規則的輸入還可以包括其他規則。這種關係的確切含義通常非常複雜,並且依賴於語言或規則,但直觀上很簡單:C++庫規則A可能有另一個C++庫規則B用於輸入。這種依賴性的影響是B的頭文件在編譯期間可用於A,B的符號在鏈接期間可用於A,B的運行時數據在執行期間可用於A。

所有規則的不變量是規則生成的文件始終屬於與規則本身相同的包; 無法將文件生成到另一個包中。但是,規則的輸入來自另一個包的情況並不少見。

包組是一組包,其目的是限制某些規則的可訪問性。包組由package_group函數定義。 它們有兩個屬性:它們包含的包列表及其名稱。 唯一允許引用它們的方法來自規則的visibility屬性或package函數的default_visibility屬性; 他們不生成或使用文件。
總結

Bazel 默認支持多種開發語言,如Java,C++,Javascript, Android等等,您還可以根據需要擴展它。在很多開源項目中都有用到它,由於其支持並行構建,增量構建等特性,與傳統構建工具區別很大,因此備受青睞,後續會詳細介紹其他概念和入門使用,敬請關注。
 ————————————————
版權聲明:本文爲CSDN博主「feng1456」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/afandaafandaafanda/article/details/82728302

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章