常見問題

回報問題 查看原始碼

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

什麼是 Bazel?

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

Bazel 有什麼特別之處?

Bazel 旨在配合 Google 開發軟體的方式設計,它具有以下功能:

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

為什麼 Google 不使用...?

  • Make、Ninja:這些工具可以精確控制要建構檔案的指令,但使用者可以自行撰寫正確的規則。
    • 使用者與更高的 Bazel 互動。舉例來說,Bazel 內建「Java 測試」、「C++ 二進位檔」等規則以及「目標平台」和「主機平台」等標記。這些規則都經過實證測試,因此具備萬無一失之處。
  • Ant 和 Maven:Ant 和 Maven 主要針對 Java 設計,而 Bazel 則處理多種語言。Bazel 可在較小型的可重複使用單元中細分程式碼集,並且只能重建需要重建的程式碼集。進而在處理較大的程式碼集時加快開發速度。
  • Gradle:Bazel 設定檔的結構比 Gradle 的結構要許多,讓 Bazel 能夠瞭解每個動作的用途。這樣不但可以增加平行處理能力,也更容易重現。
  • 褲子、巴克:這兩款工具分別由前 Google 員工在 Twitter、Fourqua 和 Facebook 所開發及開發。這些模型是在 Bazel 之後建立而成,但其功能集並不相同,因此並非可行的替代方案。

Bazel 的來源為何?

Bazel 是 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 和 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,僅限 Linux) 可協助您找出未宣告的依附元件。
  • 避免將時間戳記和 User-ID 儲存在產生的檔案中。ZIP 檔案和其他封存檔案尤其容易使用。
  • 請避免連線至網路。採用沙箱機制也能助您一臂之力。
  • 避免使用隨機號碼的程序,特別是在許多程式設計語言中,字典週遊會隨機分配。

您是否有二進位版本?

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

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

如想使用 IntelliJ,請參閱 IntelliJ 搭配 Bazel 外掛程式

如需 XCode,請參閱 Tulsi

如要瞭解 Eclipse,請參閱 E4B 外掛程式

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

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

如果建構或測試叫用失敗,Bazel 會傳回非零的結束代碼,因此應足以執行基本的持續整合整合。由於 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」風格