Derleme Etkinliği Protokolü Örnekleri

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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

bep-graph

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

namedsetoffiles-bep-graph

Ş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)