Trang này giới thiệu các phương pháp hay nhất để sử dụng Bazel trên Windows. Để lắp đặt hãy xem hướng dẫn trong bài viết Cài đặt Bazel trên Windows.
Vấn đề đã biết
Các vấn đề về Bazel liên quan đến Windows được đánh dấu bằng "Windows-Windows" nhãn trên GitHub. Bạn có thể xem các vấn đề chưa được giải quyết tại đây.
Các phương pháp hay nhất
Tránh các vấn đề về đường dẫn dài
Một số công cụ có Giới hạn độ dài đường dẫn tối đa trên Windows, bao gồm cả trình biên dịch MSVC. Để tránh gặp phải vấn đề này, bạn có thể chỉ định một thư mục đầu ra ngắn cho Bazel bằng cờ --output_user_root.
Ví dụ: thêm dòng sau vào tệp bazelrc:
startup --output_user_root=C:/tmp
Bật tính năng hỗ trợ tên tệp 8.3
Bazel cố gắng tạo phiên bản tên ngắn cho các đường dẫn tệp dài. Tuy nhiên, để làm như vậy, bạn cần bật tính năng hỗ trợ tên tệp 8.3 cho ổ đĩa chứa tệp có đường dẫn dài. Bạn có thể bật tính năng tạo tên 8.3 trong tất cả các ổ đĩa bằng cách chạy lệnh sau:
fsutil 8dot3name set 0
Bật tính năng hỗ trợ đường liên kết tượng trưng
Một số tính năng yêu cầu Bazel có thể tạo đường liên kết tượng trưng cho tệp trên Windows, bằng cách bật Chế độ dành cho nhà phát triển (trên Windows 10 phiên bản 1703 trở lên) hoặc bằng cách chạy Bazel với tư cách quản trị viên. Thao tác này sẽ bật các tính năng sau:
Để dễ dàng hơn, hãy thêm các dòng sau vào tệp bazelrc của bạn:
startup --windows_enable_symlinks
build --enable_runfiles
Lưu ý: Việc tạo đường liên kết tượng trưng trên Windows là một thao tác tốn kém. Cờ --enable_runfiles
có thể tạo một số lượng lớn các đường liên kết tượng trưng đến tệp. Bạn chỉ nên bật tính năng này khi cần.
Chạy Bazel: shell MSYS2 so với dấu nhắc lệnh so với PowerShell
Đề xuất: Chạy Bazel từ dấu nhắc lệnh (cmd.exe
) hoặc từ
PowerShell.
Kể từ ngày 15/01/2020, không chạy Bazel từ bash
–
từ MSYS2 shell, Git Bash hoặc Cygwin hoặc bất kỳ biến thể Bash nào khác. Trong khi Bazel
có thể hoạt động trong hầu hết các trường hợp sử dụng, một số tính năng bị hỏng như
làm gián đoạn bản dựng bằng tổ hợp phím Ctrl+C trong MSYS2).
Ngoài ra, nếu chọn chạy trong MSYS2, bạn cần vô hiệu hoá
tự động chuyển đổi đường dẫn, nếu không MSYS sẽ chuyển đổi các đối số dòng lệnh
giống như đường dẫn Unix (chẳng hạn như //foo:bar
) vào đường dẫn Windows. Xem
câu trả lời này của StackOverflow
để biết thông tin chi tiết.
Sử dụng Bazel mà không cần Bash (MSYS2)
Sử dụng bản dựng bazel mà không cần Bash
Các phiên bản Bazel trước 1.0 từng yêu cầu Bash xây dựng một số quy tắc.
Bắt đầu với Bazel 1.0, bạn có thể xây dựng bất kỳ quy tắc nào mà không cần Bash trừ khi đó là:
genrule
vì quy tắc genrules thực thi các lệnh Bash- Quy tắc
sh_binary
hoặcsh_test
vì các quy tắc này vốn cần Bash - Quy tắc Starlark sử dụng
ctx.actions.run_shell()
hoặcctx.resolve_command()
Tuy nhiên, genrule
thường dùng cho các tác vụ đơn giản như
sao chép tệp
hoặc ghi tệp văn bản.
Thay vì sử dụng genrule
(và phụ thuộc vào Bash), bạn có thể tìm thấy một quy tắc phù hợp
trong
kho lưu trữbazel-skylib.
Khi được xây dựng trên Windows, các quy tắc này không yêu cầu Bash.
Sử dụng kiểm thử bazel mà không cần Bash
Các phiên bản Bazel trước 1.0 từng yêu cầu Bash phải bazel test
bất kỳ.
Bắt đầu với Bazel 1.0, bạn có thể kiểm thử bất kỳ quy tắc nào mà không cần Bash, trừ khi:
- bạn sử dụng
--run_under
- bản thân quy tắc kiểm thử yêu cầu Bash (vì tệp thực thi của quy tắc này là tập lệnh shell)
Sử dụng tính năng chạy bazel mà không cần Bash
Các phiên bản Bazel trước 1.0 từng yêu cầu Bash phải bazel run
bất kỳ.
Bắt đầu với Bazel 1.0, bạn có thể chạy bất kỳ quy tắc nào mà không cần Bash, trừ khi:
- bạn sử dụng
--run_under
hoặc--script_path
- bản thân quy tắc kiểm thử yêu cầu Bash (vì tệp thực thi của quy tắc này là tập lệnh shell)
Sử dụng các quy tắc nhị phân và sh* và ctx.actions.run_shell() mà không có Bash
Bạn cần Bash để tạo và kiểm thử các quy tắc sh_*
, cũng như để tạo và kiểm thử Starlark
các quy tắc sử dụng ctx.actions.run_shell()
và ctx.resolve_command()
. Chiến dịch này
không chỉ áp dụng cho các quy tắc trong dự án của bạn mà còn áp dụng cho các quy tắc thuộc bất kỳ
mà dự án của bạn phụ thuộc vào (thậm chí là bắc cầu).
Trong tương lai, bạn có thể chọn sử dụng Hệ thống phụ của Windows để Linux (WSL) để xây dựng các quy tắc này, nhưng hiện tại nó không phải là một ưu tiên nhóm phụ Bazel-on-Windows.
Thiết lập biến môi trường
Các biến môi trường mà bạn đặt trong Windows Command Prompt (cmd.exe
) chỉ
được thiết lập trong phiên nhắc lệnh đó. Nếu bắt đầu một cmd.exe
mới, bạn cần
đặt lại các biến này. Để luôn đặt các biến khi cmd.exe
bắt đầu, bạn
có thể thêm chúng vào Biến người dùng hoặc Biến hệ thống trong hộp thoại Control Panel >
System Properties > Advanced > Environment Variables...
.
Xây dựng trên Windows
Xây dựng C++ bằng MSVC
Để xây dựng các mục tiêu C++ bằng MSVC, bạn cần có:
(Không bắt buộc) Biến môi trường
BAZEL_VC
vàBAZEL_VC_FULL_VERSION
.Bazel tự động phát hiện trình biên dịch Visual C++ trên hệ thống của bạn. Để yêu cầu Bazel sử dụng một chế độ cài đặt VC cụ thể, bạn có thể đặt các biến môi trường sau:
Đối với Visual Studio 2017 và 2019, hãy đặt một trong các giá trị
BAZEL_VC
. Ngoài ra, bạn cũng có thể đặtBAZEL_VC_FULL_VERSION
.BAZEL_VC
thư mục cài đặt Công cụ xây dựng Visual C++set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
BAZEL_VC_FULL_VERSION
(Không bắt buộc) Chỉ dành cho Visual Studio 2017 và 2019 (phiên bản đầy đủ) số lượng Công cụ xây dựng Visual C++ của bạn. Bạn có thể chọn Công cụ tạo Visual C++ chính xác phiên bản thông quaBAZEL_VC_FULL_VERSION
nếu có nhiều phiên bản được cài đặt, nếu không thì Bazel sẽ chọn phiên bản mới nhất.set BAZEL_VC_FULL_VERSION=14.16.27023
Đối với Visual Studio 2015 trở xuống, hãy đặt
BAZEL_VC
. (BAZEL_VC_FULL_VERSION
không được hỗ trợ.)BAZEL_VC
thư mục cài đặt Công cụ xây dựng Visual C++set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
Hệ thống Windows SDK.
SDK Windows chứa các tệp tiêu đề và thư viện mà bạn cần khi tạo bản dựng Các ứng dụng Windows, bao gồm cả Bazel. Theo mặc định, SDK Windows mới nhất được cài đặt sẽ để sử dụng. Bạn cũng có thể chỉ định phiên bản SDK Windows bằng cách đặt
BAZEL_WINSDK_FULL_VERSION
. Bạn có thể sử dụng số SDK Windows 10 đầy đủ như 10.0.10240.0 hoặc chỉ định 8.1 để sử dụng Windows 8.1 SDK (chỉ có một phiên bản SDK Windows 8.1). Vui lòng đảm bảo bạn đã chỉ định Đã cài đặt SDK Windows.Yêu cầu: Đây là yêu cầu được hỗ trợ trong VC 2017 và 2019. Công cụ xây dựng VC 2015 độc lập không hỗ trợ chọn Windows SDK, bạn sẽ cần cài đặt Visual Studio 2015 đầy đủ, nếu không
BAZEL_WINSDK_FULL_VERSION
sẽ bị bỏ qua.set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
Nếu đã thiết lập xong, bạn có thể tạo đích C++ ngay bây giờ!
Hãy thử tạo mục tiêu từ một trong các mẫu của chúng tôi dự án:
bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe
Theo mặc định, các tệp nhị phân đã tạo nhắm đến kiến trúc x64. Để chỉ định một
cấu trúc mục tiêu, hãy đặt tuỳ chọn bản dựng --cpu
cho cấu trúc mục tiêu của bạn:
* x64 (mặc định): --cpu=x64_windows
hoặc không có tuỳ chọn
* x86: --cpu=x64_x86_windows
* CÁNH TAY: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
Ví dụ: để tạo các mục tiêu cho kiến trúc ARM, hãy chạy:
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
Để xây dựng và sử dụng Thư viện được liên kết động (tệp DLL), hãy xem nội dung này ví dụ.
Giới hạn độ dài dòng lệnh: Để ngăn
Vấn đề về giới hạn độ dài dòng lệnh của Windows,
bật tính năng tệp thông số trình biên dịch thông qua --features=compiler_param_file
.
Xây dựng C++ bằng Clang
Từ 0.29.0, Bazel hỗ trợ bản dựng bằng trình điều khiển trình biên dịch tương thích với MSVC của LLVM (clang-cl.exe
).
Yêu cầu: Để tạo bằng Clang, bạn phải cài đặt cả hai
LLVM và công cụ tạo Visual C++,
vì mặc dù bạn sử dụng clang-cl.exe
làm trình biên dịch, bạn vẫn cần liên kết đến
Thư viện Visual C++.
Bazel có thể tự động phát hiện cài đặt LLVM trên hệ thống của bạn, hoặc bạn có thể nói một cách rõ ràng
Bazel nơi LLVM được BAZEL_LLVM
cài đặt.
BAZEL_LLVM
thư mục cài đặt LLVMset BAZEL_LLVM=C:\Program Files\LLVM
Có một số trường hợp để bật chuỗi công cụ Clang nhằm xây dựng C++.
Trong bazel 0.28 trở xuống: Clang không được hỗ trợ.
Nếu không có
--incompatible_enable_cc_toolchain_resolution
: Bạn có thể bật chuỗi công cụ Clang bằng một cờ bản dựng--compiler=clang-cl
.Với
--incompatible_enable_cc_toolchain_resolution
: Bạn phải thêm mục tiêu nền tảng vàoBUILD file
(ví dụ: tệpBUILD
cấp cao nhất):platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )
Sau đó, bạn có thể bật chuỗi công cụ Clang bằng một trong 2 cách sau:
- Chỉ định các cờ bản dựng sau:
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
- Đăng ký nền tảng và chuỗi công cụ trong tệp
WORKSPACE
của bạn:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
Tham số --incompatible_enable_cc_toolchain_resolution cờ theo kế hoạch sẽ được bật theo mặc định trong bản phát hành Bazel trong tương lai. Do đó, bạn nên bật tính năng hỗ trợ Clang bằng phương pháp thứ hai.
Xây dựng Java
Để tạo các mục tiêu Java, bạn cần:
Trên Windows, Bazel tạo 2 tệp đầu ra cho các quy tắc java_binary
:
- một tệp
.jar
- một tệp
.exe
có thể thiết lập môi trường cho JVM và chạy tệp nhị phân
Hãy thử tạo mục tiêu từ một trong các mẫu của chúng tôi dự án:
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
Xây dựng Python
Để tạo các mục tiêu Python, bạn cần:
Trên Windows, Bazel tạo 2 tệp đầu ra cho các quy tắc py_binary
:
- một tệp zip tự trích xuất
- một tệp thực thi có thể chạy trình thông dịch Python bằng tự trích xuất tệp zip làm đối số
Bạn có thể chạy tệp thực thi (tệp này có đuôi .exe
) hoặc bạn có thể chạy
Python với đối số là tệp zip tự trích xuất.
Hãy thử tạo mục tiêu từ một trong các mẫu của chúng tôi dự án:
bazel build //examples/py_native:bin
bazel-bin\examples\py_native\bin.exe
python bazel-bin\examples\py_native\bin.zip
Nếu bạn muốn biết thông tin chi tiết về cách Bazel xây dựng các mục tiêu Python dựa trên Windows, hãy xem thiết kế này tài liệu.