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

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Otomatik yürütme grupları, her araç zinciri türü için bir yürütme platformu seçer. Başka bir deyişle, bir hedef, yürütme grupları tanımlanmadan 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 toolchain parametresini ekleyerek bunları etkilenen işlemlerde (bir araç zincirinden yürütülebilir 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ç zincirindeki aracı veya yürütülebilir dosyayı kullanmıyorsa ve Blaze bunu algılamıyorsa (hata oluşturulur) toolchain = None'ı ayarlayabilirsiniz.

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 dosyalar ya da araçlar kullanıyorsa) exec_groups'u manuel olarak tanımlamanız gerekir (Özel bir exec_group'u ne zaman kullanmalıyım? bölümüne bakın).

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

Kural my_rule, 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 Toolchain Resolution'ın kullanıldığı anlamına gelir. exec_groups ile farklı şekilde belirtilmediği sürece, kuralın içindeki her kayıtlı işlem için seçilen yürütme platformu kullanıldı. Başka bir deyişle, kuralın içindeki tüm işlemler farklı araç zincirlerindeki araçları kullansalar bile tek bir yürütme platformuna sahipti (her hedef için yürütme platformu seçilir). Bu durum, tüm araç zincirlerini destekleyen bir yürütme platformu olmadığında hatalara neden oluyordu.

Geçerli durum

AEG'lerde, her araç zinciri türü için yürütme platformu seçilir. Önceki örnekteki uygulama işlevi my_rule şu şekilde 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, First action ve Second action olmak üzere iki işlem oluşturur. First action, //tools:toolchain_type_1 konumundaki yürütülebilir dosyayı, Second action ise //tools:toolchain_type_2 konumundaki yürütülebilir dosyayı kullanır. AEG'lerden önce bu işlemlerin her ikisi de her iki araç zinciri türünü destekleyen tek bir yürütme platformunda gerçekleştirilirdi. 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, tools bir araç zincirinden geldiğinde 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, AE'ler bir kurala kaydedilen her araç zinciri türü için otomatik olarak oluşturulan yürütme gruplarıdır. "Klasik" yönetici gruplarının aksine, bunların manuel olarak belirtilmesi gerekmez. Ayrıca, AEG'nin adı otomatik olarak araç zinciri türü (ör. //tools:toolchain_type_1) olarak ayarlanır.

Özel bir exec_group'u ne zaman kullanmalıyım?

Özel exec_group'lar yalnızca birden fazla araç zincirinin tek bir yürütme platformunda yürütülmesi 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'lerin taşınması

Google3'te Blaze, şirket içinde AEG'leri kullanmaktadır. Bazel için harici olarak taşıma işlemi devam etmektedir. Bazı kurallar bu özelliği zaten kullanıyor (ör. Java ve C++ kuralları).

Hangi Bazel sürümleri bu taşımayı destekler?

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

AEG'ler nasıl etkinleştirilir?

--incompatible_auto_exec_groups değerini doğru olarak ayarlayın. Bayrak hakkında daha fazla bilgiyi GitHub sorununda bulabilirsiniz.

Belirli bir kuralda AEGs 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'da otomatik etkinlik gruplarını etkinleştirir ve yürütme platformu seçilirken işlemleri yeni mantığı kullanmaya başlar. Uyumsuz işaret, bu özellikle geçersiz kılınır.

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

Projenizde AE'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 (özellik hakkında daha fazla bilgi).

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

Araçların örtülü bağımlılıklardan mı yoksa bir 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 dizi çağrı alırsınız ve hangi işlemin tam olarak araç zinciri parametresine ihtiyaç duyduğunu net bir şekilde görebilirsiniz. İşlem için hangi araç zincirinin kullanıldığını kontrol edin ve araç zinciri parametresiyle ayarlayın. Araçlar veya yürütülebilir dosyalar için işlemde araç zinciri kullanılmıyorsa None olarak ayarlayın.

Mevcut olmayan "[toolchain_type]" araç zinciri için işlem bildirildi.

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

Ek materyal

Daha fazla bilgi için tasarım belgesine göz atın: Automatic exec groups for toolchains.