如有疑問或需要支援,請參閱「取得協助」。
什麼是 Bazel?
Bazel 是一種工具,可自動執行軟體建構和測試作業。支援的建構工作包括執行編譯器和連結器,以產生可執行程式和程式庫,以及為 Android、iOS 和其他目標環境組裝可部署的套件。Bazel 與 Make、Ant、Gradle、Buck、Pants 和 Maven 等其他工具類似。
Bazel 有什麼特別之處?
Bazel 的設計符合 Google 的軟體開發方式。這項功能具備以下特色:
- 支援多種語言:Bazel 支援多種語言,且可擴充以支援任意程式設計語言。
- 高階建構語言:專案是以
BUILD
語言描述,這是一種簡潔的文字格式,可將專案描述為一組相互連結的小型程式庫、二進位檔和測試。相較之下,使用 Make 等工具時,您必須描述個別檔案和編譯器呼叫。 - 支援多個平台:您可以使用相同的工具和
BUILD
檔案,為不同架構甚至是不同平台建構軟體。在 Google,我們使用 Bazel 建構所有內容,包括在資料中心系統上執行的伺服器應用程式,以及在行動裝置上執行的用戶端應用程式。 - 可重現性:在
BUILD
檔案中,每個程式庫、測試和二進位檔都必須完整指定直接依附元件。當您變更來源檔案時,Bazel 會使用這項依附性資訊,瞭解必須重建的內容,以及可平行執行的工作。也就是說,所有建構作業都是累加式,且一律會產生相同結果。 - 可擴充性:Bazel 可處理大型建構作業;在 Google,伺服器二進位檔通常有 10 萬個原始碼檔案,且建構作業 (未變更任何檔案) 約需 200 毫秒。
為什麼 Google 不使用「...」?
- Make、Ninja:這些工具可精確控制要叫用哪些指令來建構檔案,但使用者必須自行編寫正確的規則。
- 使用者會在較高的層級與 Bazel 互動。舉例來說,Bazel 內建「Java 測試」、「C++ 二進位檔」等規則,以及「目標平台」和「主機平台」等概念。這些規則經過實戰測試,可確保萬無一失。
- Ant 和 Maven:Ant 和 Maven 主要適用於 Java,而 Bazel 則可處理多種語言。Bazel 鼓勵將程式碼集細分成可重複使用的小單元,且只會重建需要重建的單元。處理大型程式碼集時,這項功能可加快開發速度。
- Gradle:Bazel 設定檔的結構比 Gradle 更嚴謹,因此 Bazel 能確切瞭解每個動作的作用。這樣就能提高平行處理能力,並提升重現性。
- Pants、Buck:這兩項工具分別由 Twitter 和 Foursquare 的前 Google 員工開發。這些工具是以 Bazel 為模型建構,但功能集不同,因此不適合我們。
Bazel 的由來為何?
Bazel 是 Google 用於建構內部伺服器軟體的工具。現在也擴展到其他軟體,例如連線至伺服器的行動應用程式 (iOS、Android)。
您是否將內部工具改寫為開放原始碼?這是叉子嗎?
Bazel 與內部工具共用大部分程式碼,每天有數百萬個建構作業使用其規則。
Google 為什麼要建構 Bazel?
很久以前,Google 是使用大量產生的 Makefile 建構軟體。這導致建構速度緩慢且不可靠,開始影響開發人員的生產力和公司的敏捷性。Bazel 就是解決這些問題的方法。
Bazel 是否需要建構叢集?
根據預設,Bazel 會在本機執行建構作業。不過,Bazel 也可以連線至建構叢集,進一步加快建構和測試速度。詳情請參閱遠端執行和快取以及遠端快取說明文件。
Google 的開發程序如何運作?
對於伺服器程式碼庫,我們使用下列開發工作流程:
- 我們所有的伺服器程式碼都位於單一的巨大版本控管系統中。
- 所有人都使用 Bazel 建構軟體。
- 不同團隊擁有來源樹狀結構的不同部分,並將元件設為
BUILD
目標。 - 分支主要用於管理版本,因此所有人都會在最新修訂版本中開發軟體。
Bazel 是這項哲學的基石:由於 Bazel 要求完整指定所有依附元件,因此我們可以預測哪些程式和測試會受到變更影響,並在提交前進行審查。
如要進一步瞭解 Google 的開發程序,請參閱 eng tools 網誌。
你為什麼要開放 Bazel?
建構軟體應該有趣又簡單。建構速度緩慢且難以預測,會讓程式設計變得無趣。
為什麼要使用 Bazel?
- Bazel 可能會縮短建構時間,因為它只會重新編譯需要重新編譯的檔案。同樣地,如果測試未變更,系統可以略過重新執行的程序。
- Bazel 會產生確定性結果。這可消除增量和乾淨建構、筆電和 CI 系統等之間的偏差。
- Bazel 可使用相同工具,從相同工作區建構不同的用戶端和伺服器應用程式。舉例來說,您可以在單一提交中變更用戶端/伺服器通訊協定,並測試更新後的行動應用程式是否能與更新後的伺服器搭配運作,同時使用相同工具建構兩者,享有上述所有 Bazel 優勢。
可以查看範例嗎?
可以,請參閱簡單範例,或閱讀 Bazel 原始碼,瞭解更複雜的範例。
Bazel 最擅長什麼?
Bazel 擅長建構及測試具有下列屬性的專案:
- 程式碼集數量龐大的專案
- 以 (多種) 編譯語言編寫的專案
- 部署至多個平台的專案
- 測試範圍廣泛的專案
我可以在哪裡執行 Bazel?
Bazel 可在 Linux、macOS (OS X) 和 Windows 上執行。
只要平台提供 JDK,移植到其他 UNIX 平台應該相對容易。
我不該使用 Bazel 處理哪些工作?
- Bazel 會盡量聰明地使用快取。也就是說,如果建構作業的輸出內容不應快取,就不適合執行這類作業。舉例來說,下列步驟不應從 Bazel 執行:
- 從網際網路擷取資料的編譯步驟。
- 可連線至網站 QA 執行個體的測試步驟。
- 部署步驟,可變更網站的雲端設定。
- 如果建構作業包含幾個冗長的連續步驟,Bazel 可能無法提供太多協助。將冗長的步驟分解為較小的離散目標,Bazel 就能平行執行,進而提升速度。
Bazel 的功能組合有多穩定?
核心功能 (C++、Java 和殼層規則) 在 Google 內部廣泛使用,因此經過徹底測試,變動極少。同樣地,我們每天都會對數十萬個目標測試新版 Bazel,找出迴歸問題,並在每個月多次發布新版本。
簡單來說,除了標示為實驗性質的功能外,Bazel 應該都能正常運作。非實驗規則的變更將回溯相容。如要查看更詳細的功能支援狀態清單,請參閱支援文件。
Bazel 二進位檔的穩定性如何?
在 Google 內部,我們確保 Bazel 很少會當機。開放原始碼程式碼庫也應如此。
如何開始使用 Bazel?
請參閱「開始使用」。
Docker 不是可以解決重現性問題嗎?
使用 Docker,您可以輕鬆建立具有固定 OS 版本的沙箱,例如 Ubuntu 12.04、Fedora 21。這解決了系統環境的可重現性問題,也就是「我需要哪個版本的 /usr/bin/c++?」
Docker 不會處理原始碼變更的重現性。在 Docker 容器中執行 Make 時,即使 Makefile 撰寫不完美,仍可能產生無法預測的結果。
在 Google 內部,我們會將工具簽入原始碼控管系統,確保可重現性。這樣一來,我們就能使用與基礎程式庫變更 (例如「修正 OpenSSL 中的邊界檢查」) 相同的機制,審查工具變更 (例如「將 GCC 升級至 4.6.1」)。
我可以建構二進位檔,以便部署到 Docker 嗎?
您可以使用 Bazel 建構 C/C++ 中靜態連結的獨立二進位檔,以及 Java 中獨立的 JAR 檔案。這些工具在一般 UNIX 系統上執行的依附元件很少,因此應該很容易在 Docker 容器中安裝。
Bazel 具有建構更複雜程式的慣例,例如使用一組資料檔案的 Java 程式,或以子程序形式執行其他程式。您可以將這類環境封裝為獨立封存檔,以便部署至不同系統,包括 Docker 映像檔。
我可以使用 Bazel 建構 Docker 映像檔嗎?
可以,您可以使用我們的 Docker 規則建構可重現的 Docker 映像檔。
Bazel 會自動讓建構作業可重現嗎?
如果是 Java 和 C++ 二進位檔,只要您不變更工具鍊,就可以這麼做。如果您的建構步驟涉及自訂配方 (例如透過規則內的 Shell 指令碼執行二進位檔),則需要特別注意以下事項:
- 請勿使用未聲明的依附元件。沙箱執行 (–spawn_strategy=sandboxed,僅適用於 Linux) 有助於找出未宣告的依附元件。
- 請勿在產生的檔案中儲存時間戳記和使用者 ID。ZIP 檔案和其他封存檔特別容易發生這種情況。
- 避免連上網路。沙箱執行作業也能派上用場。
- 請避免使用隨機數字的程序,特別是許多程式設計語言會隨機進行字典遍歷。
您是否發布過二進位檔?
我使用 Eclipse/IntelliJ/XCode。Bazel 如何與 IDE 互通?
如果是 IntelliJ,請查看 IntelliJ with Bazel 外掛程式。
如要瞭解 XCode,請參閱 Tulsi。
如果是 Eclipse,請查看 E4B 外掛程式。
如要瞭解其他 IDE,請參閱這篇網誌文章,瞭解這些外掛程式的運作方式。
我使用 Jenkins/CircleCI/TravisCI。Bazel 如何與 CI 系統互通?
如果建構或測試叫用失敗,Bazel 會傳回非零的結束代碼,這應該足以進行基本 CI 整合。由於 Bazel 不需要乾淨的建構作業來確保正確性,因此請勿將 CI 系統設定為在開始建構/測試執行前進行清理。
如要進一步瞭解結束代碼,請參閱使用者手冊。
Bazel 未來會推出哪些功能?
請參閱我們的發展藍圖。
我可以在「INSERT LANGUAGE HERE」專案中使用 Bazel 嗎?
Bazel 具有擴充性。任何人都可以新增語言支援。支援多種語言:如需建議清單,請參閱建構百科全書;如需更完整的清單,請參閱 awesomebazel.com。
如要開發擴充功能或瞭解擴充功能的運作方式,請參閱「擴充 Bazel」的說明文件。
我可以為 Bazel 程式碼庫貢獻心力嗎?
請參閱我們的貢獻內容規範。
為什麼不是所有開發作業都公開進行?
我們仍須經常重構 Bazel 中公開程式碼與內部擴充功能之間的介面。因此很難公開進行開發。
您是否已完成 Bazel 開放原始碼作業?
我們正在努力將 Bazel 開放原始碼。我們仍在努力開放下列項目的原始碼:
- 我們有許多單元和整合測試 (應該能讓修補程式的貢獻更容易)。
- 完整的 IDE 整合。
除了程式碼之外,我們最終希望所有程式碼審查、錯誤追蹤和設計決策都能公開進行,並邀請 Bazel 社群參與。我們尚未完成這項工作,因此部分變更會直接出現在 Bazel 存放區,但不會有清楚的說明。儘管缺乏透明度,我們仍希望支援外部開發人員並與他們合作。因此,即使部分開發作業仍在 Google 內部進行,我們仍決定開放程式碼。在轉換為開放式模型期間,如有任何不清楚或不合理的內容,請告訴我們。
Bazel 是否有任何部分永遠不會開放原始碼?
是的,部分程式碼庫會整合 Google 專屬技術,或是我們一直想擺脫的技術 (或兩者兼具)。這些程式碼集部分內容不會在 GitHub 上提供,可能永遠不會。
如何聯絡團隊?
歡迎來信至 bazel-discuss@googlegroups.com。
該到哪裡回報錯誤?
在 GitHub 上開啟問題。
程式碼集中的「Blaze」一詞是什麼意思?
這是工具的內部名稱。請將 Blaze 視為 Bazel。
為什麼其他 Google 專案 (Android、Chrome) 使用其他建構工具?
在第一個 (Alpha) 版本發布前,Bazel 無法對外提供,因此 Chromium 和 Android 等開放原始碼專案無法使用。此外,原本缺乏 Windows 支援,也造成建構 Windows 應用程式 (例如 Chrome) 時發生問題。由於專案已趨於成熟且更加穩定,Android 開放原始碼計畫目前正在遷移至 Bazel。
「Bazel」的發音為何?
與美式英文中的「basil」(羅勒) 相同,發音為「BAY-zel」,與「hazel」押韻。國際音標:/ˈbeɪzˌəl/