Grup eksekusi otomatis memilih platform eksekusi untuk setiap jenis toolchain. Dengan kata lain, satu target dapat memiliki beberapa platform eksekusi tanpa menentukan grup eksekusi.
Ringkasan singkat
Grup eksekusi otomatis terhubung erat ke toolchain. Jika Anda menggunakan
toolchain, Anda perlu menyetelnya pada tindakan yang terpengaruh (tindakan yang menggunakan
file yang dapat dieksekusi atau alat dari toolchain) dengan menambahkan parameter toolchain
. Contoh:
ctx.actions.run(
...,
executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
...,
toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)
Jika tindakan tersebut tidak menggunakan alat atau file yang dapat dieksekusi dari toolchain, dan Blaze
tidak mendeteksi hal itu (error muncul), Anda dapat menyetelnya
toolchain = None
.
Jika Anda perlu menggunakan beberapa toolchain pada satu platform eksekusi (sebuah tindakan menggunakan {i>executable<i} atau {i>tool<i} dari dua atau lebih toolchain), Anda harus tentukan exec_groups (centang Kapan saya harus menggunakan exec_group kustom? ).
Histori
Sebelum AEG, platform eksekusi dipilih pada tingkat aturan. Contoh:
my_rule = rule(
_impl,
toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)
Aturan my_rule
mendaftarkan dua jenis toolchain. Artinya, Toolchain
Resolusi digunakan
untuk menemukan platform eksekusi yang mendukung kedua jenis toolchain tersebut. yang dipilih
platform eksekusi digunakan untuk setiap tindakan
yang terdaftar di dalam aturan, kecuali
ditentukan secara berbeda dengan exec_groups.
Dengan kata lain, semua tindakan di dalam aturan yang digunakan untuk hanya memiliki satu eksekusi
platform ini bahkan jika mereka menggunakan alat dari toolchain yang berbeda (platform eksekusi
dipilih untuk setiap target). {i>Mockup <i}ini mengakibatkan kegagalan
ketika tidak ada
yang mendukung semua toolchain.
Status saat ini
Dengan AEG, platform eksekusi dipilih untuk setiap jenis toolchain. Tujuan
fungsi implementasi dari contoh sebelumnya, my_rule
, akan terlihat seperti:
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',
)
Aturan ini membuat dua tindakan, First action
yang menggunakan file yang dapat dieksekusi dari
//tools:toolchain_type_1
dan Second action
yang menggunakan file yang dapat dieksekusi dari
//tools:toolchain_type_2
. Sebelum AEG, kedua tindakan ini akan dijalankan
pada satu platform eksekusi yang mendukung kedua jenis toolchain tersebut. Dengan AEG,
dengan menambahkan parameter toolchain
di dalam tindakan, setiap tindakan akan dijalankan di
platform eksekusi yang menyediakan toolchain. Tindakan dapat dijalankan
di berbagai platform eksekusi.
Hal yang sama berlaku untuk ctx.actions.run_shell jika toolchain
harus ditambahkan jika tools
berasal dari toolchain.
Perbedaan antara grup exec kustom dan grup exec otomatis
Seperti namanya, AEG adalah grup {i>exec<i} yang dibuat secara otomatis untuk jenis toolchain yang terdaftar pada aturan. Tidak perlu menentukannya secara manual, tidak seperti "klasik" grup eksekutif.
Kapan saya harus menggunakan exec_group kustom?
exec_groups kustom hanya diperlukan jika beberapa toolchain perlu dieksekusi pada satu platform eksekusi. Dalam kasus lain, tidak perlu menentukan exec_groups kustom. Contoh:
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'],
),
}
)
Migrasi AEG
Secara internal di google3, Blaze sudah menggunakan AEG. Secara eksternal untuk Bazel, migrasi sedang dalam proses. Beberapa aturan sudah menggunakan fitur ini (misalnya aturan Java dan C++).
Versi Bazel mana yang mendukung migrasi ini?
AEG didukung sepenuhnya dari Bazel 7.
Bagaimana cara mengaktifkan AEG?
Tetapkan --incompatible_auto_exec_groups
ke true. Informasi selengkapnya tentang tanda ini
tentang masalah GitHub.
Bagaimana cara mengaktifkan AEG dalam aturan tertentu?
Tetapkan atribut _use_auto_exec_groups
pada aturan.
my_rule = rule(
_impl,
attrs = {
"_use_auto_exec_groups": attr.bool(default = True),
}
)
Tindakan ini hanya akan mengaktifkan AEG di my_rule
dan tindakannya akan mulai menggunakan logika baru
saat memilih platform eksekusi. Tanda yang tidak kompatibel diganti dengan
.
Bagaimana cara menonaktifkan AEG jika terjadi error?
Setel --incompatible_auto_exec_groups
ke false untuk sepenuhnya menonaktifkan AEG di
project Anda (menandai masalah GitHub), atau nonaktifkan aturan tertentu
dengan menetapkan atribut _use_auto_exec_groups
ke False
(detail selengkapnya tentang atribut).
Pesan error saat bermigrasi ke AEG
Tidak dapat mengidentifikasi apakah alat berasal dari dependensi implisit atau toolchain. Setel parameter toolchain. Jika Anda tidak menggunakan toolchain, tetapkan ke 'None'.
- Dalam hal ini, Anda mendapatkan tumpukan panggilan sebelum kesalahan terjadi dan Anda bisa
melihat dengan jelas tindakan pasti mana yang memerlukan parameter toolchain. Periksa
toolchain digunakan untuk tindakan dan menyetelnya dengan parameter toolchain. Jika tidak
toolchain digunakan dalam aksi untuk alat atau file yang dapat dieksekusi, aturlah ke
None
.
Tindakan dideklarasikan untuk toolchain '[ toolchain_type]' yang tidak ada.
- Ini berarti Anda telah menetapkan parameter toolchain pada tindakan, tetapi tidak
mendaftarkannya ke dalam aturan. Daftarkan toolchain atau tetapkan
None
di dalam tindakan.
Materi tambahan
Untuk informasi selengkapnya, lihat dokumen desain: Grup exec otomatis untuk toolchain.