中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bazel的基礎概念與原理是什么

發布時間:2021-11-22 18:14:05 來源:億速云 閱讀:691 作者:柒染 欄目:云計算

bazel的基礎概念與原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

0x01 背景

bazel目前已廣泛用于云計算領域的開源軟件的構建如k8s、kubevirt等,本文以一個新手的角度分享下bazel的基礎知識,其存在的價值。對比下,它與其他已經存在的構建系統的差別,以及它適用于什么場景。

0x02 構建系統

構建對應的英文是BUILD,也就是大家所說的編譯打包,就是將編寫出的代碼經過編譯器處理,產生二進制,形成一個可以正常運行的軟件包(如deb或者rpm)。對于編譯型語言來說,構建幾乎是日常工作的一部分。

  1. 是一個輔助過程,它本身不產生價值。

  2. 又是必須的一個過程,沒有它CI是空談。

基于這兩個特點來說,我們希望理想的構建系統具備以下特點:

  1. 盡可能地快。可以方便開發人員,編寫代碼后快速出包驗證改動。

  2. 方便維護,可以清晰地展示依賴關系,在系統中添加一個模塊,或者減少一個模塊,可以非常容易維護。

對比理想系統,我們看下構建技術的發民。軟件構建技術的發展和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開源的構建工具。它通過將構建過程進行抽象建模,實現了一個接近理解的構建系統。

  1. 快速構建。
    bazel支持增量式編譯,支持緩存,支持分布式擴展。這3點就可以滿足快速建構。只要有投入足夠多的硬件資源,你的構建就可以很快。

  2. 清晰的依賴關系。
    雖然makefile也可以定義出來。但makefile定義的規則,全部需要人工維護,特別是分散在多個代碼倉庫中的依賴,很難有人能全局把握好依賴關系。但bazel可以清晰地以依賴關系圖的方式展現出當前的依賴關系。而且是自動建立地,可查詢。

除了以上兩個優點,最重要的一點是bazel支持多語言構建。以下將通過介紹bazel的基本對象(概念),來闡述bazel是如何對構建過程進行建模的。

0x03 概念

3.1 構建
構建過程是一個動作。有輸入輸出,如下圖所示。

bazel的基礎概念與原理是什么

一個大型系統中有許多構建過程,有頂層的負責產生最終產出物。有底層負責某個小模塊的構建。不同的構建之間,有相互依賴。A的產生物是B的輸入,那么B就依賴A,構建上則要求A先于B構建。這些依賴最終在大模塊里出的就是一個依賴網。如下圖,A依賴B C D,但B也依賴C。

bazel的基礎概念與原理是什么

3.2 Bazel中主要的概念如下。

名稱解釋
WORKSPACE每一個工程都需要定義的一個文件,位于工程的根目錄下。可以是空文件,也可以加載一些外部依賴。
actionrule中定義的構建動作。全部在運行階段執行。
BUILD存在每個小代碼倉庫中,定義當前倉庫中的構建要素。輸入、輸出和構建行為。是最小的構建單位。
bzl自定義的規則后綴。
external rulebazel約定的其他規則庫,用skylark語言(Python的子集)編寫。
rulebazel的構建規則,位于BUILD文件中。每個規則中包含輸入和輸出,以及構建動作。目前已有C/C++、Java、Golang、Python等成熟的構建規則庫,可以方便地從github上獲取。見官方文檔已有規則庫
package在BUILD文件中定義的一系統目標。包具有可見性屬性,可用來控制對外暴露的屬性。
build graph構建依賴圖,就是前文提到的依賴關系圖。由定義在各個BUILD文件中的目標構成。

0x04 原理

有了基礎概念之后,解釋下bazel的工作原理。bazel以client/server模式工作,server在閑置一段時間后會自動退出。以WORKSPACE[#WORKSPACE]和BUILD文件將整個構建過程模型化。 bazel工作分以下三個階段(phase)。也就是執行了bazel build ...之后發生的事情。

  1. loading phase 加載階段
    bazel遍歷當前工程下,所有子文件夾,找到其中的BUILD文件,加載外部依賴,生成一個個package和target。

  2. analysis phase 分析階段
    根據各個BUILD中定義的目標和輸入輸出信息,建立一個內存中的build graph。

  3. executing phase 執行階段
    根據build graph逐個運行各個規則定義的動作,產生最終的目標。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂水县| 衡东县| 杂多县| 福建省| 平阴县| 鱼台县| 阜阳市| 曲麻莱县| 阳朔县| 卓资县| 甘孜| 当阳市| 舟曲县| 金门县| 肇庆市| 新河县| 望谟县| 新乐市| 靖宇县| 东源县| 澄迈县| 喀喇| 海淀区| 建平县| 湖北省| 修文县| 合山市| 富平县| 电白县| 中方县| 尉氏县| 中牟县| 太原市| 伽师县| 永顺县| 奉贤区| 巴马| 东兴市| 巴林右旗| 合水县| 海伦市|