Bu sayfada Starlark yapılandırmalarının avantajları ve temel kullanımı, Projenizin derleme şeklini özelleştirmek için Bazel API'si. Projenin vizyonu ve hedefleri ve örnekler sunduk.
Bu sayede:
- projeniz için özel flag'ler tanımlayarak
--define
- yazmak
geçişleri
üst kuruluşlarından farklı yapılandırmalar vardır
(ör.
--compilation_mode=opt
veya--cpu=arm
) - daha iyi varsayılanlar oluşturma (ör.
//my:android_app
belirtilen bir SDK ile)
ve daha fazlası, tamamen .bzl dosyalarından alınır (Bzel sürümü gerekmez). Bkz.
Şunun için bazelbuild/examples
deposu
örnekler.
Kullanıcı tanımlı derleme ayarları
Derleme ayarı,
yapılandırma
ekleyebilirsiniz. Yapılandırmayı bir anahtar/değer eşlemesi olarak düşünebilirsiniz. --cpu=ppc
ayarlanıyor
--copt="-DFoo"
ise şöyle bir yapılandırma üretir:
{cpu: ppc, copt: "-DFoo"}
. Her giriş bir derleme ayarıdır.
cpu
ve copt
gibi geleneksel flag'ler yerel ayarlardır —
anahtarları tanımlanıp değerleri yerel bazel Java kodunun içinde ayarlanır.
Bazel kullanıcıları, bunları yalnızca komut satırından okuyup yazabilir
ve diğer API'ler yerel olarak korunur. Yerel işaretleri ve API'leri değiştirme
bazı işlemler için bazel sürümü gerekir. Kullanıcı tanımlı derleme
ayarları .bzl
dosyalarında tanımlanır (bu nedenle,
(değişiklikleri kaydedin). Bunlar komut satırından da ayarlanabilir
(flags
olarak tanımlandıysa aşağıda daha fazlasını görebilirsiniz) ancak
kullanıcı tanımlı geçişler aracılığıyla ayarlanır.
Derleme ayarlarını tanımlama
build_setting
rule()
parametresi
Derleme ayarları, diğer kurallar gibidir ve
Starlark rule()
işlevinin build_setting
özellik.
# example/buildsettings/build_settings.bzl
string_flag = rule(
implementation = _impl,
build_setting = config.string(flag = True)
)
build_setting
özelliği,
derleme ayarı var. Tür,
bool
ve string
. config
modülünü inceleyin
dokümanları inceleyin. Daha karmaşık bir yazma
işlemi yapılır. Aşağıda bu konuyla ilgili daha fazla bilgi bulabilirsiniz.
config
modülünün işlevleri isteğe bağlı şu boole parametresini alır: flag
Bu değer varsayılan olarak yanlış değerine ayarlanır. flag
doğru değerine ayarlanırsa derleme ayarı
kullanıcılar tarafından komut satırından aynı zamanda kural yazarları tarafından dahili olarak ayarlanabilir
varsayılan değerler ve geçişler aracılığıyla yükleyebilirsiniz.
Tüm ayarlar kullanıcılar tarafından değiştirilemez. Örneğin, kural olarak
bazı hata ayıklama modları varsa bunları test kuralları içinde
etkinleştirmek istiyorsanız
kullanıcılara bu özelliği gelişigüzel şekilde açma olanağı
diğer test dışı kuralların içinde yer alır.
ctx.build_setting_value kullanılması
Tüm kurallar gibi derleme ayarı kurallarının da uygulama işlevleri vardır.
Derleme ayarlarının temel Starlark türü değerine şuradan erişilebilir:
ctx.build_setting_value
yöntemini çağırın. Bu yöntem yalnızca
Derleme ayarı kurallarının ctx
nesneleri. Bu uygulama
yöntemleri, derleme ayarlarının değerini doğrudan yönlendirebilir veya
gibi araçları daha kolay şekilde yapılandırabilirsiniz. Bunu şu şekilde yapabilirsiniz:
enum
türü bir derleme ayarı uygulayın:
# example/buildsettings/build_settings.bzl
TemperatureProvider = provider(fields = ['type'])
temperatures = ["HOT", "LUKEWARM", "ICED"]
def _impl(ctx):
raw_temperature = ctx.build_setting_value
if raw_temperature not in temperatures:
fail(str(ctx.label) + " build setting allowed to take values {"
+ ", ".join(temperatures) + "} but was set to unallowed value "
+ raw_temperature)
return TemperatureProvider(type = raw_temperature)
temperature = rule(
implementation = _impl,
build_setting = config.string(flag = True)
)
Çok kümeli dize işaretlerini tanımlama
Dize ayarlarında ek bir allow_multiple
parametresi bulunur. Bu parametre,
işaretinin komut satırında veya bazelrc'lerde birden çok kez ayarlanmasını gerektirir. Diğer kullanıcının varsayılan ayarları
değerinin hâlâ dize türünde bir özellikle ayarlanmış olması gerekir:
# example/buildsettings/build_settings.bzl
allow_multiple_flag = rule(
implementation = _impl,
build_setting = config.string(flag = True, allow_multiple = True)
)
# example/BUILD
load("//example/buildsettings:build_settings.bzl", "allow_multiple_flag")
allow_multiple_flag(
name = "roasts",
build_setting_default = "medium"
)
İşaretin her ayarı tek bir değer olarak ele alınır:
$ bazel build //my/target --//example:roasts=blonde \
--//example:roasts=medium,dark
Yukarıdaki değer {"//example:roasts": ["blonde", "medium,dark"]}
olarak ayrıştırılır ve
ctx.build_setting_value
, ["blonde", "medium,dark"]
listesini döndürür.
Derleme ayarlarını örneklendirme
build_setting
parametresiyle tanımlanan kurallarda örtülü bir zorunluluk vardır
build_setting_default
özelliği için de geçerlidir. Bu özellik şununla aynı türü alır:
build_setting
parametresiyle tanımlanır.
# example/buildsettings/build_settings.bzl
FlavorProvider = provider(fields = ['type'])
def _impl(ctx):
return FlavorProvider(type = ctx.build_setting_value)
flavor = rule(
implementation = _impl,
build_setting = config.string(flag = True)
)
# example/BUILD
load("//example/buildsettings:build_settings.bzl", "flavor")
flavor(
name = "favorite_flavor",
build_setting_default = "APPLE"
)
Önceden tanımlanmış ayarlar
İlgili içeriği oluşturmak için kullanılan Skylib kitaplıktaki bir grup önceden tanımlı bir ayar içerir. Bu ayarlar, bir yıldız gibi düşünebilirsiniz.
Örneğin, sınırlı bir dize değerleri grubunu kabul eden bir ayarı tanımlamak için:
# example/BUILD
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
string_flag(
name = "myflag",
values = ["a", "b", "c"],
build_setting_default = "a",
)
Tam liste için bkz. Ortak derleme ayarı kuralları.
Derleme ayarlarını kullanma
Derleme ayarlarına bağlı olarak
Bir hedef, bir yapılandırma bilgisini okumak isterse kullanımı, normal bir özellik bağımlılığı aracılığıyla doğrudan derleme ayarına bağlıdır.
# example/rules.bzl
load("//example/buildsettings:build_settings.bzl", "FlavorProvider")
def _rule_impl(ctx):
if ctx.attr.flavor[FlavorProvider].type == "ORANGE":
...
drink_rule = rule(
implementation = _rule_impl,
attrs = {
"flavor": attr.label()
}
)
# example/BUILD
load("//example:rules.bzl", "drink_rule")
load("//example/buildsettings:build_settings.bzl", "flavor")
flavor(
name = "favorite_flavor",
build_setting_default = "APPLE"
)
drink_rule(
name = "my_drink",
flavor = ":favorite_flavor",
)
Diller, tüm kuralların geçerli olduğu standart bir derleme ayarları kümesi oluşturmak isteyebilir.
bu dile göre değişir. Ancak fragments
yerel kavramı artık kullanılmıyor
Starlark yapılandırma dünyasında sabit kodlu bir nesne olarak bulunur.
ortak örtülü öznitelik kümeleri
kullanmak anlamına gelir. Örneğin:
# kotlin/rules.bzl
_KOTLIN_CONFIG = {
"_compiler": attr.label(default = "//kotlin/config:compiler-flag"),
"_mode": attr.label(default = "//kotlin/config:mode-flag"),
...
}
...
kotlin_library = rule(
implementation = _rule_impl,
attrs = dicts.add({
"library-attr": attr.string()
}, _KOTLIN_CONFIG)
)
kotlin_binary = rule(
implementation = _binary_impl,
attrs = dicts.add({
"binary-attr": attr.label()
}, _KOTLIN_CONFIG)
Komut satırında derleme ayarlarını kullanma
Çoğu yerel işarete benzer şekilde, derleme ayarlarını belirlemek için komut satırını kullanabilirsiniz.
bayrak olarak işaretlenen reklamlar. Derleme
ayarın adı, name=value
söz dizimini kullanan tam hedef yoludur:
$ bazel build //my/target --//example:string_flag=some-value # allowed
$ bazel build //my/target --//example:string_flag some-value # not allowed
Özel boole söz dizimi desteklenir:
$ bazel build //my/target --//example:boolean_flag
$ bazel build //my/target --no//example:boolean_flag
Derleme ayarı takma adlarını kullanma
Derleme ayarı hedef yolunuz için takma ad belirleyerek okumayı kolaylaştırabilirsiniz komutunu çalıştırın. Takma adlar, yerel flag'lere benzer şekilde çalışır ve işaretini kaldırın.
--flag_alias=ALIAS_NAME=TARGET_PATH
ekleyerek bir takma ad belirleyin
.bazelrc
cihazınıza . Örneğin, coffee
olarak bir takma ad ayarlamak için:
# .bazelrc
build --flag_alias=coffee=//experimental/user/starlark_configurations/basic_build_setting:coffee-temp
En İyi Uygulama: Bir takma adı birden fazla kez ayarlamak en son bunlardan birine öncelik verelim. İstenmeyen ayrıştırma sonuçlarını önlemek için benzersiz takma ad adları kullanın.
Takma addan yararlanmak için derleme ayarı hedef yolunun yerine takma adı yazın.
Yukarıdaki coffee
örneği, kullanıcının .bazelrc
öğesinde ayarlanır:
$ bazel build //my/target --coffee=ICED
yerine
$ bazel build //my/target --//experimental/user/starlark_configurations/basic_build_setting:coffee-temp=ICED
En İyi Uygulama: Komut satırında takma adlar belirlemek mümkün olsa da,
.bazelrc
ile komut satırı dağınıklığı azaltılır.
Etiket türünde derleme ayarları
Diğer derleme ayarlarından farklı olarak, etiket türünde ayarlar
build_setting
kural parametresi. Bunun yerine, bazel'in iki yerleşik kuralı vardır:
label_flag
ve label_setting
. Bu kurallar,
derleme ayarının yapıldığı gerçek hedeftir. label_flag
ve
label_setting
, geçişler tarafından okunabilir/yazılabilir ve label_flag
ayarlanabilir
(diğer build_setting
kurallarının yapabildiği gibi). Aralarındaki tek fark,
şekilde tanımlanamaz.
Etiketle yazılmış ayarlar, nihayetinde geç sınırlanan işlevlerin yerini alacaktır.
varsayılan olarak ayarlanır. Geç sınırlanan varsayılan özellikler,
nihai değerler yapılandırmadan etkilenebilir. Starlark'ta bu,
configuration_field
API'ye gidin.
# example/rules.bzl
MyProvider = provider(fields = ["my_field"])
def _dep_impl(ctx):
return MyProvider(my_field = "yeehaw")
dep_rule = rule(
implementation = _dep_impl
)
def _parent_impl(ctx):
if ctx.attr.my_field_provider[MyProvider].my_field == "cowabunga":
...
parent_rule = rule(
implementation = _parent_impl,
attrs = { "my_field_provider": attr.label() }
)
# example/BUILD
load("//example:rules.bzl", "dep_rule", "parent_rule")
dep_rule(name = "dep")
parent_rule(name = "parent", my_field_provider = ":my_field_provider")
label_flag(
name = "my_field_provider",
build_setting_default = ":dep"
)
Derleme ayarları ve select()
Kullanıcılar, aşağıdakileri kullanarak derleme ayarlarındaki özellikleri yapılandırabilir:
select()
. Derleme ayarı hedefleri, şu öğenin flag_values
özelliğine geçirilebilir:
config_setting
. Yapılandırmayla eşleştirilecek değer
String
daha sonra eşleştirme için derleme ayarının türüne göre ayrıştırılır.
config_setting(
name = "my_config",
flag_values = {
"//example:favorite_flavor": "MANGO"
}
)
Kullanıcı tanımlı geçişler
Yapılandırma geçiş bir yapılandırılmış hedeften diğerine dönüşümü eşler. anlamına gelir.
Bu kuralları belirleyen kurallar özel bir özellik içermelidir:
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist"
)
Geçişler ekleyerek resimlerinizin boyutunu kolayca geliştirmenizi sağlar. Bu işlem, istediğiniz pakette bir izin verilenler listesi bu kuralın hedeflerini oluştur. Yukarıdaki kod bloğundaki varsayılan değer her şeyi izin verilenler listesine ekler. Ancak kuralınızı kullanan kişileri kısıtlamak istiyorsanız bu özelliği kendi özel izin verilenler listenize yönlendirecek şekilde ayarlayabilirsiniz. Tavsiye veya yardım almak isterseniz bazel-pazarlama@googlegroups.com adresine e-posta gönderin. nasıl etkileyebileceğini daha iyi kavrayacaksınız.
Tanımlama
Geçişler, kurallar arasındaki yapılandırma değişikliklerini tanımlar. Örneğin, bir istek Örneğin, "bağımlılığımı üst öğesinden farklı bir CPU için derle" tarafından ele alınan: için geçerlidir.
Resmî olarak geçiş, bir giriş yapılandırmasından bir veya daha fazla
çıkış yapılandırmalarına sahip olabilir. Çoğu geçiş 1:1'dir. Örneğin, "girişi geçersiz kıl
"--cpu=ppc
" yapılandırması. 1:2+ geçişler de olabilir ancak
söz konusu olabilir.
Starlark'ta geçişler kurallara çok benzer şekilde tanımlanır ve
transition()
.
işlev
ve uygulama işlevi.
# example/transitions/transitions.bzl
def _impl(settings, attr):
_ignore = (settings, attr)
return {"//example:favorite_flavor" : "MINT"}
hot_chocolate_transition = transition(
implementation = _impl,
inputs = [],
outputs = ["//example:favorite_flavor"]
)
transition()
işlevi, bir uygulama işlevi, bir dizi
okunacak derleme ayarları(inputs
) ve yazılacak bir dizi derleme ayarı
(outputs
). Uygulama fonksiyonunun iki parametresi vardır: settings
ve
attr
. settings
, bildirilen tüm ayarların yer aldığı bir sözlük {String
:Object
}
inputs
parametresinde transition()
değerine ayarlayın.
attr
,
geçiş ekli. Bir
yolculuğunun ucu geçişi gibi bir sürüm kullanıyorsanız
özelliklerinin tümü yapılandırılmış post-select() çözünürlüğüdür. Şu şekilde eklendiğinde:
gelen uç geçişi durumunda, attr
değerini çözümlemek için seçici kullanan tüm özellikleri ekleyin. Bir
--foo
cihazda gelen uç geçişi bar
özelliğini okuyor ve ardından
bar
özelliğini ayarlamak için --foo
tarihinde seçer,
geçişte yanlış bar
değerini okumak için gelen uç geçişini kullanın.
Uygulama işlevi, bir sözlük (veya
sözlüklere de
birden fazla çıkış yapılandırması olan geçişler için)
yeni derleme ayarı değerlerinden bahsetmek istiyorum. Döndürülen sözlük anahtar kümeleri,
outputs
öğesine aktarılan derleme ayarları grubunu tam olarak içermelidir
parametresinin değeri. Derleme ayarı
gerçekten değişmemiş olana işarettir. Orijinal değeri,
döndürülen sözlüğe açık bir şekilde iletilmelidir.
1:2+ geçişleri tanımlama
Giden kenar geçişi tek bir girişi eşleyebilir iki veya daha fazla çıkış yapılandırmasına uyarlayabilirsiniz. Bu, proje hedefini kurallarından biridir.
1:2+ geçişleri, bir sözlük listesi döndürerek işlevini kullanın.
# example/transitions/transitions.bzl
def _impl(settings, attr):
_ignore = (settings, attr)
return [
{"//example:favorite_flavor" : "LATTE"},
{"//example:favorite_flavor" : "MOCHA"},
]
coffee_transition = transition(
implementation = _impl,
inputs = [],
outputs = ["//example:favorite_flavor"]
)
Ayrıca, kural uygulama işlevinin bağımlıları tek tek okuyabilirsiniz:
# example/transitions/transitions.bzl
def _impl(settings, attr):
_ignore = (settings, attr)
return {
"Apple deps": {"//command_line_option:cpu": "ppc"},
"Linux deps": {"//command_line_option:cpu": "x86"},
}
multi_arch_transition = transition(
implementation = _impl,
inputs = [],
outputs = ["//command_line_option:cpu"]
)
Geçiş ekleme
Geçişler iki yere eklenebilir: gelen kenarlar ve giden kenarlar. Bu, kuralların kendi yapılandırmalarını (gelecekte uç geçişi) ve bağımlılıklarını yapılandırmalar (giden kenar geçişi) olduğundan emin olun.
NOT: Şu anda Starlark geçişlerini yerel kurallara eklemek mümkün değildir. Bunu yapmanız gerekiyorsa bazel-discuss@googlegroups.com adresine göz atın.
Gelen kenar geçişleri
Gelen kenar geçişleri, bir transition
nesnesi eklenerek etkinleştirilir
rule()
kullanıcısının cfg
parametresine (transition()
tarafından oluşturuldu):
# example/rules.bzl
load("example/transitions:transitions.bzl", "hot_chocolate_transition")
drink_rule = rule(
implementation = _impl,
cfg = hot_chocolate_transition,
...
Gelen kenar geçişleri 1:1 geçişler olmalıdır.
Giden kenar geçişleri
Giden kenar geçişleri, transition
nesnesi eklenerek etkinleştirilir
özelliğinin cfg
parametresine (transition()
tarafından oluşturulur):
# example/rules.bzl
load("example/transitions:transitions.bzl", "coffee_transition")
drink_rule = rule(
implementation = _impl,
attrs = { "dep": attr.label(cfg = coffee_transition)}
...
Giden kenar geçişleri 1:1 veya 1:2+ olabilir.
Geçişlerle özelliklere erişme başlıklı makaleyi inceleyin. öğrenebilirsiniz.
Yerel seçeneklerde geçişler
Starlark geçişleri, yerel derlemede okuma ve yazma işlemlerini de beyan edebilir seçenek adına özel bir önek ile değiştirebilirsiniz.
# example/transitions/transitions.bzl
def _impl(settings, attr):
_ignore = (settings, attr)
return {"//command_line_option:cpu": "k8"}
cpu_transition = transition(
implementation = _impl,
inputs = [],
outputs = ["//command_line_option:cpu"]
Desteklenmeyen yerel seçenekler
Bazel, --define
uygulamasında
"//command_line_option:define"
. Bunun yerine,
derleme ayarını yapın. Genel olarak,
--define
öğelerinin derleme ayarları kullanması önerilmez.
Bazel, --config
tarihinde geçiş işlemini desteklemiyor. Bunun nedeni, --config
bir "genişletme" bayrağı kullanabilirsiniz.
En önemlisi, --config
derleme yapılandırmasını etkilemeyen işaretleri,
örneğin:
--spawn_strategy
, Tasarım gereği Bazel'in bu tür işaretleri tek tek hedeflere bağlaması mümkün değildir. Bunun anlamı şudur:
bunları geçişlerde uygulamanın
tutarlı bir yolu yoktur.
Geçici bir çözüm olarak, öğesinin parçası olan işaretleri
yapılandırdığınızdan emin olun. Bu, --config
öğesinin korunmasını gerektirir
ve bu da bilinen bir kullanıcı arayüzü sorunudur.
Birden fazla derleme ayarına izin veren geçişler
Projenin gidişatı boyunca birden çok değere izin ver seçeneği, ayarı bir listeyle ayarlanmalıdır.
# example/buildsettings/build_settings.bzl
string_flag = rule(
implementation = _impl,
build_setting = config.string(flag = True, allow_multiple = True)
)
# example/BUILD
load("//example/buildsettings:build_settings.bzl", "string_flag")
string_flag(name = "roasts", build_setting_default = "medium")
# example/transitions/rules.bzl
def _transition_impl(settings, attr):
# Using a value of just "dark" here will throw an error
return {"//example:roasts" : ["dark"]},
coffee_transition = transition(
implementation = _transition_impl,
inputs = [],
outputs = ["//example:roasts"]
)
İşlemsiz geçişler
Bir geçiş {}
, []
veya None
döndürürse bu, tüm
değerleri korunabilir. Bu yöntem, açık bir şekilde iletişim kurmaktan daha
her çıkışı kendisine göre
ayarlamanızı sağlar.
# example/transitions/transitions.bzl
def _impl(settings, attr):
_ignore = (attr)
if settings["//example:already_chosen"] is True:
return {}
return {
"//example:favorite_flavor": "dark chocolate",
"//example:include_marshmallows": "yes",
"//example:desired_temperature": "38C",
}
hot_chocolate_transition = transition(
implementation = _impl,
inputs = ["//example:already_chosen"],
outputs = [
"//example:favorite_flavor",
"//example:include_marshmallows",
"//example:desired_temperature",
]
)
Geçiş içeren özelliklere erişme
Giden bir kenara geçiş eklerken
(geçişin 1:1 veya 1:2+ geçişlerinden bağımsız olarak) ctx.attr
listesi zorunlu kılınır.
uygun bir yöntem de yoktur. Bu listedeki öğelerin sırası belirtilmemiş.
# example/transitions/rules.bzl
def _transition_impl(settings, attr):
return {"//example:favorite_flavor" : "LATTE"},
coffee_transition = transition(
implementation = _transition_impl,
inputs = [],
outputs = ["//example:favorite_flavor"]
)
def _rule_impl(ctx):
# Note: List access even though "dep" is not declared as list
transitioned_dep = ctx.attr.dep[0]
# Note: Access doesn't change, other_deps was already a list
for other_dep in ctx.attr.other_deps:
# ...
coffee_rule = rule(
implementation = _rule_impl,
attrs = {
"dep": attr.label(cfg = coffee_transition)
"other_deps": attr.label_list(cfg = coffee_transition)
})
Geçiş 1:2+
ise ve özel anahtarlar ayarlanmışsa ctx.split_attr
kullanılabilir
her anahtar için ayrı bölümleri okumak:
# example/transitions/rules.bzl
def _impl(settings, attr):
_ignore = (settings, attr)
return {
"Apple deps": {"//command_line_option:cpu": "ppc"},
"Linux deps": {"//command_line_option:cpu": "x86"},
}
multi_arch_transition = transition(
implementation = _impl,
inputs = [],
outputs = ["//command_line_option:cpu"]
)
def _rule_impl(ctx):
apple_dep = ctx.split_attr.dep["Apple deps"]
linux_dep = ctx.split_attr.dep["Linux deps"]
# ctx.attr has a list of all deps for all keys. Order is not guaranteed.
all_deps = ctx.attr.dep
multi_arch_rule = rule(
implementation = _rule_impl,
attrs = {
"dep": attr.label(cfg = multi_arch_transition)
})
Tam örneği inceleyin burayı tıklayın.
Platformlar ve araç zincirleriyle entegrasyon
Günümüzde --cpu
ve --crosstool_top
gibi birçok yerel işaret birbiriyle alakalıdır
araç zinciri çözünürlüğüne sahip. Gelecekte bu tür belgelerde açıkça
bayraklarının yerini büyük olasılıkla
hedef platforma bağlı olarak değişebilir.
Bellek ve performansla ilgili dikkat edilmesi gereken noktalar
Yapınıza geçişler ve dolayısıyla yeni yapılandırmalar eklemek maliyet: daha büyük yapı grafikleri, daha az anlaşılır yapı grafikleri ve daha yavaş inşa eder. Planlama aşamasında bu maliyetleri, geçişleri nasıl kullanacağınızı göstereceğim. Aşağıda, bir geçişin nasıl derleme grafiğinizin katlanarak büyümesine neden olabilir.
Kötü davranışlı derlemeler: örnek olay
Şekil 1. Üst düzey bir hedefi ve bağımlılıklarını gösteren ölçeklenebilirlik grafiği.
Bu grafikte, iki hedefe bağlı olan üst düzey bir hedef (//pkg:app
) gösterilmektedir.
//pkg:1_0
ve //pkg:1_1
. Bu hedeflerin ikisi de //pkg:2_0
ve
//pkg:2_1
. Bu hedeflerin her ikisi de //pkg:3_0
ve //pkg:3_1
olmak üzere iki hedefe bağlıdır.
Bu durum, her ikisi de tek bir bağımlılığa bağlı olan //pkg:n_0
ve //pkg:n_1
tarihine kadar devam eder.
hedef, //pkg:dep
.
//pkg:app
oluşturmak için \(2n+2\) hedefler gereklidir:
//pkg:app
//pkg:dep
- \(i\) için \([1..n]\)
//pkg:i_0
ve//pkg:i_1
Bir işaret uyguladığınızı düşünün
--//foo:owner=<STRING>
ve //pkg:i_b
geçerlidir
depConfig = myConfig + depConfig.owner="$(myConfig.owner)$(b)"
Yani //pkg:i_b
, tüm kullanıcılar için eski --owner
değerine b
ekler
analizlerdir.
Bu işlem, aşağıdaki yapılandırılmış hedefleri oluşturur:
//pkg:app //foo:owner=""
//pkg:1_0 //foo:owner=""
//pkg:1_1 //foo:owner=""
//pkg:2_0 (via //pkg:1_0) //foo:owner="0"
//pkg:2_0 (via //pkg:1_1) //foo:owner="1"
//pkg:2_1 (via //pkg:1_0) //foo:owner="0"
//pkg:2_1 (via //pkg:1_1) //foo:owner="1"
//pkg:3_0 (via //pkg:1_0 → //pkg:2_0) //foo:owner="00"
//pkg:3_0 (via //pkg:1_0 → //pkg:2_1) //foo:owner="01"
//pkg:3_0 (via //pkg:1_1 → //pkg:2_0) //foo:owner="10"
//pkg:3_0 (via //pkg:1_1 → //pkg:2_1) //foo:owner="11"
...
//pkg:dep
yapılandırılmış hedefler \(2^n\) oluşturur: config.owner=
"\(b_0b_1...b_n\)" \(b_i\) için \(\{0,1\}\).
Böylece, derleme grafiği hedef grafikten katlanarak daha büyük hale gelir. sonuçlar doğurabilir.
YAPILACAKLAR: Bu sorunların ölçümü ve azaltılması için stratejiler ekleyin.
Daha fazla bilgi
Derleme yapılandırmalarını değiştirme hakkında daha fazla bilgi için aşağıdaki konulara bakın:
- Starlark Derleme Yapılandırması
- Bazel Yapılandırılabilirlik Yol Haritası
- Uçtan uca örneklerin tam grubu