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

Các nhóm thực thi tự động sẽ 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 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 liên kết chặt chẽ với các chuỗi công cụ. Nếu đ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ụ 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 một công cụ hoặc tệp thực thi qua chuỗi công cụ và Blaze không phát hiện thấy điều đó (lỗi xuất hiện), thì 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 (một hành động sử dụng tệp thực thi hoặc các công cụ từ hai hoặc nhiều chuỗi công cụ), bạn cần xác định exec_groups theo cách thủ công (xem phần Khi nào tôi nên sử dụng phần exec_group tuỳ chỉnh?).

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

Trước khi 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ý hai loại chuỗi công cụ. Tức là ToolchainResolution (Độ 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ý 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 đều có một nền tảng thực thi duy nhất, ngay cả khi các hành động đó đã sử dụng các công cụ của nhiều 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 hai thao tác là 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 khi 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 hành động sẽ được 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 có thể được thực thi trên các nền tảng thực thi khác nhau.

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

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

Như cái tên cho thấy, AEG là các nhóm thực thi được tạo tự động cho mỗi loại chuỗi công cụ được đăng ký trên một quy tắc. Bạn không cần phải chỉ định các nhóm đó theo cách thủ công, không giống như các nhóm thực thi "cổ điển".

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

Bạn chỉ cần sử dụng các exec_groups tuỳ chỉnh trong trường hợp nhiều chuỗi công cụ cần 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 phải xác định các 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. Bên ngoài Bazel, 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ụ: các 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?

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

Cách bật AEG

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

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

Đặt thuộc tính _use_auto_exec_groups trên quy tắc.

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

Việc này chỉ bật các AEG trong my_rule và các hành động 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.

Cách 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 các AEG trong dự á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ô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 thể xác định liệu các công cụ đến từ các phần phụ thuộc ngầm ẩn hay một chuỗi công cụ. 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 thành "None".

  • 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à có thể thấy rõ hành động chính xác nào cần thông số chuỗi công cụ. Hãy kiểm tra xem chuỗi công cụ nào được dùng cho hành động đó 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 sử dụng trong thao tác dành cho các công cụ hoặc tệp thực thi, hãy đặt thành None.

Hành động đã khai báo cho chuỗi công cụ không tồn tại "[toolchain_type]".

  • Tức là bạn đã đặt tham số chuỗi công cụ 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 hành động đó.

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 executor tự động cho chuỗi công cụ.