Meta開源內部使用的大型建置系統Buck2,該系統以Rust編寫,其建置速度是第一代Buck1的2倍,可供開發者更快速地進行程式迭代。Buck2的特色在於完全分離核心與語言規則,具有更高的平行性,整合遠端執行和虛擬檔案系統,並且重新設計了控制臺輸出。

Meta之所以如此重視建置系統,甚至將Buck1徹底重構的原因,官方提到,更快速且高效的建置系統將直接提高開發人員的效率。因此Meta重新設計出大規模建置系統Buck2,目的是要進一步提升開發人員的生產力。

Meta在設計Buck2時,僅保留了Buck1的核心概念以及工作流程,其餘完全重寫,而Buck2的一大特色便是完全分離核心與語言規則,這與Buck1和類似的系統Bazel有很大的不同,Buck1是把所有語言規則都寫在核心中,而Bazel也是將C++、Java語言規則寫在核心中。

Buck2的核心是以Rust開發,而像是建置C++等語言規則是以Starlark編寫,Buck2將核心與語言規則分開,使得規則更容易改變和理解,當需要支援新語言或是更改既有語言規則時,維護人員僅需要專注於特定語言模組,不需要徹底重構整個系統。

分離核心和語言規則能夠更有效地降低系統複雜性,維護人員可以更好地理解、修改和維護各部分,在不影響整體運作的情況下,獨立更新特定語言規則,不只降低錯誤風險,也提高了整體開發速度。

除此之外,與Buck1和Bazel相比,Buck2建置系統使用單一增量相依圖(Dependency Graph)驅動建置過程,因而改善了多階段性建置帶來的問題。Buck2在整個建置過程,只會有一個相依圖,隨著開發過程進展增量更新,不只能夠有效追蹤程式碼更改和相依項目變更,也能確保只對有變化的部分重新編譯和連接。

由於在傳統建置系統的建置過程,經常存在包括編譯、連結等多個階段,這些階段有先後順序,期間還會產生中間產物,因此Buck2沒有階段建置的特性,代表著建置過程更簡單且高效率。Buck2的執行速度非常快速,明顯快過Buck1,在沒有程式碼變更的情況下,Buck2幾乎能夠即時處理後續建置工作,即便有許多工作需要執行,Buck2的平行性運算優勢也能大幅加速建置。

Buck2良好支援遠端執行,使用與Bazel相同的API,可在遠端機器上運作,且Buck2和虛擬檔案系統整合,不會簽出(Checked out)整個儲存庫,而是僅按需存取檔案。目前Meta所開源的這個Buck2版本,幾乎和內部使用的版本相同,僅有換掉編譯器工具鏈和遠端執行伺服器,並且換上開源替代專案。

熱門新聞

Advertisement