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

Các nhóm thực thi tự động chọn một nền tảng thực thi cho từng 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 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 kết chặt chẽ với chuỗi công cụ. Nếu bạn đang sử dụng chuỗi công cụ, bạn cần đặt chúng trên các hành động bị ảnh hưởng (các hành động sử dụng tệp thực thi hoặc công cụ từ 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 hành động không sử dụng công cụ hoặc tệp thực thi từ chuỗi công cụ và Blaze không phát hiện thấy (lỗi xuất hiện), bạn có thể đặt toolchain = None.

Nếu bạn 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 hành động sử dụng tệp thực thi hoặc công cụ từ hai hoặc nhiều chuỗi công cụ), bạn cần xác định exec_groups (kiểm tra 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à Chuỗi công cụ Độ phân giải đã sử dụng để tìm một nền tảng thực thi hỗ trợ cả hai loại chuỗi công cụ. Đã chọn nền tảng thực thi được sử dụng cho mỗi hành động đã đăng ký bên trong quy tắc, trừ phi được chỉ định khác với exec_groups. Nói cách khác, tất cả các hành động bên trong quy tắc thường phải có một lần thực thi nền tảng ngay cả khi họ sử dụng 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 thất bại khi không có nền tảng thực thi 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ụ. Chiến lược phát hành đĩa đơn 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 hai thao tác, đó là First action sử dụng tệp thực thi từ một //tools:toolchain_type_1Second action sử dụng tệp thực thi từ một //tools:toolchain_type_2. Trước AEG, cả hai hành động 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 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 hành động này 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 đó toolchain nên thêm tham số khi tools là 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ư cái tên cho thấy, AEG là nhóm giám đốc được tạo tự động cho mỗi nhóm loại chuỗi công cụ đã đăng ký trên một quy tắc. Không cần phải chỉ định chúng theo cách thủ công không giống như "cổ điển" nhóm giám đốc điều hành.

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

Bạn chỉ cần nhóm 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, không cần xác định nhóm_exec_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 các 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 trong quá trình. Một số quy tắc hiện đã 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ợ quá trình di chuyển này?

Các AEG được Bazel 7 hỗ trợ đầy đủ.

Cách bật AEG?

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

Làm cách nào để bật AEG bên trong một quy tắc cụ thể?

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

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

Tính năng này chỉ bật cho AEG trong my_rule và các hành động của AEG sẽ 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 chi tiết 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 để vô hiệu hoá hoàn toàn AEG trong dự án của bạn (vấn đề về 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 (xem thêm thông tin chi tiết về thuộc tính này).

Thông báo lỗi khi di chuyển sang AEG

Không xác định được các công cụ được lấy từ các phần phụ thuộc ngầm ẩn hay chuỗi công cụ. Vui lòng đặt tham số chuỗi công cụ. Nếu bạn hiện không sử dụng chuỗi công cụ, hãy đặt chuỗi công cụ thành "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 lỗi xảy ra và bạn có thể thấy rõ hành động chính xác nào cần tham số chuỗi công cụ. Kiểm tra xem chuỗi công cụ được sử dụng cho hành động và thiết lập bằng tham số chuỗi công cụ. Nếu không chuỗi công cụ được sử dụng bên trong hành động cho các công cụ hoặc tệp thực thi, hãy đặt chuỗi công cụ thành None.

Hành động đượ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ố chuỗi công cụ cho hành động nhưng không đăng ký mã 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ế: Nhóm thực thi tự động cho chuỗi công cụ.