常見問題

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

什麼是 Bazel?

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

Bazel 有何特別之處?

Bazel 的設計是以 Google 開發軟體的方式為設計目標。此 API 的功能如下:

  • 支援多語言: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 可以明確瞭解各項動作的用途。如此一來,就能更具平行處理能力和更佳的可重現性。
  • 褲子、Buck:這兩項工具都是由前 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 執行下列步驟:
    • 從網際網路擷取資料的編譯步驟。
    • 連線至網站的 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 容器中執行 Makefile 並以不完美寫入的 Makefile 執行 Make 仍可能產生無法預測的結果。

Google 會在原始碼中檢查工具是否可重現。如此一來,我們便能採用與基礎程式庫變更相同的機制 (「修正 OpenSSL 的邊界檢查」) 來檢查工具異動 (「將 GCC 升級至 4.6.1」);

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

使用 Bazel,您可以在 C/C++ 中建構獨立的靜態連結二進位檔,以及適用於 Java 的獨立 jar 檔案。執行這類指令時,一般 UNIX 系統之間只有少數依附元件,因此應可輕鬆安裝在 Docker 容器內。

Bazel 具有用於建構較複雜程式的慣例,例如使用一組資料檔案的 Java 程式,或執行其他程式做為子程序。您可以將這類環境封裝為獨立封存檔,以便部署在不同的系統上,包括 Docker 映像檔。

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

可以,您可以使用 Docker 規則建構可重現的 Docker 映像檔。

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

針對 Java 和 C++ 二進位檔,如果您未變更工具鍊,將會是可以的。如果您的建構步驟涉及自訂方案 (例如透過規則內的殼層指令碼執行二進位檔),請格外留意:

  • 請勿使用未宣告的依附元件。沙箱執行作業 (–spawn_strategy=sandboxed,僅限 Linux) 可協助您找出未宣告的依附元件。
  • 避免將時間戳記和 User-ID 儲存在產生的檔案中。這類檔案特別容易使用 ZIP 檔案和其他封存檔。
  • 避免連線至網路。沙箱執行作業也可以派上用場。
  • 避免使用隨機號碼的程序,尤其是在許多程式設計語言中,字典週遊會隨機進行。

是否有二進位檔版本?

可以。您可以找到最新的版本二進位檔,並查看我們的版本政策

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

如果是 IntelliJ,請參閱 IntelliJ 與 Bazel 外掛程式

如果是 XCode,請查看 Tulsi

如果是 Eclipse,請查看 E4B 外掛程式

如需其他 IDE,請參閱網誌文章,瞭解這些外掛程式的運作方式。

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

如果建構或測試叫用失敗,Bazel 會傳回非零的結束程式碼,而這應該足以進行基本 CI 整合。由於 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 等開放原始碼專案無法使用 Bazel。此外,由於原本缺乏 Windows 支援,在建構 Windows 應用程式 (例如 Chrome) 時會發生這個問題。由於專案已發展成熟,且狀態越穩定,因此 Android 開放原始碼計畫正在進行遷移至 Bazel。

你如何唸出「Bazel」這個發音?

與英文 (美國) 中的「basil」(香蕉) 相同,但名稱相同:「BAY-zel」。其中同樣包含「hazel」的韻音。IPA:/ Pastebe bonusz、ỳ/