您好,登錄后才能下訂單哦!
bazel的基礎概念與原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
bazel目前已廣泛用于云計算領域的開源軟件的構建如k8s、kubevirt等,本文以一個新手的角度分享下bazel的基礎知識,其存在的價值。對比下,它與其他已經存在的構建系統的差別,以及它適用于什么場景。
構建對應的英文是BUILD,也就是大家所說的編譯打包,就是將編寫出的代碼經過編譯器處理,產生二進制,形成一個可以正常運行的軟件包(如deb或者rpm)。對于編譯型語言來說,構建幾乎是日常工作的一部分。
是一個輔助過程,它本身不產生價值。
又是必須的一個過程,沒有它CI是空談。
基于這兩個特點來說,我們希望理想的構建系統具備以下特點:
盡可能地快。可以方便開發人員,編寫代碼后快速出包驗證改動。
方便維護,可以清晰地展示依賴關系,在系統中添加一個模塊,或者減少一個模塊,可以非常容易維護。
對比理想系統,我們看下構建技術的發民。軟件構建技術的發展和IT技術的發展保持同步,歷經了初期、中期和現代化三個階段(純粹個人理解)。
一、初期
軟件規模小,軟件工程的概念還未被提出。
這時對構建的要求很低,或者說不需要。編寫出的代碼可以經過匯編編譯后直接執行,也沒有流水線。這時期的代碼就是makefile,或者是直接自己寫腳本進行編譯執行。軟件的特點是,單語言小規模,對構建基本上沒有要求。
二、中期
軟件規模開始增大。已有的makefile機制已經難以滿足需要。以Linux內核為例,makefile已經無法滿足,所以內核開發者在內核中添加了自己的構建擴展,以滿足日漸增大的內核代碼。同時,也涌現出了cmake這樣較現代化的構建工具。主要原因是,代碼規模增大后,構建這一不增值過程開始消耗掉大量開發人員的精力,以cmake為代表的工具可以半自動化管理依賴,生成makefile,提高編譯人員的生產力,減少了重復勞動; 此時的構建系統基本上可以滿足要求,但已經開始顯現不足了。
三、現代化
軟件規模增大的同時,大型系統開始轉向多語言協作。使用運行高效率的編譯型語言(C、C++、Java等)編寫低層(數據面),使用開發高效率的動態非編譯型語言編寫上層(管理面)。多語言對于cmake來說,無能為力。此時以bazel為代表的現代構建系統出現,可以很好地解決cmake無法解決的問題。
在一個機構逐步增大的過程中,大公司在IT上經歷的問題,你同樣會遇到,所以了解一門技術的驅動力一定是問題,而不是Google出品的一定就是適合你的。這里也一樣,我去了解Bazel是因為遇到了現有技術無法解決的問題。
[bazel](https://www.bazel.build/](https://www.bazel.build/) Google開源的構建工具。它通過將構建過程進行抽象建模,實現了一個接近理解的構建系統。
快速構建。
bazel支持增量式編譯,支持緩存,支持分布式擴展。這3點就可以滿足快速建構。只要有投入足夠多的硬件資源,你的構建就可以很快。
清晰的依賴關系。
雖然makefile也可以定義出來。但makefile定義的規則,全部需要人工維護,特別是分散在多個代碼倉庫中的依賴,很難有人能全局把握好依賴關系。但bazel可以清晰地以依賴關系圖的方式展現出當前的依賴關系。而且是自動建立地,可查詢。
除了以上兩個優點,最重要的一點是bazel支持多語言構建。以下將通過介紹bazel的基本對象(概念),來闡述bazel是如何對構建過程進行建模的。
3.1 構建
構建過程是一個動作。有輸入輸出,如下圖所示。
一個大型系統中有許多構建過程,有頂層的負責產生最終產出物。有底層負責某個小模塊的構建。不同的構建之間,有相互依賴。A的產生物是B的輸入,那么B就依賴A,構建上則要求A先于B構建。這些依賴最終在大模塊里出的就是一個依賴網。如下圖,A依賴B C D,但B也依賴C。
3.2 Bazel中主要的概念如下。
名稱 | 解釋 |
---|---|
WORKSPACE | 每一個工程都需要定義的一個文件,位于工程的根目錄下。可以是空文件,也可以加載一些外部依賴。 |
action | rule中定義的構建動作。全部在運行階段執行。 |
BUILD | 存在每個小代碼倉庫中,定義當前倉庫中的構建要素。輸入、輸出和構建行為。是最小的構建單位。 |
bzl | 自定義的規則后綴。 |
external rule | bazel約定的其他規則庫,用skylark語言(Python的子集)編寫。 |
rule | bazel的構建規則,位于BUILD文件中。每個規則中包含輸入和輸出,以及構建動作。目前已有C/C++、Java、Golang、Python等成熟的構建規則庫,可以方便地從github上獲取。見官方文檔已有規則庫 |
package | 在BUILD文件中定義的一系統目標。包具有可見性屬性,可用來控制對外暴露的屬性。 |
build graph | 構建依賴圖,就是前文提到的依賴關系圖。由定義在各個BUILD文件中的目標構成。 |
有了基礎概念之后,解釋下bazel的工作原理。bazel以client/server模式工作,server在閑置一段時間后會自動退出。以WORKSPACE[#WORKSPACE]和BUILD文件將整個構建過程模型化。 bazel工作分以下三個階段(phase)。也就是執行了bazel build ...之后發生的事情。
loading phase 加載階段
bazel遍歷當前工程下,所有子文件夾,找到其中的BUILD文件,加載外部依賴,生成一個個package和target。
analysis phase 分析階段
根據各個BUILD中定義的目標和輸入輸出信息,建立一個內存中的build graph。
executing phase 執行階段
根據build graph逐個運行各個規則定義的動作,產生最終的目標。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。