Derleme Etkinliği Protokolü'nün tam spesifikasyonu, protokolünde bulunabilir. tampon tanımı. Ancak biraz da sezgilerinizi edinmek faydalı olabilir. göz atmayı unutmayın.
İki boş kabuk komut dosyasından oluşan basit bir Bazel çalışma alanını düşünün
foo.sh
ve foo_test.sh
ile şu BUILD
dosyası:
sh_library(
name = "foo_lib",
srcs = ["foo.sh"],
)
sh_test(
name = "foo_test",
srcs = ["foo_test.sh"],
deps = [":foo_lib"],
)
Bu projede bazel test ...
çalıştırırken, oluşturulan
aşağıdaki grafiğe benzeyecektir. Oklar,
söz konusu ebeveyn ile alt ilişkisi var. Bazı derleme etkinliklerinin ve
çoğu alan kısaltılması için atlandı.
Şekil 1. BEP grafiği.
Başlangıçta bir BuildStarted
etkinliği yayınlanır. Bu etkinlik bize
derleme bazel test
komutuyla çağrılır ve alt etkinlikleri duyurur:
OptionsParsed
WorkspaceStatus
CommandLine
UnstructuredCommandLine
BuildMetadata
BuildFinished
PatternExpanded
Progress
İlk üç etkinlik, Bazel'in nasıl çağrıldığıyla ilgili bilgi sağlar.
PatternExpanded
derleme etkinliği analiz sağlar
...
kalıbının hangi belirli hedeflere genişlediği:
//foo:foo_lib
ve //foo:foo_test
. Bunu yapmak için iki
Çocuk olarak TargetConfigured
etkinlik. TargetConfigured
etkinliğinin
Configuration
etkinliğini alt etkinlik olarak tanımlar, Configuration
olsa bile
, TargetConfigured
etkinliğinden önce yayınlandı.
Üst ve alt ilişkisinin yanı sıra etkinlikler de birbirini ifade edebilir.
kendi derleme etkinliği tanımlayıcılarını kullanır. Örneğin, yukarıdaki grafikte
TargetComplete
etkinliği, fileSets
içindeki NamedSetOfFiles
etkinliğine atıfta bulunuyor
girin.
Genellikle dosyayı yerleştirmeyen dosyalara referans veren etkinlikler oluşturun
belirten bir uyarı alır. Bunun yerine, derleme etkinliği tanımlayıcısını içerir.
Bu bir NamedSetOfFiles
etkinliğinin gerçek dosya adlarını ve
yollar. NamedSetOfFiles
etkinliği, bir grup dosyanın bir kez raporlanmasına olanak tanır ve
birçok hedef tarafından ifade edilir. Bu yapı gereklidir çünkü
bazı durumlarda, Build Event Protocol çıkış boyutu yeni bir başlangıç noktası
dosya sayısı. NamedSetOfFiles
etkinliğinin tüm dosyaları da bulunmayabilir
yerleştirilmiş olup bunun yerineNamedSetOfFiles
oluşturabilirsiniz.
Aşağıda //foo:foo_lib
için TargetComplete
etkinliğinin bir örneği verilmiştir
yukarıdaki grafikten, protokol arabelleğinin JSON gösterimi şeklinde basılmış bir hedef bulun.
Derleme etkinliği tanımlayıcısı, hedefi opak bir dize olarak içerir ve
Configuration
etkinliği için oluşturma etkinliği tanımlayıcısını kullanır. Etkinlik
çocuk etkinliklerini duyurmak için. Bu yük,
çıkış dosyaları kümesi ve hedefin türü gibi
geliştirmenizi sağlar.
{
"id": {
"targetCompleted": {
"label": "//foo:foo_lib",
"configuration": {
"id": "544e39a7f0abdb3efdd29d675a48bc6a"
}
}
},
"completed": {
"success": true,
"outputGroup": [{
"name": "default",
"fileSets": [{
"id": "0"
}]
}],
"targetKind": "sh_library rule"
}
}
BEP'deki Aspect Sonuçları
Sıradan derlemeler (target, configuration)
ile ilişkili işlemleri değerlendirir
çiftler. Yönler etkinken derleme yaparken Bazel,
belirli bir etkin özellikten etkilenen her hedef için (target, configuration,
aspect)
üçlü ile ilişkili hedefleri de değerlendirir.
Bu unsurlara ilişkin değerlendirme sonuçları BEP’de her ne kadar
özellik türü vardır. Bir (target, configuration)
çifti için
geçerli olması durumunda, Bazel ek TargetConfigured
ve
TargetComplete
o özelliğin
hedefi belirleyebilirsiniz. Örneğin, //:foo_lib
--aspects=aspects/myaspect.bzl%custom_aspect
, bu etkinlik şurada da görünecek:
BEP:
{
"id": {
"targetCompleted": {
"label": "//foo:foo_lib",
"configuration": {
"id": "544e39a7f0abdb3efdd29d675a48bc6a"
},
"aspect": "aspects/myaspect.bzl%custom_aspect"
}
},
"completed": {
"success": true,
"outputGroup": [{
"name": "default",
"fileSets": [{
"id": "1"
}]
}]
}
}
NamedSetOfFiles
tüketiliyor
Belirli bir hedef (veya unsur) tarafından üretilen yapıları belirlemek yaygın bir
BEP ile verimli bir şekilde
yapabileceğiniz bir kullanım alanıdır. Bu bölüm
NamedSetOfFiles
tarafından sunulan yinelemeli, paylaşılan yapıdan bahsediyor
ve bir Starlark Depset yapısıyla eşleşen etkinlik.
Tüketiciler işlem yaparken ikinci dereceden algoritmalardan kaçınmaya dikkat etmelidir
Büyük derlemeler on binlerce binlerce uygulama içerdiği için NamedSetOfFiles
etkinlikleri
ve bu tür olaylarla alakalı olarak geçiş sırasında yüz milyonlarca işlem
ikinci dereceden karmaşıklık.
Şekil 2. NamedSetOfFiles
BEP grafiği.
NamedSetOfFiles
etkinliği her zaman BEP akışında bir önce görünür
Kendisine referans veren TargetComplete
veya NamedSetOfFiles
etkinliği. Bu,
"üst-alt" teriminin tersidir ve birinci etkinlik dışındaki tüm etkinlikler
bildirimi alan en az bir etkinlikten sonra görünür. NamedSetOfFiles
etkinliği
bir Progress
etkinliği tarafından duyurulan, hiçbir anlam içermeyen.
Bu sıralama ve paylaşım kısıtlamaları göz önünde bulundurulduğunda, tipik bir tüketici tüm
BEP akışı bitene kadar NamedSetOfFiles
etkinlik. Aşağıdaki JSON
etkinlik akışı ve Python kodu, bir haritanın
"varsayılan" durumda derlenmiş yapıları hedeflemeye/en boy oranına ayarla ve bir sonraki ürünün
yerleşik hedeflerin/yönlerin bir alt kümesinin çıktılarını işleyin:
named_sets = {} # type: dict[str, NamedSetOfFiles]
outputs = {} # type: dict[str, dict[str, set[str]]]
for event in stream:
kind = event.id.WhichOneof("id")
if kind == "named_set":
named_sets[event.id.named_set.id] = event.named_set_of_files
elif kind == "target_completed":
tc = event.id.target_completed
target_id = (tc.label, tc.configuration.id, tc.aspect)
outputs[target_id] = {}
for group in event.completed.output_group:
outputs[target_id][group.name] = {fs.id for fs in group.file_sets}
for result_id in relevant_subset(outputs.keys()):
visit = outputs[result_id].get("default", [])
seen_sets = set(visit)
while visit:
set_name = visit.pop()
s = named_sets[set_name]
for f in s.files:
process_file(result_id, f)
for fs in s.file_sets:
if fs.id not in seen_sets:
visit.add(fs.id)
seen_sets.add(fs.id)