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