Otomatik Yürütme Grupları (AEG'ler)

Sorun bildir Kaynağı göster Nightly · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Otomatik yürütme grupları, her araç zinciri türü için bir yürütme platformu seçer. Diğer bir deyişle, tek bir hedefin, yürütme grubu tanımlamadan birden fazla yürütme platformu olabilir.

Kısa özet

Otomatik yürütme grupları, araç zincirleriyle yakından ilişkilidir. Araç zincirleri kullanıyorsanız toolchain parametresini ekleyerek etkilenen işlemlerde (bir araç zincirinden yürütülebilir bir dosya veya araç kullanan işlemler) ayarlamanız gerekir. Örneğin:

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

İşlem, bir araç zincirinden bir araç veya yürütülebilir dosya kullanmıyorsa ve Blaze bunu algılamıyorsa (hata oluşur) toolchain = None ayarını yapabilirsiniz.

Tek bir yürütme platformunda birden fazla araç zinciri kullanmanız gerekiyorsa (bir işlem, iki veya daha fazla araç zincirinden yürütülebilir dosya ya da araç kullanıyorsa) exec_groups parametresini manuel olarak tanımlamanız gerekir (Ne zaman özel exec_group kullanmalıyım? bölümünü inceleyin).

Geçmiş

AEG'lerden önce, yürütme platformu kural düzeyinde seçiliyordu. Örneğin:

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

my_rule kuralı iki araç zinciri türünü kaydeder. Bu, her iki araç zinciri türünü de destekleyen bir yürütme platformu bulmak için Araç Zinciri Çözümü'nün kullanıldığı anlamına gelir. exec_groups ile farklı bir şekilde belirtilmediği sürece, kural içindeki her kayıtlı işlem için seçilen yürütme platformu kullanıldı. Diğer bir deyişle, kural içindeki tüm işlemler farklı araç zincirlerinden araçlar kullansalar bile tek bir yürütme platformuna sahipti (yürütme platformu her hedef için seçilir). Bu durum, tüm araç zincirlerini destekleyen bir yürütme platformu olmadığında hatalara neden oldu.

Geçerli durum

AEG'lerde, her araç zinciri türü için yürütme platformu seçilir. Önceki örneğin uygulama işlevi (my_rule) aşağıdaki gibi görünür:

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',
    )

Bu kural, //tools:toolchain_type_1 kaynaklı yürütülebilir dosyayı kullanan First action ve //tools:toolchain_type_2 kaynaklı yürütülebilir dosyayı kullanan Second action olmak üzere iki işlem oluşturur. AEG'lerden önce bu işlemlerin her ikisi de her iki araç zinciri türünü de destekleyen tek bir yürütme platformunda yürütülürdü. AEG'lerde, işlemlere toolchain parametresi eklendiğinde her işlem, araç zincirini sağlayan yürütme platformunda yürütülür. İşlemler farklı yürütme platformlarında yürütülebilir.

Aynı durum, tools bir araç kiti olduğunda toolchain parametresinin eklenmesi gereken ctx.actions.run_shell için de geçerlidir.

Özel yürütme grupları ile otomatik yürütme grupları arasındaki fark

Adından da anlaşılacağı gibi AEG'ler, bir kurala kaydedilen her araç zinciri türü için otomatik olarak oluşturulan yürütme gruplarıdır. "Klasik" yürütme gruplarının aksine, bunları manuel olarak belirtmeniz gerekmez.

Özel exec_group ne zaman kullanılmalıdır?

Özel exec_groups yalnızca birden fazla araç zincirinin tek bir yürütme platformunda çalıştırılması gerektiğinde gereklidir. Diğer tüm durumlarda özel exec_groups tanımlamanıza gerek yoktur. Örneğin:

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'],
        ),
    }
)

AEG'leri taşıma

Blaze, google3'te dahili olarak AEG'leri zaten kullanıyor. Bazel için harici taşıma işlemi devam ediyor. Bazı kurallar bu özelliği zaten kullanıyordur (ör. Java ve C++ kuralları).

Hangi Bazel sürümleri bu taşıma işlemini destekler?

AEG'ler Bazel 7'den itibaren tam olarak desteklenir.

AEG'ler nasıl etkinleştirilir?

--incompatible_auto_exec_groups değerini true olarak ayarlayın. İşaret hakkında daha fazla bilgiyi GitHub sorununda bulabilirsiniz.

Belirli bir kuralda AEG'ler nasıl etkinleştirilir?

Bir kuralda _use_auto_exec_groups özelliğini ayarlayın.

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

Bu, yalnızca my_rule'te AEG'leri etkinleştirir ve işlemleri, yürütme platformunu seçerken yeni mantığı kullanmaya başlar. Uyumlu değil işareti bu özellikle geçersiz kılınır.

Hata durumunda AEG'ler nasıl devre dışı bırakılır?

Projenizde AEG'leri tamamen devre dışı bırakmak için --incompatible_auto_exec_groups değerini false olarak ayarlayın (işaretin GitHub sorunu) veya _use_auto_exec_groups özelliğini False olarak ayarlayarak belirli bir kuralı devre dışı bırakın (özellikle ilgili daha fazla bilgi).

AEG'lere geçiş sırasında hata mesajları

Araçların, gizli bağımlılıklardan mı yoksa bir araç zincirinden mi geldiğini belirleyemedi. Lütfen araç zinciri parametresini ayarlayın. Araç zinciri kullanmıyorsanız bu seçeneği "Yok" olarak ayarlayın.

  • Bu durumda, hata oluşmadan önce bir yığın çağrı alırsınız ve tam olarak hangi işlemin toolchain parametresine ihtiyacı olduğunu net bir şekilde görebilirsiniz. İşlem için hangi araç setinin kullanıldığını kontrol edin ve araç seti parametresi ile ayarlayın. Araçlar veya yürütülebilir dosyalar için işlem içinde hiçbir araç zinciri kullanılmıyorsa None olarak ayarlayın.

Mevcut olmayan "[toolchain_type]" araç zinciri için işlem tanımlandı.

  • Bu, işlemde araç zinciri parametresini ayarladığınız ancak kurala kaydetmediğiniz anlamına gelir. Aracı zincirini kaydedin veya işlem içinde None değerini ayarlayın.

Ek materyal

Daha fazla bilgi için Araç zincirleri için otomatik yürütme grupları adlı tasarım belgesine göz atın.