久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

144次閱讀
沒有評論

共計 2497 個字符,預計需要花費 7 分鐘才能閱讀完成。

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

0x01 背景

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

0x02 構建系統

構建對應的英文是 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 是如何對構建過程進行建模的。

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 … 之后發生的事情。

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

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

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

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

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計2497字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 五大连池市| 凤冈县| 宁远县| 楚雄市| 遂川县| 彭山县| 灵宝市| 巴林左旗| 普洱| 武鸣县| 南陵县| 晋州市| 封丘县| 花莲县| 渝北区| 林西县| 大荔县| 阿巴嘎旗| 通江县| 买车| 西平县| 荥经县| 房山区| 淮北市| 无为县| 灵山县| 安陆市| 驻马店市| 呈贡县| 彭山县| 鹿邑县| 宁海县| 连云港市| 方城县| 平陆县| 正蓝旗| 昌宁县| 丰城市| 甘肃省| 宣恩县| 兴安盟|