本頁說明在 Windows 上使用 Bazel 的最佳做法。安裝 如需操作說明,請參閱在 Windows 上安裝 Bazel。
已知問題
與 Windows 相關的 Bazel 問題會標有「team-Windows」 標籤。你可以在這裡查看待解決的問題。
最佳做法
避免長路徑問題
在 Windows 上,部分工具設有路徑長度上限限制,包括 MSVC 編譯器。 如要避免發生此問題,您可以使用 --output_user_root 標記指定 Bazel 的簡短輸出目錄。
例如,在 bazelrc 檔案中新增以下這行程式碼:
startup --output_user_root=C:/tmp
支援 8.3 檔案名稱
Bazel 會嘗試為長檔案路徑建立簡稱版本。但如要這麼做,您必須為包含長路徑的磁碟區啟用 8.3 檔案名稱支援。您可以執行下列指令,在所有磁碟區中啟用 8.3 名稱建立功能:
fsutil 8dot3name set 0
啟用符號連結支援
某些功能需要 Bazel 才能在 Windows 上建立檔案符號連結, 其中一種方式 開發人員模式 (Windows 10 1703 以上版本),或以管理員的身分執行 Bazel。 進而啟用下列功能:
為了方便起見,請在 bazelrc 檔案中加入以下這幾行程式碼:
startup --windows_enable_symlinks
build --enable_runfiles
注意:在 Windows 中建立符號連結的作業費用相當高昂。--enable_runfiles
旗標可能會建立大量檔案符號連結。因此,請只在需要時才啟用這項功能。
執行 Bazel:MSYS2 殼層、命令提示字元與 PowerShell
建議:透過命令提示字元 (cmd.exe
) 或從下列位置執行 Bazel
PowerShell.
從 2020 年 1 月 15 日開始,「請勿」從 bash
執行 Bazel,因為
例如 MSYS2 Shell、Git Bash、Cygwin 或任何其他 Bash 變化版本雖然 Bazel
可能適用於大多數用途,有些功能已無法運作,
透過 MSYS2 按下 Ctrl+C 中斷建構)。
此外,如果您選擇在 MSYS2 下執行,則需停用 MSYS2 的
自動轉換路徑,否則 MSYS 會轉換指令列引數
格式看起來為 Windows 路徑的 Unix 路徑 (例如 //foo:bar
)。詳情請見
這個 StackOverflow 的答案
。
在不使用 Bash 的情況下使用 Bazel (MSYS2)
在不使用 Bash 的情況下使用 bazel 建構
1.0 以下版本的 Bazel 會要求 Bash 建構一些規則。
從 Bazel 1.0 開始,您可以在不採用 Bash 的情況下建構任何規則,但下列情況除外:
genrule
,因為 Genrules 會執行 Bash 指令sh_binary
或sh_test
規則,因為它們本來就需要 Bash- 使用
ctx.actions.run_shell()
或ctx.resolve_command()
的 Starlark 規則
不過,genrule
通常用於簡單的工作,例如
複製檔案
或撰寫文字檔。
您可能需要使用 genrule
(且取決於 Bash) 做為合適的規則
的
bazel-skylib 存放區。
在 Windows 上建構時,這些規則不需使用 Bash。
在不使用 Bash 的情況下使用 bazel 測試
1.0 以下版本的 Bazel 會要求 Bash 執行 bazel test
。
從 Bazel 1.0 開始,您可以測試任何用不到 Bash 的規則,但下列情況除外:
- 您使用了「
--run_under
」 - 測試規則本身需要 Bash (因為其執行檔是殼層指令碼)
在不使用 Bash 的情況下使用 bazel 跑步
1.0 以下版本的 Bazel 會要求 Bash 執行 bazel run
。
從 Bazel 1.0 開始,您就可以在不使用 Bash 的情況下執行任何規則,但下列情況除外:
- 您使用
--run_under
或--script_path
- 測試規則本身需要 Bash (因為其執行檔是殼層指令碼)
使用粗二進位和 sh* 規則,以及 ctx.actions.run_shell() 不包含 Bash
您需要 Bash 建立及測試 sh_*
規則,以及建構與測試 Starlark
使用 ctx.actions.run_shell()
和 ctx.resolve_command()
的規則這個
不僅適用您專案中的規則,另外也適用
專案依附的存放區
未來也許您可以選擇將 Windows 子系統用於 Linux (WSL) 會建立這些規則,但目前並非 Windows 上的 Bazel-on-Windows 子團隊
設定環境變數
您在 Windows 命令提示字元 (cmd.exe
) 中設定的環境變數僅為
您在命令提示字元工作階段中設定的名稱如要建立新的 cmd.exe
,請
請再次設定變數。如要一律在 cmd.exe
啟動時設定變數,您必須
可將其加入 Control Panel >
System Properties > Advanced > Environment Variables...
對話方塊中的使用者變數或系統變數。
在 Windows 上進行建構
使用 MSVC 建構 C++
如要使用 MSVC 建構 C++ 目標,您需要:
(選用)
BAZEL_VC
和BAZEL_VC_FULL_VERSION
環境變數。Bazel 會在系統中自動偵測 Visual C++ 編譯器。 如要指示 Bazel 使用特定 VC 安裝,可以在 下列環境變數:
如果是 Visual Studio 2017 和 2019,請設定
BAZEL_VC
其中一個。此外,您也可以設定BAZEL_VC_FULL_VERSION
。BAZEL_VC
Visual C++ Build Tools 安裝目錄set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
BAZEL_VC_FULL_VERSION
(選用) 僅適用於 Visual Studio 2017 和 2019,完整版本 Visual C++ 建構工具的數量。您可以選擇確切的 Visual C++ 建構工具 如果安裝多個版本,則會透過BAZEL_VC_FULL_VERSION
提交多個版本,否則將 Bazel 就會選擇最新版本set BAZEL_VC_FULL_VERSION=14.16.27023
如果是 Visual Studio 2015 以下版本,請設定
BAZEL_VC
。(系統不支援BAZEL_VC_FULL_VERSION
)。BAZEL_VC
Visual C++ Build Tools 安裝目錄set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
Windows SDK 包含建構時所需的標頭檔案和程式庫 Windows 應用程式,包括 Bazel 本身。根據預設,最新安裝的 Windows SDK 。您也可以設定
BAZEL_WINSDK_FULL_VERSION
來指定 Windows SDK 版本。個人中心 可以使用完整的 Windows 10 SDK 號碼 (例如 10.0.10240.0),或指定 8.1 以使用 Windows 8.1 SDK (只提供一個版本的 Windows 8.1 SDK)。請確定您已在 已安裝 Windows SDK。需求條件:支援 VC 2017 和 2019。獨立的 VC 2015 建構工具沒有 支援選取 Windows SDK, 則需要完整的 Visual Studio 2015 安裝。 系統會忽略
BAZEL_WINSDK_FULL_VERSION
。set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
如果一切都準備就緒,您可以立即建構 C++ 目標!
請嘗試使用其中一個範例建立目標 專案:
bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe
根據預設,建構的二進位檔會指定 x64 架構。如果要指定不同的
目標架構,請為目標架構設定 --cpu
建構選項:
* x64 (預設):--cpu=x64_windows
或否
* x86:--cpu=x64_x86_windows
* ARM:--cpu=x64_arm_windows
* ARM64:--cpu=arm64_windows
舉例來說,如要為 ARM 架構建構目標,請執行:
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
如要建構及使用動態連結程式庫 (DLL 檔案),請參閱此 範例。
指令列長度限制:避免
Windows 指令列長度限制問題
透過 --features=compiler_param_file
啟用編譯器參數檔案功能。
使用 Clang 建構 C++
自 0.29.0 起,Bazel 支援使用 LLVM 相容的編譯器驅動程式 (clang-cl.exe
) 進行建構。
需求條件:如要使用 Clang 建構,您必須同時安裝
LLVM 和 Visual C++ 建構工具
因為儘管您使用 clang-cl.exe
做為編譯器,您仍然需要連結至
Visual C++ 程式庫。
Bazel 可以自動偵測系統中安裝的 LLVM,或者您也可以明確地
由 BAZEL_LLVM
安裝 LLVM 的 Bazel。
BAZEL_LLVM
:LLVM 安裝目錄set BAZEL_LLVM=C:\Program Files\LLVM
如要在建構 C++ 時啟用 Clang 工具鍊,有幾個情況。
在 bazel 0.28 以下版本:不支援 Clang。
沒有
--incompatible_enable_cc_toolchain_resolution
: 您可以藉由建構標記--compiler=clang-cl
啟用 Clang 工具鍊。透過
--incompatible_enable_cc_toolchain_resolution
: 您必須在BUILD file
中新增平台目標 (例如頂層BUILD
檔案):platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )
接著,您可以透過下列其中一種方式啟用 Clang 工具鍊:
- 指定下列建構標記:
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
- 在
WORKSPACE
檔案中註冊平台和工具鍊:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
--incompatible_enable_cc_toolchain_resolution 計劃在未來的 Bazel 版本中預設啟用。因此 建議您使用第二種方法啟用 Clang 支援功能。
建構 Java
如要建構 Java 目標,您需要:
在 Windows 中,Bazel 會為 java_binary
規則建構兩個輸出檔案:
- 1
.jar
檔案 .exe
檔案,可用來設定 JVM 環境並執行二進位檔
請嘗試使用其中一個範例建立目標 專案:
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
建構 Python
如要建構 Python 目標,您需要:
在 Windows 中,Bazel 會為 py_binary
規則建構兩個輸出檔案:
- 自我解壓縮 ZIP 檔案
- 可透過 自行解壓縮 ZIP 檔案做為引數
您可以執行執行檔 (副檔名為 .exe
),也可以執行
使用自行解壓縮 ZIP 檔案做為引數的 Python 程式碼。
請嘗試使用其中一個範例建立目標 專案:
bazel build //examples/py_native:bin
bazel-bin\examples\py_native\bin.exe
python bazel-bin\examples\py_native\bin.zip
如要進一步瞭解 Bazel 如何利用 Windows,不妨看看這項設計 文件。