Sử dụng Bazel trên Windows

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo vấn đề Xem nguồn

Trang này trình bày các phương pháp hay nhất để sử dụng Bazel trên Windows. Để xem 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 Bazel được đánh dấu bằng nhãn "team-Windows" trên GitHub. Bạn có thể xem các vấn đề đang mở tại đây.

Các phương pháp hay nhất

Tránh các sự cố 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 của bạn:

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 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 hỗ trợ tên tệp 8.3 cho ổ đĩa chứa tệp đườ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 phải tạo các đường liên kết tượng trưng cho 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. 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 đường liên kết tượng trưng cho 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 lời nhắc lệnh so với PowerShell

Đề xuất: Chạy Bazel từ lời nhắc lệnh (cmd.exe) hoặc từ PowerShell.

Kể từ ngày 15/01/2020, không chạy Bazel trên bash – từ vỏ 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ố trường hợp bị lỗi, chẳng hạn như làm gián đoạn bản dựng bằng Ctrl+C trong 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 giống như đườ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 Stackoverflow này để biết thông tin chi tiết.

Sử dụng Bazel mà không cần Bash (MSYS2)

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ể tạo bất kỳ quy tắc nào mà không cần Bash trừ khi đó là:

  • genrule, vì genrule thực thi các lệnh Bash
  • Quy tắc sh_binary hoặc sh_test vì những yếu tố 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 những thao tác đơn giản như sao chép tệp hoặc viết 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 một quy tắc phù hợp trong kho lưu trữ thư viện bazel-skylib. Khi được tạo trên Windows, các quy tắc này không yêu cầu Bash.

Dùng tham số 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 đối với bazel test bất kỳ thứ gì.

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, 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ì có thể thực thi tập lệnh shell)

Dùng kiểu 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 đối với bazel run bất kỳ thứ gì.

Kể từ Bazel 1.0, bạn có thể chạy mọi quy tắc 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ì có thể thực thi tập lệnh shell)

Sử dụng các quy tắc shbinary và sh* và ctx.actions.run_shell() không có Bash

Bạn cần Bash để tạo và kiểm thử 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 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 (ngay cả khi bắc cầu).

Trong tương lai, có thể có một tuỳ 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, nhóm phụ Bazel-on-Windows không được ưu tiên.

Đặt biến môi trường

Biến môi trường mà bạn đặt trong Dấu nhắc lệnh Windows (cmd.exe) chỉ được đặt trong phiên lời nhắc lệnh đó. Nếu bắt đầu một cmd.exe mới, bạn sẽ cần phải đặ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

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:

  • 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 sẽ 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 BAZEL_VC. Ngoài ra, bạn cũng có thể đặt BAZEL_VC_FULL_VERSION.

    • BAZEL_VC thư mục cài đặt Công cụ xây dựng C++ của Visual

      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 Công cụ xây dựng Visual C++ của bạn. Bạn có thể chọn đúng phiên bản Visual C++ Build Tools (Công cụ tạo bản dựng C++) thông qua BAZEL_VC_FULL_VERSION nếu có nhiều phiên bản được cài đặt, 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 đặ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 C++ của Visual

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

    SDK Windows chứa các tệp tiêu đề và thư viện mà bạn cần khi xây dựng ứng dụng Windows, bao gồm cả chính Bazel. Theo mặc định, SDK Windows mới nhất được cài đặt sẽ được 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 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 SDK Windows đã chỉ định.

    Yêu cầu: Việc 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ợ chọn SDK Windows, 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 bạn đã thiết lập xong, 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ụ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 được tạo sẽ nhắm mục tiêu đến cấu trúc x64. Để chỉ định một cấu trúc mục tiêu khác, hãy đặt tuỳ chọn bản dựng --cpu cho cấu trúc mục tiêu đó: * 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 cấu 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 liên kết động (DLL file), hãy xem ví dụ này.

Giới hạn độ dài dòng lệnh: Để ngăn ngừa vấn đề về giới hạn độ dài dòng lệnh, hãy bật tính năng tệp tham số của 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ợ tạo bằng trình điều khiển biên dịch tương thích với VCVM 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ả công cụ Xây dựng LLVM và C++ trực quan, 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 đến các thư viện Visual C++.

Bazel có thể tự động phát hiện hoạt động cài đặt LLVM trên hệ thống của bạn hoặc bạn có thể thông báo rõ ràng cho Bazel về nơi BAZEL_LLVM cài đặt LLVM.

  • BAZEL_LLVM thư mục cài đặt LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Để bật chuỗi công cụ Clang nhằm xây dựng C++, có một số trường hợp.

  • Trong bazel 0.28 trở lên: 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 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à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ờ bản dựng sau đây:
    --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 được lên kế hoạch bật theo mặc định trong bản phát hành Bazel trong tương lai. Do đó, bạn nên 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 tạo hai 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ử xây dựng 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

Tạo Python

Để xây dựng các mục tiêu Python, bạn cần:

Trên Windows, Bazel tạo hai tệp đầu ra cho các quy tắc py_binary:

  • tệp zip tự trích xuất
  • một tệp thực thi có thể khởi chạy trình thông dịch Python với tệp zip tự trích xuất 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 tệp zip tự trích xuất làm đối số.

Hãy thử xây dựng 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 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 trên Windows, hãy xem tài liệu thiết kế này.