Otomatik yürütme grupları, her araç zinciri türü için bir yürütme platformu seçer. Diğer bir deyişle, tek bir hedefin, yürütme grubu tanımlamadan birden fazla yürütme platformu olabilir.
Kısa özet
Otomatik yürütme grupları, araç zincirleriyle yakından ilişkilidir. Araç zincirleri kullanıyorsanız toolchain
parametresini ekleyerek etkilenen işlemlerde (bir araç zincirinden yürütülebilir bir 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ç zincirinden bir araç veya yürütülebilir dosya kullanmıyorsa ve Blaze bunu algılamıyorsa (hata oluşur) toolchain = None
ayarını yapabilirsiniz.
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 dosya ya da araç kullanıyorsa) exec_groups parametresini manuel olarak tanımlamanız gerekir (Ne zaman özel exec_group kullanmalıyım? bölümünü inceleyin).
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ünü kaydeder. Bu, her iki araç zinciri türünü de destekleyen bir yürütme platformu bulmak için Araç Zinciri Çözümü'nün kullanıldığı anlamına gelir. exec_groups ile farklı bir şekilde belirtilmediği sürece, kural içindeki her kayıtlı işlem için seçilen yürütme platformu kullanıldı.
Diğer bir deyişle, kural içindeki tüm işlemler farklı araç zincirlerinden araçlar kullansalar bile tek bir yürütme platformuna sahipti (yürütme platformu her hedef için seçilir). Bu durum, tüm araç zincirlerini destekleyen bir yürütme platformu olmadığında hatalara neden oldu.
Geçerli durum
AEG'lerde, her araç zinciri türü için yürütme platformu seçilir. Önceki örneğin uygulama işlevi (my_rule
) 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, //tools:toolchain_type_1
kaynaklı yürütülebilir dosyayı kullanan First action
ve //tools:toolchain_type_2
kaynaklı yürütülebilir dosyayı kullanan Second action
olmak üzere iki işlem oluşturur. AEG'lerden önce bu işlemlerin her ikisi de her iki araç zinciri türünü de destekleyen tek bir yürütme platformunda yürütülürdü. AEG'lerde, işlemlere toolchain
parametresi eklendiğinde 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ç kiti olduğunda 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 AEG'ler, bir kurala kaydedilen her araç zinciri türü için otomatik olarak oluşturulan yürütme gruplarıdır. "Klasik" yürütme gruplarının aksine, bunları manuel olarak belirtmeniz gerekmez.
Özel exec_group ne zaman kullanılmalıdır?
Özel exec_groups yalnızca birden fazla araç zincirinin tek bir yürütme platformunda çalıştırılması 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'leri taşıma
Blaze, google3'te dahili olarak AEG'leri zaten kullanıyor. Bazel için harici taşıma işlemi devam ediyor. Bazı kurallar bu özelliği zaten kullanıyordur (ör. Java ve C++ kuralları).
Hangi Bazel sürümleri bu taşıma işlemini destekler?
AEG'ler Bazel 7'den itibaren tam olarak desteklenir.
AEG'ler nasıl etkinleştirilir?
--incompatible_auto_exec_groups
değerini true olarak ayarlayın. İşaret hakkında daha fazla bilgiyi GitHub sorununda bulabilirsiniz.
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, yalnızca my_rule
'te AEG'leri etkinleştirir ve işlemleri, yürütme platformunu seçerken yeni mantığı kullanmaya başlar. Uyumlu değil işareti bu özellikle geçersiz kılınır.
Hata 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şaretin GitHub sorunu) veya _use_auto_exec_groups
özelliğini False
olarak ayarlayarak belirli bir kuralı devre dışı bırakın (özellikle ilgili daha fazla bilgi).
AEG'lere geçiş sırasında hata mesajları
Araçların, gizli bağımlılıklardan mı yoksa bir araç zincirinden mi geldiğini belirleyemedi. Lütfen araç zinciri parametresini ayarlayın. Araç zinciri kullanmıyorsanız bu seçeneği "Yok" olarak ayarlayın.
- Bu durumda, hata oluşmadan önce bir yığın çağrı alırsınız ve tam olarak hangi işlemin toolchain parametresine ihtiyacı olduğunu net bir şekilde görebilirsiniz. İşlem için hangi araç setinin kullanıldığını kontrol edin ve araç seti parametresi ile ayarlayın. Araçlar veya yürütülebilir dosyalar için işlem içinde hiçbir araç zinciri kullanılmıyorsa
None
olarak ayarlayın.
Mevcut olmayan "[toolchain_type]" araç zinciri için işlem tanımlandı.
- Bu, işlemde araç zinciri parametresini ayarladığınız ancak kurala kaydetmediğiniz anlamına gelir. Aracı zincirini kaydedin veya işlem içinde
None
değerini ayarlayın.
Ek materyal
Daha fazla bilgi için Araç zincirleri için otomatik yürütme grupları adlı tasarım belgesine göz atın.