Nhóm thực thi tự động (AEG)

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

Các nhóm thực thi tự động chọn một nền tảng thực thi cho mỗi loại chuỗi công cụ. Nói cách khác, một mục tiêu có thể có nhiều nền tảng thực thi mà không cần xác định các nhóm thực thi.

Tóm tắt nhanh

Các nhóm thực thi tự động có mối liên hệ chặt chẽ với chuỗi công cụ. Nếu đang sử dụng chuỗi công cụ, bạn cần đặt các chuỗi công cụ này trên những thao tác chịu ảnh hưởng (những thao tác sử dụng một tệp thực thi hoặc một công cụ trong chuỗi công cụ) bằng cách thêm tham số toolchain. Ví dụ:

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

Nếu thao tác không sử dụng công cụ hoặc tệp thực thi từ một chuỗi công cụ và Blaze không phát hiện thấy điều đó (lỗi sẽ xảy ra), bạn có thể đặt toolchain = None.

Nếu cần sử dụng nhiều chuỗi công cụ trên một nền tảng thực thi duy nhất (một thao tác sử dụng tệp thực thi hoặc công cụ từ 2 chuỗi công cụ trở lên), bạn cần xác định exec_groups theo cách thủ công (hãy xem phần Khi nào tôi nên sử dụng exec_group tuỳ chỉnh?).

Cập nhật trước đây

Trước AEG, nền tảng thực thi được chọn ở cấp quy tắc. Ví dụ:

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

Quy tắc my_rule đăng ký 2 loại chuỗi công cụ. Điều này có nghĩa là Toolchain Resolution (Độ phân giải chuỗi công cụ) được dùng để tìm một nền tảng thực thi hỗ trợ cả hai loại chuỗi công cụ. Nền tảng thực thi đã chọn được dùng cho từng hành động đã đăng ký trong quy tắc, trừ phi được chỉ định khác bằng exec_groups. Nói cách khác, tất cả các thao tác bên trong quy tắc đều từng có một nền tảng thực thi duy nhất, ngay cả khi chúng sử dụng các công cụ từ các chuỗi công cụ khác nhau (nền tảng thực thi được chọn cho từng mục tiêu). Điều này dẫn đến lỗi khi không có nền tảng thực thi nào hỗ trợ tất cả các chuỗi công cụ.

Trạng thái hiện tại

Với AEG, nền tảng thực thi được chọn cho từng loại chuỗi công cụ. Hàm triển khai của ví dụ trước, my_rule, sẽ có dạng như sau:

def _impl(ctx):
    ctx.actions.run(
      mnemonic = "First action",
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      toolchain = '//tools:toolchain_type_1',
    )

    ctx.actions.run(
      mnemonic = "Second action",
      executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
      toolchain = '//tools:toolchain_type_2',
    )

Quy tắc này tạo ra 2 thao tác, First action sử dụng tệp thực thi từ //tools:toolchain_type_1Second action sử dụng tệp thực thi từ //tools:toolchain_type_2. Trước AEG, cả hai thao tác này sẽ được thực thi trên một nền tảng thực thi duy nhất hỗ trợ cả hai loại chuỗi công cụ. Với AEG, bằng cách thêm tham số toolchain vào bên trong các thao tác, mỗi thao tác sẽ thực thi trên nền tảng thực thi cung cấp chuỗi công cụ. Các thao tác có thể được thực thi trên nhiều nền tảng thực thi.

Điều này cũng có hiệu quả với ctx.actions.run_shell, trong đó bạn cần thêm tham số toolchain khi tools đến từ một chuỗi công cụ.

Sự khác biệt giữa nhóm thực thi tuỳ chỉnh và nhóm thực thi tự động

Như tên gọi, AEG là các nhóm thực thi được tạo tự động cho mỗi loại chuỗi công cụ đã đăng ký trên một quy tắc. Bạn không cần chỉ định các nhóm này theo cách thủ công, không giống như các nhóm thực thi "cổ điển". Ngoài ra, tên của AEG sẽ tự động được đặt thành loại chuỗi công cụ của AEG (ví dụ: //tools:toolchain_type_1).

Khi nào tôi nên sử dụng exec_group tuỳ chỉnh?

Bạn chỉ cần exec_groups tuỳ chỉnh trong trường hợp cần nhiều chuỗi công cụ để thực thi trên một nền tảng thực thi duy nhất. Trong tất cả các trường hợp khác, bạn không cần xác định exec_groups tuỳ chỉnh. Ví dụ:

def _impl(ctx):
    ctx.actions.run(
      ...,
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
      exec_group = 'two_toolchains',
    )
my_rule = rule(
    _impl,
    exec_groups = {
        "two_toolchains": exec_group(
            toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
        ),
    }
)

Di chuyển AEG

Trong nội bộ google3, Blaze đã sử dụng AEG. Đối với Bazel bên ngoài, quá trình di chuyển đang diễn ra. Một số quy tắc đã sử dụng tính năng này (ví dụ: quy tắc Java và C++).

Những phiên bản Bazel nào hỗ trợ quy trình di chuyển này?

AEG được hỗ trợ đầy đủ từ Bazel 7.

Cách bật AEG

Đặt --incompatible_auto_exec_groups thành true. Thông tin khác về cờ này trên vấn đề trong GitHub.

Cách bật AEG trong một quy tắc cụ thể?

Đặt thuộc tính _use_auto_exec_groups cho một quy tắc.

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

Thao tác này chỉ bật AEG trong my_rule và các thao tác của AEG bắt đầu sử dụng logic mới khi chọn nền tảng thực thi. Cờ không tương thích sẽ bị ghi đè bằng thuộc tính này.

Làm cách nào để tắt AEG trong trường hợp xảy ra lỗi?

Đặt --incompatible_auto_exec_groups thành false để tắt hoàn toàn AEG trong dự án của bạn (vấn đề về cờ trên GitHub) hoặc tắt một quy tắc cụ thể bằng cách đặt thuộc tính _use_auto_exec_groups thành False (thêm thông tin chi tiết về thuộc tính này).

Thông báo lỗi trong quá trình di chuyển sang AEG

Không xác định được liệu các công cụ có phải là từ các phần phụ thuộc ngầm ẩn hay một chuỗi công cụ hay không. Vui lòng đặt thông số chuỗi công cụ. Nếu bạn không sử dụng chuỗi công cụ, hãy đặt chuỗi công cụ thành "None" (Không có).

  • Trong trường hợp này, bạn sẽ nhận được một ngăn xếp các lệnh gọi trước khi xảy ra lỗi và bạn có thể thấy rõ chính xác thao tác nào cần tham số chuỗi công cụ. Kiểm tra xem chuỗi công cụ nào được dùng cho thao tác và đặt chuỗi công cụ đó bằng tham số chuỗi công cụ. Nếu không có chuỗi công cụ nào được dùng trong thao tác cho các công cụ hoặc tệp thực thi, hãy đặt chuỗi công cụ đó thành None.

Thao tác được khai báo cho chuỗi công cụ không tồn tại "[toolchain_type]".

  • Điều này có nghĩa là bạn đã đặt tham số toolchain cho thao tác nhưng chưa đăng ký tham số đó trên quy tắc. Đăng ký chuỗi công cụ hoặc đặt None bên trong thao tác.

Tài liệu bổ sung

Để biết thêm thông tin, hãy xem tài liệu thiết kế: Automatic exec groups for toolchains (Các nhóm thực thi tự động cho chuỗi công cụ).