Grup Eksekusi Otomatis (AEG)

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 dengan toolchain. Jika Anda menggunakan toolchain, Anda harus menyetelnya pada tindakan yang terpengaruh (tindakan yang menggunakan 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 tidak menggunakan alat atau file yang dapat dieksekusi dari toolchain, dan Blaze tidak mendeteksinya (error muncul), Anda dapat menyetel toolchain = None.

Jika Anda perlu menggunakan beberapa toolchain pada satu platform eksekusi (tindakan menggunakan file yang dapat dieksekusi atau alat dari dua toolchain atau lebih), Anda harus menentukan exec_groups secara manual (lihat bagian Kapan saya harus menggunakan exec_group kustom?).

Histori

Sebelum AEG, platform eksekusi dipilih di tingkat aturan. Contoh:

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

Aturan my_rule mendaftarkan dua jenis toolchain. Artinya, Penyelesaian Toolchain yang digunakan untuk menemukan platform eksekusi yang mendukung kedua jenis toolchain. Platform eksekusi yang dipilih digunakan untuk setiap tindakan yang terdaftar dalam aturan, kecuali jika ditentukan berbeda dengan exec_groups. Dengan kata lain, semua tindakan di dalam aturan sebelumnya menggunakan satu platform eksekusi meskipun menggunakan alat dari toolchain yang berbeda (platform eksekusi dipilih untuk setiap target). Hal ini menyebabkan kegagalan jika tidak ada platform eksekusi yang mendukung semua toolchain.

Status saat ini

Dengan AEG, platform eksekusi dipilih untuk setiap jenis toolchain. Fungsi implementasi 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 executable dari //tools:toolchain_type_1 dan Second action yang menggunakan executable dari //tools:toolchain_type_2. Sebelum AEG, kedua tindakan ini akan dieksekusi di satu platform eksekusi yang mendukung kedua jenis toolchain. Dengan AEG, dengan menambahkan parameter toolchain di dalam tindakan, setiap tindakan dieksekusi di platform eksekusi yang menyediakan toolchain. Tindakan dapat dieksekusi di platform eksekusi yang berbeda.

Hal yang sama berlaku untuk ctx.actions.run_shell dengan parameter toolchain harus ditambahkan jika tools berasal dari toolchain.

Perbedaan antara grup eksekusi kustom dan grup eksekusi otomatis

Seperti namanya, AEG adalah grup eksekusi yang dibuat secara otomatis untuk setiap jenis toolchain yang terdaftar pada aturan. Anda tidak perlu menentukannya secara manual, tidak seperti grup eksekusi "klasik". Selain itu, nama AEG otomatis ditetapkan ke jenis toolchain-nya (misalnya, //tools:toolchain_type_1).

Kapan saya harus menggunakan exec_group kustom?

Grup exec kustom hanya diperlukan jika beberapa toolchain perlu dieksekusi pada satu platform eksekusi. Dalam kasus lain, Anda tidak perlu menentukan exec_group 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. Untuk Bazel secara eksternal, 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 mulai dari Bazel 7.

Bagaimana cara mengaktifkan AEG?

Tetapkan --incompatible_auto_exec_groups ke true. Informasi selengkapnya tentang tanda ini ada di 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),
    }
)

Hal ini memungkinkan AEG hanya di my_rule dan tindakannya mulai menggunakan logika baru saat memilih platform eksekusi. Flag yang tidak kompatibel diganti dengan atribut ini.

Bagaimana cara menonaktifkan AEG jika terjadi error?

Tetapkan --incompatible_auto_exec_groups ke salah (false) untuk menonaktifkan AEG sepenuhnya di project Anda (masalah GitHub untuk tanda ini), atau nonaktifkan aturan tertentu dengan menetapkan atribut _use_auto_exec_groups ke False (detail selengkapnya tentang atribut ini).

Pesan error saat bermigrasi ke AEG

Tidak dapat mengidentifikasi apakah alat berasal dari dependensi implisit atau toolchain. Tetapkan parameter toolchain. Jika Anda tidak menggunakan toolchain, setel ke 'Tidak Ada'.

  • Dalam hal ini, Anda akan mendapatkan tumpukan panggilan sebelum error terjadi dan Anda dapat melihat dengan jelas tindakan mana yang memerlukan parameter toolchain. Periksa toolchain mana yang digunakan untuk tindakan dan tetapkan dengan parameter toolchain. Jika tidak ada toolchain yang digunakan di dalam tindakan untuk alat atau file yang dapat dieksekusi, tetapkan ke None.

Tindakan yang dideklarasikan untuk toolchain '[toolchain_type]' yang tidak ada.

  • Artinya, Anda telah menyetel parameter toolchain pada tindakan, tetapi tidak mendaftarkannya pada aturan. Daftarkan toolchain atau tetapkan None di dalam tindakan.

Materi tambahan

Untuk mengetahui informasi selengkapnya, lihat dokumen desain: Grup eksekusi otomatis untuk toolchain.