常見問題

如有疑問或需要協助,請參閱取得說明

什麼是 Bazel?

Bazel 是一項可自動執行軟體建構和測試的工具。支援的建構工作包括執行編譯器和連結程式以產生執行程式和程式庫,以及為 Android、iOS 和其他目標環境組合可部署套件。Bazel 與製作、Ant、Gradle、Buck、Pants 和 Maven 等其他工具類似。

Bazel 有何特別之處?

Bazel 的設計是為了 Google 開發軟體而設計。其中包含以下功能:

  • 支援多種語言:Bazel 支援多種語言,並可將其擴充至支援任何程式設計語言。
  • 高階建構語言:專案是以 BUILD 語言描述;精簡的文字描述專案是一組小型互連程式庫、二進位檔和測試。相較之下,使用 Make 等工具,您必須描述個別檔案和編譯器叫用。
  • 多平台支援:使用相同的工具和相同的 BUILD 檔案可用於為不同的架構 (甚至是不同的平台) 建構軟體。Google 運用 Bazel 建構各種服務,包括在資料中心系統上執行的伺服器應用程式,以及手機上執行的用戶端應用程式。
  • 可重現性:在 BUILD 檔案中,每個程式庫、測試和二進位檔都必須指定其直接相依關係。Bazel 會根據這項依附元件資訊,瞭解當您變更來源檔案時,必須重新建構哪些工作,以及哪些工作可以同時執行。這表示所有版本都會遞增,並且一定會產生相同的結果。
  • 可擴充規模:Bazel 可處理大型建構作業;在 Google,伺服器二進位檔常有 100,000 個來源檔案,而在未變更任何檔案的情況下,建構大約需要 200 毫秒。

為什麼 Google 不使用...?

  • 製造、忍者:這些工具能夠精確控管系統在建立檔案的指令,但使用者可以自行撰寫正確的規則。
    • 使用者與 Bazel 的互動程度較高。舉例來說,Bazel 內建「Java 測試」、「C++ 二進位檔」規則,以及「目標平台」和「主機平台」等標記。這些規則已經通過檢測,可說是無價的。
  • Ant 和 Maven:Ant 和 Maven 主要針對 Java 而設計,而 Bazel 則處理多種語言。Bazel 建議將程式碼集細分為較小的可重複使用單元,並且只能重建需要重新建構的基地。當使用較大的程式碼集時,這會加快開發速度。
  • Gradle:Bazel 的設定檔比 Gradle 的結構更完整,讓 Bazel 確切瞭解每個動作的用途。這樣不但能提高平行處理能力,也能更好重現。
  • 褲子、巴克:這兩項工具分別由前 Google 員工在 Twitter、Foursquare 和 Facebook 上所建立, 這些模型是在 Bazel 之後建立,但其功能組合不同,所以對我們來說是可行的替代方案。

Bazel 從何而來?

Bazel 是 Google 內部用來建置伺服器軟體的工具。我們也擴展了其他軟體 (例如連線至 Google 伺服器的行動應用程式,例如 iOS、Android) 的開發環境。

您是否重新將內部工具改寫為開放原始碼?這是叉子嗎?

Bazel 將大部分的程式碼提供給內部工具,而這些規則每天用於數百萬個建構作業。

Google 為什麼要建構 Bazel?

很久以前,Google 打造的軟體是由大型的 Makefiles 所建構。這些措施促成了緩慢又不穩定的建構作業,因而開始乾擾開發人員的工作效率和靈活度。Bazel 是用於解決這些問題。

Bazel 需要建構叢集嗎?

根據預設,Bazel 在本機執行建構作業。不過,Bazel 也可以連線至建構叢集,以加快建構與測試的速度。詳情請參閱遠端執行和快取遠端快取說明文件。

Google 開發流程如何運作?

我們針對伺服器程式碼庫採用下列開發工作流程:

  • 我們的伺服器程式碼都位於單一的通用版本控制系統中。
  • 每個人都使用 Bazel 建構軟體。
  • 不同的團隊分別擁有不同的來源樹狀結構,並將元件設為 BUILD 目標。
  • 分支版本主要用於管理版本,因此每個人在開發版本時都會自行開發軟體。

Bazel 是這個理念的基石:由於 Bazel 需要完整指定所有依附元件,因此可以預測哪些變更和測試會影響變更,並在提交前檢查這些程式和測試。

如要進一步瞭解 Google 的開發程序,請參閱 eng Tools 網誌

為什麼要開啟 Bazel?

建構軟體不但有趣又容易, 緩慢且無法預測的建構作業讓程式設計變得有趣。

為什麼要使用 Bazel?

  • Bazel 只會重新編譯需要重新編譯的檔案,因此可以縮短建構時間。同樣地,這樣做也能略過已知未變更的重新執行測試。
  • Bazel 會產生確定性結果。因此可避免逐步增加及清理版本、筆記型電腦和持續整合系統等項目。
  • Bazel 可使用相同工作區中的工具,建構不同的用戶端和伺服器應用程式。舉例來說,您可以在單一修訂版本中變更用戶端/伺服器通訊協定,然後測試更新版行動應用程式是否能與更新後的伺服器搭配運作、以相同工具建構兩者,進而享有 Bazel 的所有上述好處。

可以查看範例嗎?

是;請參閱簡易範例,或參閱 Bazel 原始碼以取得更多複雜的範例。

Bazel 在哪方面?

Bazel 以下列屬性建構及測試專案:

  • 具備大型程式碼集的專案
  • 以多種語言編寫而成的專案
  • 在多個平台上部署的專案
  • 執行大量測試的專案

Bazel 在哪裡執行?

Bazel 在 Linux、macOS (OS X) 和 Windows 上執行。

只要開放 JDK 平台使用,即可將攜碼轉移至其他 UNIX 平台。

不適合使用 Bazel 的原因為何?

  • Bazel 會嘗試聰明處理快取。這表示,對於執行不應輸出輸出內容的建構作業,不行。例如,下列步驟不應從 Bazel 執行:
    • 從網際網路擷取資料的編譯步驟。
    • 連線至網站品質確保執行個體的測試步驟。
    • 變更網站雲端設定的部署步驟。
  • 如果您的建構作業是由幾個連續且連續的步驟進行,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 容器中執行不可能寫入的 Makefile,仍可產生無法預測的結果。

在 Google 中,我們會檢查工具的原始碼,確保其可重現性。因此,我們可以獲得更改工具(“GCC 升級到 4.6.1”)的更改,其機制為基礎庫更改(“修復 Bounds 檢查”)。

我可以建構要在 Docker 上部署的二進位檔嗎?

透過 Bazel,您可以在 C/C++ 中建構獨立的靜態連結二進位檔,以及適用於 Java 的獨立 jar 檔案。這些套件在一般 UNIX 系統上的依附元件不大,因此在 Docker 容器內應該可以輕鬆安裝。

Bazel 有較複雜的程式設定慣例。舉例來說,Java 程式會耗用一組資料檔案,或是執行另一個程式做為子處理。您可以將這類環境包裝為獨立封存檔,以便在不同的系統上進行部署,包括 Docker 映像檔。

我可以使用 Bazel 建構 Docker 映像檔嗎?

可以。您可以使用我們的 Docker 規則來建立可重現的 Docker 映像檔。

Bazel 會讓我的建構作業自動重現嗎?

針對 Java 和 C++ 二進位檔,是,假設您沒有變更工具鍊。如果您的建構步驟涉及自訂方案 (例如透過規則中的殼層指令碼執行二進位檔),您將需要格外謹慎:

  • 請勿使用未宣告的依附元件。採用沙箱機制的執行作業 (–spawn_strategy=sandboxed,僅限 Linux) 可協助您找出未宣告的依附元件。
  • 避免在產生的檔案中儲存時間戳記和使用者 ID。ZIP 檔案和其他封存檔特別容易發生這種狀況。
  • 請避免連線至網路。採用沙箱機制也能助您一臂之力。
  • 避免使用隨機數字的程序,特別是在許多程式設計語言中,字典週遊程序會隨機選取。

您是否有二進位版本?

可以,您可以搜尋最新的版本二進位檔並詳閱我們的發布政策

我使用 Eclipse/IntelliJ/XCode。Bazel 如何與 IDE 互通?

如需 IntelliJ,請參閱 IntelliJ with Bazel 外掛程式

如要瞭解 XCode,請前往 Tulsi

針對 Eclipse,請查看 E4B 外掛程式

如需其他 IDE 的外掛程式,請參閱這篇網誌文章

我使用 Jenkins/CircleCI/TravisCI。Bazel 如何與持續整合系統互通?

如果建構或測試叫用失敗,Bazel 會傳回非零結束代碼,且應足以用於基本的持續整合整合作業。因為 Bazel 不需要簡潔的建構作業來確保準確度,因此在啟動建構/測試執行作業之前,持續整合系統不應設定為清理。

如要進一步瞭解結束代碼,請參閱使用手冊

未來 Bazel 有哪些新功能?

請參閱我們的道路地圖

我可以將 Bazel 用於 INSERT LANGUAGE HERE 專案嗎?

Bazel 可以擴充。任何人都可以新增支援新語言。系統支援多種語言,請參閱建立百科全書以取得建議清單。如需更完整的清單,請前往 awesomebazel.com

如果您想要開發擴充功能或瞭解其運作方式,請參閱擴充 Bazel 的說明文件。

我可以對 Bazel 程式碼集做出貢獻嗎?

請參閱我們的貢獻內容指南

為什麼不是所有開發作業都是開放式的?

我們仍然必須重新計算 Bazel 中的公開程式碼與內部擴充功能之間的介面。這使得開放式的開發作業變得困難。

您是否已完成 Bazel 的採購?

開放原始碼 Bazel 是一項進行中的工作。具體來說,我們仍在努力開發開放資源:

  • 我們許多的單元和整合測試 (應該能夠更輕鬆地提供修補程式)。
  • 完整 IDE 整合。

除了程式碼外,我們也希望能公開所有程式碼審查、錯誤追蹤和設計決策,而且有 Bazel 社群參與。目前還沒有任何變更,因此有些變更只會出現在 Bazel 存放區中,而不清楚說明。雖然缺乏公開透明的資訊,但我們仍希望支持外部開發人員並進行協同合作。因此,雖然有些開發作業仍在 Google 內部, 轉換至開放式模式時,如果發現任何不清楚或欠缺的理由,請通知我們。

部分 Bazel 是否有永遠不會開放原始碼?

是,有些程式碼集已與 Google 特有的技術整合,或者我們正在尋找找能排除 (或兩者混用) 的藉口。這些程式碼集的這些部分無法在 GitHub 上取得,也可能永遠不會出現。

如何與小組聯絡?

請透過 bazel-discuss@googlegroups.com 與我們聯絡。

如何回報錯誤?

GitHub 上提出問題。

程式碼庫中的「Blaze」這個字怎麼了?

這是工具的內部名稱。請將 Bazel 稱為 Bazel。

為什麼其他 Google 專案 (Android、Chrome) 使用其他建構工具?

在第一版 (Alpha 版) 推出之前,Bazel 並未對外開放使用,因此 Chromium 和 Android 等開放原始碼專案無法使用。此外,原本缺少 Windows 支援的是建構 Windows 應用程式 (例如 Chrome) 時發生問題。由於專案已成熟,並且更穩定,Android 開放原始碼計畫目前正在遷移至 Bazel 的階段。

「發音」是怎麼唸的?

與「Basil」(香草) 一樣,英文是「BAY-zel」。這首是合唱「Hazel」的節奏。 IPA:/SYMBOLbezΌ左右 l/