Bazel源自谷歌內部構建工具Blaze,是一個構建和測試工具,提供了人類可讀的定義語言,主要針對具有多語言、多代碼庫的大型項目。Bazel最初是在2015年開源的,現在發佈了1.0版本。
Bazel 1.0保證了更高的穩定性和向後兼容性,因爲這些是Bazel用戶的主要痛點。Bazel或其生態系統經常發生重大變更,導致用戶經常需要重寫一部分構建規則。事實上,Bazel團隊已經承諾在未來的Bazel版本中遵循語義版本控制,這意味着只有主要版本才允許包含重大變更。此外,Bazel團隊承諾主要版本之間至少保持穩定三個月。
在創建依賴關係圖時,Bazel使用內容摘要而不是時間戳來確定過時的工件,這樣就有可能可以避免不必要的重新構建,即使是分佈在多個時鐘不完全同步的主機上也可以進行可預測的構建。分佈式構建是Bazel的一個複雜特性,爲了能夠在雲端構建大型的系統。因爲使用了內容摘要,Bazel能夠緩存中間構建步驟的輸出結果,並在必要時重用它們。中間結果也可以在團隊之間共享。Bazel的另一個獨特之處在於它的密封性。也就是說,Bazel的構建是沙箱化的,如果一個構建規則沒有聲明依賴於一個給定的文件,那麼它將不能完全打開那個文件,從而排除了隱藏依賴的可能性。這就提升了可優化的空間,並支持可重複的構建。
與其他大多數構建系統(通常與特定的語言綁定)相反,Bazel從一開始就是一個多語言構建系統。這是通過爲可構建目標類型定義一些特定於語言的規則來實現的,例如,針對C/ C++的cc_library和cc_binary規則,針對Java的java_binary和java_import,等等。對主要語言的支持都是開箱即用的,如果有必要也可以很容易添加新的規則。
Bazel用來定義新規則的語言叫做Starlark,它的靈感來自於Python 3語法,儘管它並不包含所有Python特性。它不支持可變集合或文件I/O,主要是爲了防止程序員使用這些特性來創建構建系統之前不知道的工件,從而破壞Bazel依賴關係圖。
Bazel 1.0的發佈得到了一些開發人員的積極響應,他們對Bazel的性能和效率超過其他構建工具(如Maven和Gradle)大加讚許。向後兼容性被大多數開發人員認爲是向前邁出的重要一步,爲Bazel第三方規則生態系統的發展提供了更穩定的基礎。
原文鏈接: