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

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

Kısa özet

Otomatik yürütme grupları, araç zincirleriyle yakından bağlantılıdır. Araç zincirleri kullanıyorsanız bunları toolchain parametresi ekleyerek etkilenen işlemlerde (yürütülebilir bir araç veya araç zincirinden 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ç kullanmıyor veya bir araç zincirinden yürütülebilir dosya kullanmıyorsa ve Blaze bunu algılamazsa (hata ortaya çıkarsa) toolchain = None özelliğini ayarlayabilirsiniz.

Tek bir yürütme platformunda birden fazla araç zinciri kullanmanız gerekiyorsa (bir işlem yürütülebilir dosya veya iki veya daha fazla araç zincirinden araçlar kullanıyorsa) exec_groups grubunu manuel olarak tanımlamanız gerekir (Özel bir exec_group ne zaman kullanmalıyım? bölümünü kontrol edin).

İzledikleriniz

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 kullanılan Araç Zinciri Çözünürlüğü anlamına gelir. exec_groups ile farklı bir şekilde belirtilmediği sürece, kural içindeki kayıtlı her işlem için seçili yürütme platformu kullanıldı. Başka bir deyişle, farklı araç zincirlerinden araçlar kullanılsa bile kural içindeki tüm işlemler tek bir yürütme platformuna sahip olmaktaydı (her hedef için yürütme platformu seçilidir). Bu da tüm araç zincirlerini destekleyen bir yürütme platformu olmadığında başarısızlıklara yol açıyordu.

Geçerli durum

AEG'lerde her araç zinciri türü için yürütme platformu seçilir. Önceki örneğin (my_rule) uygulama işlevi şöyle 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 iki işlem oluşturur: Bir //tools:toolchain_type_1 öğesinden yürütülebilir dosya kullanan First action ve bir //tools:toolchain_type_2 kaynağından yürütülebilir dosya kullanan Second action. AEG'lerden önce bu iki eylem, her iki araç zinciri türünü de destekleyen tek bir yürütme platformunda yürütülürdü. AEG'lerde, işlemlerin içine toolchain parametresi eklenerek 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 ctx.actions.run_shell için de geçerlidir. Burada, tools bir araç zincirinden olduğunda toolchain parametresinin eklenmesi gerekir.

Özel yönetici grupları ile otomatik yönetici grupları arasındaki fark

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

Ne zaman özel bir exec_group kullanmalıyım?

Özel exec_groups yalnızca birden fazla araç zincirinin tek bir yürütme platformunda yürütülmesi gerektiğinde gerekir. Diğer hiçbir durumda ö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'lerin taşınması

Blaze, şirket içinde Google3'te AEG'leri kullanmaya başlamıştır. Bazel için şirket dışında, taşıma süreci devam ediyor. Bazı kurallar bu özelliği zaten kullanıyor (ör. Java ve C++ kuralları).

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

AEG'ler, Bazel 7'den tam olarak desteklenmektedir.

AEG'ler nasıl etkinleştirilir?

--incompatible_auto_exec_groups değerini doğru olarak ayarlayın. GitHub sorunuyla ilgili işaret hakkında daha fazla bilgi edinin.

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, AEG'leri yalnızca my_rule içinde etkinleştirir ve yürütme platformu seçilirken yeni mantığı kullanmaya başlar. Uyumsuz işaret bu özellikle geçersiz kılınır.

Hata olması 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şaretlemenin GitHub sorunu) veya _use_auto_exec_groups özelliğini False değerine ayarlayarak belirli bir kuralı devre dışı bırakın (özellik hakkında daha fazla bilgi edinin).

AEG'lere taşıma sırasında karşılaşılan hata mesajları

Araçların dolaylı bağımlılıklardan mı yoksa araç zincirinden mi geldiği belirlenemedi. Lütfen araç zinciri parametresini ayarlayın. Araç zinciri kullanmıyorsanız "Yok" olarak ayarlayın.

  • Bu durumda, hata oluşmadan önce bir grup çağrı alırsınız ve tam olarak hangi işlem için araç zinciri parametresi gerektiğini net bir şekilde görebilirsiniz. İşlem için hangi araç zincirinin kullanıldığını kontrol edin ve araç zinciri parametresiyle ayarlayın. İşlemin içinde araçlar veya yürütülebilir dosyalar için herhangi bir araç zinciri kullanılmıyorsa bunu None olarak ayarlayın.

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

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

Ek malzeme

Daha fazla bilgi için tasarım dokümanına göz atın: Araç zincirleri için otomatik yönetici grupları.