Grup Eksekusi Otomatis (AEG)

Laporkan masalah Lihat sumber Nightly · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 menggunakan toolchain, Anda harus menetapkannya 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 tidak menggunakan alat atau file yang dapat dieksekusi dari toolchain, dan Blaze tidak mendeteksinya (error muncul), Anda dapat menetapkan toolchain = None.

Jika Anda perlu menggunakan beberapa toolchain di satu platform eksekusi (tindakan menggunakan alat atau file yang dapat dieksekusi 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, Resolusi Toolchain digunakan untuk menemukan platform eksekusi yang mendukung kedua jenis toolchain. Platform eksekusi yang dipilih digunakan untuk setiap tindakan terdaftar di dalam aturan, kecuali jika ditentukan secara berbeda dengan exec_groups. Dengan kata lain, semua tindakan di dalam aturan digunakan untuk memiliki satu platform eksekusi meskipun menggunakan alat dari toolchain yang berbeda (platform eksekusi dipilih untuk setiap target). Hal ini menyebabkan kegagalan saat tidak ada platform eksekusi yang mendukung semua toolchain.

Status saat ini

Dengan AEG, platform eksekusi dipilih untuk setiap jenis toolchain. 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 di satu platform eksekusi yang mendukung kedua jenis toolchain. Dengan AEG, dengan menambahkan parameter toolchain di dalam tindakan, setiap tindakan akan dijalankan di platform eksekusi yang menyediakan toolchain. Tindakan tersebut dapat dijalankan di platform eksekusi yang berbeda.

Hal yang sama berlaku untuk ctx.actions.run_shell dengan parameter toolchain harus ditambahkan saat 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".

Kapan saya harus menggunakan exec_group kustom?

exec_groups kustom hanya diperlukan jika beberapa toolchain perlu dijalankan di satu platform eksekusi. Dalam kasus lain, Anda 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 sepenuhnya didukung dari Bazel 7.

Bagaimana cara mengaktifkan AEG?

Tetapkan --incompatible_auto_exec_groups ke true. Informasi selengkapnya tentang tanda ini di masalah GitHub.

Bagaimana cara mengaktifkan AEG di 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 mengaktifkan AEG di my_rule dan tindakannya mulai menggunakan logika baru saat memilih platform eksekusi. Flag yang tidak kompatibel akan diganti dengan atribut ini.

Bagaimana cara menonaktifkan AEG jika terjadi error?

Tetapkan --incompatible_auto_exec_groups ke salah untuk menonaktifkan AEG sepenuhnya dalam project Anda (masalah GitHub tanda), 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. Tetapkan parameter toolchain. Jika Anda tidak menggunakan toolchain, tetapkan ke 'None'.

  • Dalam hal ini, Anda akan mendapatkan tumpukan panggilan sebelum error terjadi dan Anda dapat melihat dengan jelas tindakan persis 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 yang dapat dieksekusi, tetapkan ke None.

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

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

Materi tambahan

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