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ı.