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

Otomatik yürütme grupları bir yürütme platformu seçer her bir araç zinciri türü için geçerli. Başka bir deyişle, bir hedefte birden fazla en iyi uygulamaları paylaşacağız.

Kısa özet

Otomatik yürütme grupları, araç zincirleriyle yakından ilişkilidir. Şunu kullanıyorsanız: bunları etkilenen işlemlerde (bir veya daha fazla dönüşüm yürütülebilir veya bir araç zincirindeki araç) toolchain parametresini ekleyerek. Ö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 yürütülebilir veya araç zincirinden yürütülebilir bir araç kullanmıyorsa ve Blaze algılamazsa (hata ortaya çıktığında) toolchain = None.

Tek bir yürütme platformunda (bir işlem) birden fazla araç zinciri kullanmanız gerekiyorsa yürütülebilir veya iki ya da daha fazla araç zincirinden araçlar kullanıyorsa) bunu manuel olarak exec_groups parametresini tanımlayın ( Ne zaman özel bir exec_group 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'],
)

my_rule kuralı iki araç zinciri türü kaydeder. Bu, Araç Zinciri Çözünürlük kullanıldı her iki araç zinciri türünü de destekleyen bir yürütme platformu bulmaktır. Seçilen kuraldaki her kayıtlı işlem için yürütme platformu kullanıldı. exec_groups ile farklı şekilde belirtilir. Diğer bir deyişle, kural içindeki tüm işlemler tek bir yürütmeye sahipti. farklı araç zincirlerinden (yürütme platformu) araçlar kullansalar bile her bir hedef için seçilir). Bu da tüm araç zincirlerini destekleyen bir yürütme platformuna gidin.

Geçerli durum

AEG'lerle her araç zinciri türü için yürütme platformu seçilir. İlgili içeriği oluşturmak için kullanılan önceki örneğin my_rule uygulama işlevi 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 iki işlem oluşturur: First action, //tools:toolchain_type_1 ve yürütülebilir bir dosya kullanan Second action //tools:toolchain_type_2. AEG'lerden önce bu işlemlerin her ikisi de yürütülürdü . AEG'ler sayesinde toolchain parametresini işlemlere eklediğinizde her işlem şurada yürütülür araç zincirini sağlayan yürütme platformu. İşlemler yürütülebilir farklı yürütme platformlarında görüntülenebilir.

Aynı durum ctx.actions.run_shell için de geçerlidir. toolchain parametresi, tools araç zincirinden olduğunda eklenmelidir.

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

Adından da anlaşılacağı gibi AEG'ler, her biri için otomatik olarak oluşturulan yönetici gruplarıdır. bir kurala kaydedilen araç zinciri türünü ifade eder. Bunları manuel olarak belirtmeniz gerekmez, "klasik" üst düzey yönetici gruplarıdır.

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

Özel exec_groups yalnızca birden fazla araç zincirinin ihtiyacı olduğunda tek bir yürütme platformunda yürütülür. Diğer tüm durumlarda özel exec_grupları tanımlayın. Ö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, dahili olarak google3'te AEG'leri kullanıyor. Harici olarak Bazel için taşıma süreci devam etmektedir. Bazı kurallar zaten (ör. Java ve C++ kuralları).

Bu taşıma işlemini destekleyen Bazel sürümleri hangileridir?

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. Bayrak hakkında daha fazla bilgi GitHub sorununa göz atın.

Belirli bir kural içinde 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 bölgesinde etkinleştirir ve işlemleri yeni mantığı kullanmaya başlar karar vermekte fayda var. Uyumsuz işaret, bununla geçersiz kılındı özelliğini gönderin.

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

AEG'leri tamamen devre dışı bırakmak için --incompatible_auto_exec_groups değerini false (yanlış) olarak ayarlayın projenize (işaretlemenin GitHub sorunu) bakın veya belirli bir kuralı devre dışı bırakın _use_auto_exec_groups özelliğini False değerine ayarlayarak (özellik hakkında daha fazla bilgi edinin).

AEG'lere taşıma 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 yığın çağrı alırsınız ve bu durumda tam olarak hangi işlem için araç zinciri parametresi gerektiğini açıkça görebilir. Hangisini araç zinciri kullanılır ve bu parametre, araç zinciri parametresiyle ayarlanır. Yanıt hayır ise: araç zincirinin içinde araçlar veya yürütülebilir öğeler için kullanılır ve None

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

  • Bu, işlemde araç zinciri parametresini ayarladığınız ancak bunu kurala kaydederiz. Araç zincirini kaydedin veya işlemin içinde None değerini 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ı.