Bazel是一個支持多語言、跨平臺的構(gòu)建工具。Bazel支持任意大小的構(gòu)建目標,并支持跨多個倉庫的構(gòu)建悲幅,是Google主推的一種構(gòu)建工具套鹅。
優(yōu)勢
Bazel存在如下方面的優(yōu)勢。
- 易理解:Bazel對外提供聲明式表達的構(gòu)建DSL汰具,可讀性好卓鹿,降低了構(gòu)建系統(tǒng)的實現(xiàn)復(fù)雜度;
- 速度快:得益于Bazel優(yōu)異的編譯緩存和依賴分析技術(shù)留荔,更好地支持并行和增量編譯吟孙,甚至增量測試;
- 跨平臺:一套構(gòu)建系統(tǒng)聚蝶,支持多平臺杰妓,異構(gòu)系統(tǒng)的構(gòu)建;
- 可擴展:使用類Python語言(Starlark)擴展規(guī)則碘勉,支持多語言構(gòu)建巷挥;
- 大規(guī)模:支持100k+源文件規(guī)模的構(gòu)建,支持多倉的依賴管理恰聘;
- 云構(gòu)建:天然地支持云構(gòu)建句各,復(fù)用既有的計算資源。
舉個例子晴叨,使用Bazel,工程中如果需要自動生成Protobuf代碼矾屯,配置CUDA編程環(huán)境兼蕊,管理多倉代碼的依賴等,Bazel相對具有明顯的優(yōu)勢件蚕。
劣勢
但是孙技,Bazel也存在一些與生俱來的缺陷。
Bazel運行于JRE
也就是說排作,安裝Bazel需要額外安裝JRE牵啦,即使Bazel二進制包內(nèi)嵌了一個最小化的JRE;此外妄痪,Bazel啟動速度遲鈍哈雏,內(nèi)存消耗很厲害。
業(yè)界存在其他構(gòu)建工具衫生,例如Scons裳瘪,它使用Python。但是罪针,在幾乎所有的Unix開發(fā)環(huán)境中彭羹,Python是預(yù)裝的,這給開發(fā)者減少了很大麻煩泪酱。
所以派殷,Native風(fēng)格的構(gòu)建工具具有很大的競爭優(yōu)勢还最。一方面,安裝極簡毡惜,用戶心智負擔不大拓轻;另一方面,用戶不需要額外安裝依賴虱黄,整個工具鏈的安裝是完備的悦即、閉包的。
Bazel與Unix社區(qū)文化存在沖突
在Unix社區(qū)橱乱,開發(fā)者已然非常熟悉./configure, make, make install
的構(gòu)建工作流辜梳,及其相關(guān)的工具鏈。而且泳叠,開發(fā)者一致遵循FHS(文件系統(tǒng)層次標準)的約定作瞄。
但是,Bazel改變了Unix一貫的風(fēng)格和文化危纫,與社區(qū)文化產(chǎn)生了劇烈的矛盾宗挥。如果你使用Bazel發(fā)布一個庫,對不起种蝶,你的用戶也得用Bazel契耿,才能引用到你的庫。Bazel不支持類似于bazel install
命令螃征,你的用戶只能使用Bazel搪桂,然后創(chuàng)建新的規(guī)則去依賴你的庫。使用Bazel盯滚,你強奸了你的用戶群踢械。
反過來,如果Bazel
要想依賴于一個非Bazel的庫魄藕,得做適配才能使用内列,用戶不能復(fù)用既有存在的CMake或Make的構(gòu)建系統(tǒng)。眾所周知背率,有的構(gòu)建系統(tǒng)異常復(fù)雜话瞧,適配過程并非易事,你得對庫的架構(gòu)退渗,依賴關(guān)系把握非常準確才行移稳。Bazel開發(fā)團隊也沒有提供相關(guān)工具鏈,翻譯既有存在構(gòu)建腳本会油,這個過程留待給用戶自行解決个粱。
總結(jié)起來,Bazel到Make翻翩,不支持都许;從Make到Bazel稻薇,得出血;從Bazel到Bazel胶征,零成本塞椎,但可能招致用戶的強制性。這對社區(qū)文化是一種傷害睛低,這也是Bazel最大的硬傷案狠。如果沒有背后有錢的老爹Google,估計Bazel早死了钱雷。
這可能與Bazel的定位和架構(gòu)有關(guān)系骂铁,大家也不能罵爹罵娘罵Google傻逼。Bazel定位在于支持多語言罩抗,而不僅僅只包括C/C++拉庵,C/C++的一些慣用法和工具鏈,在其他語言可能不成立套蒂。
此外钞支,/usr/include, /usr/lib
是系統(tǒng)目錄。如果你存在兩個工程操刀,分別依賴于相同的烁挟、當版本不同的庫。它們都安裝到系統(tǒng)目錄骨坑,必然存在版本沖突信夫。幸運的是,容器時代這個問題得到了緩解卡啰。相反地,在每個Bazel
項目中警没,將其依賴控制在自己的工作區(qū)(Workspace)內(nèi)匈辱,避免了類似的版本沖突問題。
另外杀迹,Bazel的霸道亡脸,也復(fù)合Google一貫高傲的風(fēng)格。通過Bazel的黏性树酪,Google在多語言多語言編程領(lǐng)域浅碾,尤其在云構(gòu)建領(lǐng)域糕非,正在積極構(gòu)建強大的生態(tài)系統(tǒng)和技術(shù)壁壘舞痰。
Bazel的生態(tài)系統(tǒng)不夠成熟
在C/C++領(lǐng)域,CMake牍陌,Make占據(jù)主流疮茄。Bazel作為后起之秀滥朱,能否在生態(tài)中站穩(wěn)腳跟根暑,還得靠時間證明。此外徙邻,上文提及Bazel與社區(qū)文化存在沖突和矛盾排嫌,Bazel的生態(tài)建設(shè)還是不夠樂觀。
目前缰犁,整個Bazel的生態(tài)淳地,基本由TensorFlow社區(qū)挑大梁。但是帅容,TensorFlow的最佳實踐颇象,也很難在社區(qū)中得到有效的傳播和復(fù)制。而且丰嘉,TensorFlow在實踐Bazel也遇到了一些挑戰(zhàn)夯到,包括復(fù)雜度(構(gòu)建腳本代碼行,及其依賴的復(fù)雜度)饮亏。
一方面耍贾,TensorFlow的系統(tǒng)架構(gòu)和實現(xiàn)存在固有的復(fù)雜度;因為TensorFlow是多語言路幸、異構(gòu)的系統(tǒng)實現(xiàn)荐开,常見的工程的構(gòu)建過程不見得擁有TensorFlow那么復(fù)雜,而且大部分公司的工程也不見得擁有Google的復(fù)雜度简肴。在Google玩得轉(zhuǎn)的技術(shù)實踐晃听,在其他公司并不一定有效。
另一方面砰识,搶占既有存在的生態(tài)系統(tǒng)能扒,本身門檻極高。猶如在Java領(lǐng)域辫狼,個人認為Gradle比Maven優(yōu)秀初斑,但Gradle的生態(tài)依然沒有Maven健全和完善。從社區(qū)活躍度看膨处,目前只有Google相關(guān)的項目在推進Bazel见秤,其他項目幾乎沒什么動靜,由此可見一斑真椿。
Monorepo并非是萬能的
Bazel的架構(gòu)思維是Monorepo哲學(xué)的技術(shù)延伸鹃答。但是,Monorepo是否有效突硝,要取決于公司的文化测摔,團隊協(xié)助方式,項目特點等眾多因素狞换,在日常的項目中避咆,并非一定是靈丹妙藥舟肉。采用Monorepo組織項目,Git庫變得越來越大查库,甚至對IDE也提出了挑戰(zhàn)路媚;更有甚者,Monorepo往往導(dǎo)致模塊之間的依賴隱式化樊销,不能得到及時的顯性暴露整慎,增加了系統(tǒng)架構(gòu)的耦合度。