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