Trang này trình bày các Phương pháp hay nhất để sử dụng Bazel trên Windows. Để biết hướng dẫn cài đặt, hãy xem bài viết Cài đặt Bazel trên Windows.
Vấn đề đã biết
Các vấn đề liên quan đến Windows của Bazel được đánh dấu bằng nhãn "team-Windows" 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:/tmpBật tính năng hỗ trợ tên tệp 8.3
Bazel cố gắng tạo một 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 0Bật tính năng hỗ trợ liên kết tượng trưng
Một số tính năng yêu cầu Bazel có thể tạo các liên kết tượng trưng của tệp trên Windows, bằng cách bật Chế độ 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. Điều này cho phép 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:
startup --windows_enable_symlinksbuild --enable_runfiles
Lưu ý: Việc tạo 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 ra một lượng lớn liên kết tượng trưng của tệp. Chỉ bật tính năng này khi bạn cần.
Chạy Bazel: giao diện dòng lệnh 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 tháng 1 năm 2020, không chạy Bazel từ bash – từ giao diện dòng lệnh MSYS2, hoặc Git Bash, hoặc Cygwin, hoặc bất kỳ biến thể Bash nào khác. Mặc dù Bazel
có thể hoạt động cho hầu hết các trường hợp sử dụng, nhưng một số vấn đề đã bị hỏng, chẳng hạn như
làm gián đoạn bản dựng bằng Ctrl+C từ MSYS2).
Ngoài ra, nếu chọn chạy trong MSYS2, bạn cần tắt tính năng tự động chuyển đổi đường dẫn của MSYS2
, nếu không, MSYS sẽ chuyển đổi các đối số dòng lệnh
có dạng đường dẫn Unix (chẳng hạn như //foo:bar) thành đường dẫn Windows. Hãy xem
câu trả lời này trên 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 thường yêu cầu Bash để xây dựng một số quy tắc.
Kể từ 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ừ phi đó là:
genrule, vì genrules thực thi các lệnh Bash- quy tắc
sh_binaryhoặ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 được 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à tuỳ 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 thường yêu cầu Bash để bazel test bất kỳ nội dung nào.
Kể từ Bazel 1.0, bạn có thể kiểm thử bất kỳ quy tắc nào mà không cần Bash, ngoại 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à một tập lệnh shell)
Sử dụng bazel run mà không cần Bash
Các phiên bản Bazel trước 1.0 thường yêu cầu Bash để bazel run bất kỳ nội dung nào.
Kể từ Bazel 1.0, bạn có thể chạy bất kỳ quy tắc nào mà không cần Bash, ngoại trừ khi:
- bạn sử dụng
--run_underhoặ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à một tập lệnh shell)
Sử dụng quy tắc shbinary và sh*, và ctx.actions.run_shell() mà không cần Bash
Bạn cần Bash để xây dựng và kiểm thử các quy tắc sh_*, cũng như để xây dựng và kiểm thử các quy tắc Starlark
sử dụng ctx.actions.run_shell() và ctx.resolve_command(). Điều 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 trong bất kỳ kho lưu trữ bên ngoài
nào mà dự án của bạn phụ thuộc vào (ngay cả khi chuyển tiếp).
Trong tương lai, có thể có một lựa chọn để sử dụng Hệ thống con Windows dành cho Linux (WSL) để xây dựng các quy tắc này, nhưng hiện tại, đây không phải là ưu tiên cho nhóm phụ trách Bazel trên Windows.
Thiết lập các biến môi trường
Các biến môi trường mà bạn thiết lập trong Dấu nhắc lệnh Windows (cmd.exe) chỉ
được thiết lập trong phiên dấu nhắc lệnh đó. Nếu bạn bắt đầu một cmd.exe mới, bạn cần thiết lập lại các biến. Để luôn thiết lập các biến khi cmd.exe bắt đầu, bạn
có thể thêm các biến đó 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:
(Không bắt buộc) Biến môi trường
BAZEL_VCvà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 bản cài đặt VC cụ thể, bạn có thể thiết lập các biến môi trường sau:
Đối với Visual Studio 2017 và 2019, hãy thiết lập một trong các
BAZEL_VC. Ngoài ra, bạn cũng có thể thiết lậpBAZEL_VC_FULL_VERSION.BAZEL_VCthư mục cài đặt Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VCBAZEL_VC_FULL_VERSION(Không bắt buộc) Chỉ dành cho Visual Studio 2017 và 2019, số phiên bản đầy đủ của Visual C++ Build Tools. Bạn có thể chọn phiên bản Visual C++ Build Tools chính xác thông quaBAZEL_VC_FULL_VERSIONnếu đã cài đặt nhiều phiên bản, nếu không, 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 thiết lập
BAZEL_VC. (BAZEL_VC_FULL_VERSIONkhông được hỗ trợ.)BAZEL_VCthư mục cài đặt Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
Windows SDK chứa các tệp tiêu đề và thư viện mà bạn cần khi xây dựng các ứng dụng Windows, bao gồm cả chính Bazel. Theo mặc định, phiên bản Windows SDK mới nhất đã cài đặt sẽ được sử dụng. Bạn cũng có thể chỉ định phiên bản Windows SDK bằng cách thiết lập
BAZEL_WINSDK_FULL_VERSION. Bạn có thể sử dụng số SDK đầy đủ của Windows 10, chẳng hạn 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 Windows 8.1 SDK). Vui lòng đảm bảo bạn đã cài đặt Windows SDK được chỉ định.Yêu cầu: Tính năng này được hỗ trợ với VC 2017 và 2019. Công cụ xây dựng VC 2015 độc lập không hỗ trợ việc chọn Windows SDK, bạn cần cài đặt đầy đủ Visual Studio 2015, nếu không,
BAZEL_WINSDK_FULL_VERSIONsẽ bị bỏ qua.set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
Nếu mọi thứ đã được thiết lập, bạn có thể xây dựng mục tiêu C++ ngay bây giờ!
Hãy thử xây dựng một mục tiêu từ một trong các dự án mẫu của chúng tôi:
bazel build //examples/cpp:hello-worldbazel-bin\examples\cpp\hello-world.exe
Theo mặc định, các tệp nhị phân đã xây dựng nhắm đến kiến trúc x64. Để chỉ định một kiến trúc mục tiêu khác, hãy thiết lập tuỳ chọn bản dựng --cpu cho kiến 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* ARM: --cpu=x64_arm_windows* ARM64: --cpu=arm64_windows
Ví dụ: để xây dựng 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 ví dụ này.
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 Windows,
hãy bật tính năng tệp tham số trình biên dịch thông qua --features=compiler_param_file.
Xây dựng C++ bằng Clang
Kể từ phiên bản 0.29.0, Bazel hỗ trợ xây 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: Để xây dựng bằng Clang, bạn phải cài đặt cả
LLVM và Visual C++ Build Tools,
vì mặc dù bạn sử dụng clang-cl.exe làm trình biên dịch, nhưng bạn vẫn cần liên kết với
các thư viện Visual C++.
Bazel có thể tự động phát hiện bản cài đặt LLVM trên hệ thống của bạn hoặc bạn có thể cho
Bazel biết rõ ràng vị trí cài đặt LLVM bằng BAZEL_LLVM.
BAZEL_LLVMthư mục cài đặt LLVMset BAZEL_LLVM=C:\Program Files\LLVM
Để bật chuỗi công cụ Clang để xây dựng C++, có một số trường hợp.
Trong bazel 0.28 trở xuống: Không hỗ trợ Clang.
Không có
--incompatible_enable_cc_toolchain_resolution: Bạn có thể bật chuỗi công cụ Clang bằng cờ bản dựng--compiler=clang-cl.Có
--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ệpBUILDcấ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 hai 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
WORKSPACEcủa bạn:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )Cờ --incompatible_enable_cc_toolchain_resolution dự kiến 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
Để xây dựng các mục tiêu Java, bạn cần:
Trên Windows, Bazel xây dựng hai tệp đầu ra cho các quy tắc java_binary:
- một
.jartệp - tệp
.execó thể thiết lập môi trường cho JVM và chạy tệp nhị phân
Hãy thử xây dựng một mục tiêu từ một trong các dự án mẫu của chúng tôi:
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-worldbazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
Xây dựng Python
Để xây dựng các mục tiêu Python, bạn cần:
- Trình thông dịch Python
Trên Windows, Bazel xây dựng hai tệp đầu ra cho các quy tắc py_binary:
- tệp zip tự giải nén
- tệp thực thi có thể khởi chạy trình thông dịch Python bằng tệp zip tự giải nén làm đối số
Bạn có thể chạy tệp thực thi (có đuôi .exe) hoặc chạy
Python với tệp zip tự giải nén làm đối số.
Hãy thử xây dựng một mục tiêu từ một trong các dự án mẫu của chúng tôi:
bazel build //examples/py_native:binbazel-bin\examples\py_native\bin.exepython bazel-bin\examples\py_native\bin.zip
Nếu bạn quan tâm đến thông tin chi tiết về cách Bazel xây dựng các mục tiêu Python trên Windows, hãy xem tài liệu thiết kế này.