Sử dụng Bazel trên Windows

Báo cáo vấn đề Xem nguồn Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 Bazel trên Windows đượ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 chiều 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 chế độ 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. Nhưng để làm như vậy, bạn cần bật chế độ 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

Một số tính năng yêu cầu Bazel có thể tạo các đường liên kết tượng trưng đến 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 là quản trị viên. Điều này cho phép các tính năng sau:

Để đơn giản hoá, hãy thêm các dòng sau vào tệp bazelrc:

startup --windows_enable_symlinks
build --enable_runfiles

Lưu ý: Việc tạo symlink 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 các đường liên kết tượng trưng của 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/1/2020, không chạy Bazel từ bash – từ shell MSYS2, Git Bash, Cygwin hoặc bất kỳ biến thể Bash nào khác. Mặc dù Bazel có thể hoạt động trong hầu hết các trường hợp sử dụng, nhưng một số thứ bị hỏng, chẳng hạn như làm gián đoạn quá trình 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 để tạo một số quy tắc.

Kể từ Bazel 1.0, bạn có thể tạo 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_binary hoặc sh_test, vì những quy tắc này vốn cần có Bash
  • Quy tắc Starlark sử dụng ctx.actions.run_shell() hoặc ctx.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 tạo 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 phải bazel test mọi thứ.

Bắt đầu từ Bazel 1.0, bạn có thể kiểm thử mọi quy tắc mà không cần Bash, trừ phi:

  • 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 phải bazel run mọi thứ.

Kể từ Bazel 1.0, bạn có thể chạy mọi quy tắc mà không cần Bash, trừ phi:

  • 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à một tập lệnh shell)

Sử dụng các quy tắc shbinary và sh*, cũng như 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ử các quy tắc Starlark sử dụng ctx.actions.run_shell()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ể sẽ có lựa chọn sử dụng Hệ thống con Windows dành cho Linux (WSL) để tạo các quy tắc này, nhưng hiện tại, đây không phải là ưu tiên của nhóm phụ Bazel trên Windows.

Thiết lập 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 của Windows (cmd.exe) chỉ được thiết lập trong phiên dấu 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. Để luôn đặt 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

Tạo C++ bằng MSVC

Để tạo các mục tiêu C++ bằng MSVC, bạn cần:

  • Trình biên dịch Visual C++.

  • (Không bắt buộc) Biến môi trường BAZEL_VCBAZEL_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ể đặ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 BAZEL_VC. Ngoài ra, bạn cũng có thể đặt BAZEL_VC_FULL_VERSION.

    • BAZEL_VC thư mục cài đặt Visual C++ Build Tools

      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, số phiên bản đầy đủ của Visual C++ Build Tools. Bạn có thể chọn chính xác phiên bản Visual C++ Build Tools thông qua BAZEL_VC_FULL_VERSION nế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ở về trước, hãy đặt BAZEL_VC. (BAZEL_VC_FULL_VERSION không được hỗ trợ.)

    • BAZEL_VC thư mục cài đặt Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • Windows SDK.

    Windows SDK chứa các tệp tiêu đề và thư viện bạn cần khi tạo ứng dụng Windows, bao gồm cả Bazel. Theo mặc định, SDK Windows 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 đặt BAZEL_WINSDK_FULL_VERSION. Bạn có thể sử dụng một số SDK Windows 10 đầy đủ, chẳng hạn như 10.0.10240.0, hoặc chỉ định 8.1 để sử dụng SDK Windows 8.1 (chỉ có một phiên bản SDK Windows 8.1). 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ợ trên VC 2017 và 2019. VC 2015 Build Tools độc lập không hỗ trợ việc 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 mọi thứ, bạn có thể tạo một mục tiêu C++ ngay bây giờ!

Hãy thử tạo 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-world
bazel-bin\examples\cpp\hello-world.exe

Theo mặc định, các tệp nhị phân đã tạo nhắm đến cấu trúc x64. Để chỉ định một kiến trúc mục tiêu khác, hãy đặt lựa 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ó lựa chọn * x86: --cpu=x64_x86_windows * ARM: --cpu=x64_arm_windows * ARM64: --cpu=arm64_windows

Ví dụ: để tạo các mục tiêu cho cấu trúc ARM, hãy chạy:

bazel build //examples/cpp:hello-world --cpu=x64_arm_windows

Để tạo 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 của 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.

Tạo C++ bằng Clang

Kể từ phiên bản 0.29.0, Bazel hỗ trợ việc tạo 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ả LLVM và Visual C++ Build Tools, vì mặc dù sử dụng clang-cl.exe làm trình biên dịch, 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 quá trình 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_LLVM thư mục cài đặt LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM

Có một số trường hợp để bật chuỗi công cụ Clang nhằm tạo C++.

  • 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.

  • Với --incompatible_enable_cc_toolchain_resolution: Bạn phải thêm một mục tiêu nền tảng vào BUILD file (ví dụ: tệp BUILD 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 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 WORKSPACE:
    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.

Bản 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:

  • tệp .jar
  • 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ộ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-world
  bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe

Build 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:

  • tệp zip tự giải nén
  • một 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ử tạo 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:bin
  bazel-bin\examples\py_native\bin.exe
  python 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 tạo các mục tiêu Python trên Windows, hãy xem tài liệu thiết kế này.