常見問題

回報問題 查看來源

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

什麼是 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 就能確切瞭解每個動作的作用。如此一來,您就能享有更多平行處理能力,也能更確實重現問題。
  • 褲子、巴克:這兩個工具都是由 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 會產生確定性的結果。如此一來,就能消除漸進式與簡潔版本、筆記型電腦和 CI 系統之間的偏差。
  • Bazel 可使用相同的工作區,使用相同工具建構不同的用戶端和伺服器應用程式。舉例來說,您可以在單一修訂版本中變更用戶端/伺服器通訊協定,然後測試更新後的行動應用程式是否可與更新後的伺服器搭配使用,以便使用相同工具建構這兩種通訊協定,藉此享受 Bazel 的所有上述優勢。

是否有範例可供參考?

可以。如需較複雜的範例,請參閱簡易範例,或閱讀 Bazel 原始碼

Bazel 在哪個方面最合適?

Bazel 擅長使用下列屬性建構及測試專案:

  • 含有大型程式碼集的專案
  • 以 (多種) 編譯語言編寫的專案
  • 部署在多個平台的專案
  • 獲得廣泛測試的專案

Bazel 在哪裡可執行?

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

只要平台支援 JDK,轉移至其他 UNIX 平台應該相對簡單。

Bazel 不應用於哪些用途?

  • Bazel 試圖聰明執行快取作業,這表示,對於執行不應快取的建構作業而言,這並不安全。舉例來說,下列步驟不應透過 Bazel 執行:
    • 從網際網路擷取資料的編譯步驟。
    • 連結到網站品質確保執行個體的測試步驟。
    • 會變更網站雲端設定的部署步驟。
  • 如果您的建構包含好幾個長的連續步驟,Bazel 可能無法提供許多幫助。如要將較長的步驟拆解成較小、獨立的目標,而 Bazel 可以平行執行,將速度更快。

Bazel 的功能集有多穩定?

核心功能 (C++、Java 和 shell 規則) 在 Google 內部有廣泛使用,因此必須通過全面測試,使用成本也很少。同樣地,我們也會每天在數十萬個目標中測試新版 Bazel 來找出迴歸問題,而且每個月都會多次推出新版本。

簡單來說,除了標示為實驗性功能的功能外,Bazel 應該只工作。非實驗規則的變更將回溯相容。如需詳細的功能支援狀態清單,請參閱支援文件

Bazel 做為二進位檔的穩定程度為何?

Google 內部會確保 Bazel 當機的情況非常罕見。這對開放原始碼集來說也應保留下來。

如何開始使用 Bazel?

請參閱入門指南

Docker 無法解決可重現的問題嗎?

有了 Docker,您可以輕鬆建立具有固定 OS 版本的沙箱,例如 Ubuntu 12.04、Fedora 21。這解決了系統環境的重現問題。也就是「我需要哪個版本的 /usr/bin/c++?」

Docker 無法解決原始碼變更是否可重現問題。如果在 Docker 容器中使用未寫入的 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, only) 有助於找出未宣告的依附元件。
  • 避免將時間戳記和 User-ID 儲存在產生的檔案中。ZIP 檔案和其他封存檔特別容易發生這種情況。
  • 避免連線至網路。沙箱執行作業也能在此派上用場。
  • 避免使用隨機數字的程序,特別是在許多程式設計語言中隨機進行字典週遊的程序。

您有二進位檔版本嗎?

可以。您可以找到最新的發布二進位檔,並詳閱我們的發布政策

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

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

如需 XCode,請查看 Tulsi

針對 Eclipse,請參閱 E4B 外掛程式

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

我使用 Jenkins/CircleCI/TravisCI。Bazel 如何與 CI 系統互通?

如果建構或測試叫用失敗,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 等開放原始碼專案無法使用此工具。此外,最初缺少 Windows 支援會造成建構 Windows 應用程式 (例如 Chrome) 的問題。由於專案已發展成熟且更穩定,Android 開放原始碼專案正處於遷移至 Bazel 的程序。

「Bazel」要如何發音?

效果與英文 (美國) 的「basil」(草本) 相同:「BAY-zel」。Rhymes 字與「hazel」。IPA: /↘benitz,"繼 l/