如何評價 Google 開源的 Bazel ?

官網:http://bazel.io/

Github: google/bazel · GitHub


googler創業可以無縫對接了…


我已經在項目中率先使用了bazel。 就他的口號而言,所言非虛。快,很快。是maven的五倍以上。而且採用了cache和增量構建。修改一行代碼bazel只需不到0.5s而maven估計需要重新構建一次。
另外一點,就是bazel採用了pythonic語言後綴為bzl。可以讓用戶輕易的extend內置的rule。這點也跟bazel是基於rule上的構建系統有關。而且bazel可以很輕易的擴展至其他語言。這對於多種語言的項目是個利好。 java,cpp是原生支持。現在rust,go,scala都有相應的rule。雖然前期需要踩一些坑,但是投入越大回報越大。

說起來你可能不信:

bazel 快的無法想像。 我們將從兩個維度來驗證。第一個維度,增量構建。 項目地址為:

https://github.com/pingcap/tikv-client-java

所用命令:

1. time mvn install -DskipTests

`mvn install -DskipTests 78.46s user 3.24s system 332% cpu 24.578 total`

2. time bazel build //src/...

`bazel build //src/... 0.10s user 0.05s system 6% cpu 2.100 total`

第二個維度:全量構建。

1. time mvn install -DskipTests

mvn install -DskipTests 79.58s user 3.51s system 304% cpu 27.247 total

2.1 bazel clean

2.2 time bazel build //src/...

bazel build //src/... 0.10s user 0.05s system 0% cpu 1:07.88 total

其實,這裡bazel 還額外構建了protoc。相信如果不需要構件這個額外的依賴,bazel的速度將會更快。

如果在使用bazel中遇到任何問題,都可以私信或者提問邀請我回答。


僅就安裝TensorFlow時對Bazel的使用體驗而言,這貨遲早藥丸

交互模式讓人不能忍


東西是好東西,但是得看具體的情況來看使用。它需要在全部兄弟團隊里推廣開,才能夠發揮威力,否則很難使用,具體可以看看這篇文章

為什麼google bazel構建工具流行不起來


在微軟開源自己的構建工具MSBuild 3天之後,google開源了自己的構建工具。想到什麼沒?


這個東西跟騰訊開源的blade一樣,或者說是工具它爹開源了。。。

工具蠻好用的。


最近在嘗試bazel+intellij構建一個java小項目。

總而言之這貨沒有插件完全沒法用,然而插件和它自己一樣都非常不穩定,踩了無數坑。。。


TL;DR: Bazel強x用戶,還要強x你的兄弟團隊和你的庫的用戶。別用。

個人感覺不好用,非常不好用,除非你們整個公司都崇拜google神教否則就不要用,主要問題就是它實在太重了,重到你和你的所有上下游團隊必須都用或者都不用,all or nothing。

產生這個問題的主要原因是它強逼你採用google的monorepo那一套,然後把很多本來完全可以暴露給用戶的東西(比如依賴庫的頭文件,比如proto等途中生成的頭文件),藏到它自己的cache里,還藏得很深,導致結果就是對IDE非常不友好,對想要微操編譯過程、編譯產出的用戶也不友好。

然後還有一個更嚴重的問題,因為這貨完全不尊重Autotools和圍繞這套體系產生的一整套做事的方法(比如install到一個標準路徑,比如pkg-config),也不提供`bazel install`之類的方法來安裝產出,導致的結果就是如果你在寫的是一個library而不是應用程序,你用bazel,你就要強x你的用戶也用bazel,否則你的庫用戶根本用不了。這點讓咱感覺非常不爽。舉個簡單的例子,想用tensorflow和tensorflow-serving作為庫來二次開發,就被強餵了bazel這坨(嗶——)。這點可以總結為,對社區不友好。

另外,這貨還有一個奇怪的特性,你寫一個foo/foo.cpp,一個foo/foo.h,然後你要在foo.cpp里include那個foo.h,你必須寫 #include "foo/foo.h"。你寫#include "foo.h"就會報錯找不到文件。然後你還要給頭文件寫一個cc_library規則,給foo.cpp寫一個cc_binary規則,才能把這倆玩意編成一個小程序。這點個人感覺實在有點扯淡,連編譯器的標準行為模式都被break掉了,同一套代碼想同時兼容autotools / cmake ... 和bazel,還得為了bazel的這個奇葩特性改代碼、改其他構建系統的配置,被強x到這個程度你能忍?反正我是不能忍。

實話說,我寧可手擼Makefile。也不想用bazel。

PS:對自己的個人娛樂小代碼,我一般用meson + ninja。雖然功能還有待完善,但是配置簡潔,使用爽快,速度也非常快,實話說我覺得ninja比bazel快多了。另外對IDE也很友好,友好到在eclipse里把ninja當make用,依賴庫頭文件什麼的隨便看,代碼隨便補全,不需要任何插件即可舒暢使用。另外meson還有VS2015 backend可以直接對接VS2015。

PS2:以上僅針對C++,Java沒試過,而且Java我對maven的龜速也有所體會,bazel應該怎麼都比它快很多吧,也許還有點使用價值?

PS3:給Bazel貢獻代碼需要簽CLA,將所有權益無條件奉獻給Google。雖然對絕大部分人來說這並沒有什麼卵用,但實話說還是不爽。所以我也不想給Bazel做任何貢獻。


推薦閱讀:

Google 現在還是一個對員工有足夠吸引力的夢幻公司嗎?
如何分析計費視頻教育平台 Google Helpouts 的模式?
Google I/O 2013 有哪些亮點?
如何評價 2015 年 12 月 10 日谷歌在發布會上稱發現了一個比傳統演算法快一億倍的量子演算法?
想要了解 Google、亞馬遜等公司最前沿的技術可以去哪些網站?

TAG:開源 | 谷歌Google |