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 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 kết nối 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 chuỗi công cụ trên các hành động bị ảnh hưởng (các hành động sử dụng một
tệp thực thi hoặc một 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 một 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 điều đó (lỗi được đưa 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 (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 theo cách thủ công exec_groups (hãy xem phần Khi nào nên sử dụng 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ụ. Điều này có nghĩa là Giải pháp
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 bằng exec_groups.
Nói cách khác, tất cả các hành động 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 hai hành động, First action sử dụng tệp thực thi từ a
//tools:toolchain_type_1 và Second action sử dụng tệp thực thi từ a
//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 hành động, mỗi hành động 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 có thể được thực thi
trên các nền tảng thực thi khác nhau.
Điều tương tự cũng có hiệu lực với ctx.actions.run_shell, trong đó toolchain
tham số phải được thêm 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ư tên gọi, AEG là các nhóm thực thi được tạo tự động cho từng
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". Hơn nữa, tên của AEG được tự động đặt thành
loại chuỗi công cụ (ví dụ: //tools:toolchain_type_1).
Khi nào nên sử dụng exec_group tuỳ chỉnh?
Bạn chỉ cần exec_group tuỳ chỉnh trong trường hợp cần thực thi nhiều chuỗi công cụ 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_group 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 được tiến hành. Một số quy tắc đã sử dụng tính năng này (ví dụ: quy tắc Java và C++).
Phiên bản Bazel nào hỗ trợ quá 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ờ
trên vấn đề GitHub.
Cách bật AEG bên trong một quy tắc cụ thể?
Đặt thuộc tính _use_auto_exec_groups trên một quy tắc.
my_rule = rule(
_impl,
attrs = {
"_use_auto_exec_groups": attr.bool(default = True),
}
)
Điều này chỉ bật AEG trong my_rule và các hành động của nó 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 AEG trong
dự án của bạn (vấn đề GitHub của cờ) 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 khác về thuộc tính).
Thông báo lỗi trong khi di chuyển sang AEG
Không thể xác định xem 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 tham 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 xảy ra lỗi 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ụ 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 dùng bên trong hành động cho các công cụ hoặc tệp thực thi, hãy đặt 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ụ trên hành động nhưng không
đăng ký tham số đó trên quy tắc. Đăng ký chuỗi công cụ hoặc đặt
Nonebê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ế: Các nhóm thực thi tự động cho chuỗi công cụ.