Derleme Etkinliği Protokolü Örnekleri

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Build Event Protocol'ün tam spesifikasyonunu protokol arabellek tanımında bulabilirsiniz. Ancak, spesifikasyona bakmadan önce biraz sezgi geliştirmek faydalı olabilir.

foo.sh ve foo_test.sh olmak üzere iki boş kabuk komut dosyasından ve aşağıdaki BUILD dosyasından oluşan basit bir Bazel çalışma alanı düşünün:

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ıldığında, oluşturulan derleme etkinliklerinin derleme grafiği aşağıdaki grafiğe benzer. Oklar, yukarıda bahsedilen üst ve alt öğe ilişkisini gösterir. Bazı derleme etkinliklerinin ve çoğu alanın kısa olması için çıkarıldığını unutmayın.

bep-graph

1.şekil BEP grafiği.

Başlangıçta BuildStarted etkinliği yayınlanır. Bu etkinlik, derlemenin bazel test komutuyla çağrıldığını bildirir ve alt etkinlikleri duyurur:

  • OptionsParsed
  • WorkspaceStatus
  • CommandLine
  • UnstructuredCommandLine
  • BuildMetadata
  • BuildFinished
  • PatternExpanded
  • Progress

İlk üç etkinlik, Bazel'in nasıl çağrıldığı hakkında bilgi sağlar.

PatternExpanded build etkinliği, ... kalıbının hangi hedeflere genişlediği hakkında bilgi sağlar: //foo:foo_lib ve //foo:foo_test. Bunu, iki TargetConfigured etkinliğini alt öğe olarak bildirerek yapar. Configuration etkinliği, TargetConfigured etkinliğinden önce yayınlanmış olsa bile TargetConfigured etkinliğinin Configuration etkinliğini alt etkinlik olarak bildirdiğini unutmayın.

Etkinlikler, üst ve alt etkinlik ilişkisinin yanı sıra derleme etkinliği tanımlayıcılarını kullanarak da birbirlerine başvurabilir. Örneğin, yukarıdaki grafikteki TargetComplete etkinliği, fileSets alanındaki NamedSetOfFiles etkinliğini ifade eder.

Dosyalara referans veren derleme etkinlikleri genellikle dosya adlarını ve yollarını etkinliğe yerleştirmez. Bunun yerine, NamedSetOfFiles etkinliğinin derleme etkinliği tanımlayıcısını içerirler. Bu tanımlayıcı daha sonra gerçek dosya adlarını ve yollarını içerir. NamedSetOfFiles etkinliği, bir dosya grubunun bir kez raporlanmasına ve birçok hedef tarafından referans olarak kullanılmasına olanak tanır. Aksi takdirde, bazı durumlarda Build Event Protocol çıkış boyutu dosya sayısıyla birlikte karesel olarak artacağından bu yapı gereklidir. Bir NamedSetOfFiles etkinliğinin tüm dosyaları yerleştirilmemiş olabilir. Bunun yerine, derleme etkinliği tanımlayıcıları aracılığıyla diğer NamedSetOfFiles etkinliklerine başvurulabilir.

Aşağıda, yukarıdaki grafikteki //foo:foo_lib hedefi için TargetComplete etkinliğinin protokol arabelleğinin JSON gösteriminde yazdırılmış bir örneği verilmiştir. Derleme etkinliği tanımlayıcısı, hedefi opak bir dize olarak içerir ve derleme etkinliği tanımlayıcısını kullanarak Configuration etkinliğini ifade eder. Etkinlikte çocuk etkinlikleri duyurulmuyor. Yük, hedefin başarıyla oluşturulup oluşturulmadığı, çıkış dosyaları grubu ve oluşturulan hedef türü hakkında bilgiler içerir.

{
  "id": {
    "targetCompleted": {
      "label": "//foo:foo_lib",
      "configuration": {
        "id": "544e39a7f0abdb3efdd29d675a48bc6a"
      }
    }
  },
  "completed": {
    "success": true,
    "outputGroup": [{
      "name": "default",
      "fileSets": [{
        "id": "0"
      }]
    }],
    "targetKind": "sh_library rule"
  }
}

BEP'deki Görünüm Sonuçları

Normal derlemeler, (target, configuration)çiftlerle ilişkili işlemleri değerlendirir. Aspects etkinleştirilmişken derleme yapıldığında Bazel, etkinleştirilmiş belirli bir aspect'ten etkilenen her hedef için (target, configuration, aspect) üçlüleriyle ilişkili hedefleri de değerlendirir.

Özelliklere özel etkinlik türleri olmamasına rağmen, BEP'de yönlerle ilgili değerlendirme sonuçları mevcuttur. Geçerli bir yönü olan her (target, configuration) çifti için Bazel, yönün hedefe uygulanmasıyla elde edilen sonucu içeren ek bir TargetConfigured ve TargetComplete etkinliği yayınlar. Örneğin, //:foo_lib, --aspects=aspects/myaspect.bzl%custom_aspect ile oluşturulmuşsa bu etkinlik BEP'de de görünür:

{
  "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 yön) tarafından üretilen yapıları belirlemek, bazı hazırlıklarla verimli bir şekilde yapılabilecek yaygın bir BEP kullanım alanıdır. Bu bölümde, NamedSetOfFiles etkinliğinin sunduğu, Starlark Depset'in yapısıyla eşleşen yinelemeli, paylaşılan yapı ele alınmaktadır.

Tüketiciler, NamedSetOfFiles etkinliklerini işlerken ikinci dereceden algoritmaları kullanmaktan kaçınmalıdır. Çünkü büyük derlemeler on binlerce bu tür etkinlik içerebilir ve bu da ikinci dereceden karmaşıklığa sahip bir geçişte yüz milyonlarca işlem gerektirir.

namedsetoffiles-bep-graph

Şekil 2. NamedSetOfFiles BEP grafiği.

Bir NamedSetOfFiles etkinliği, BEP akışında her zaman kendisine referans veren bir TargetComplete veya NamedSetOfFiles etkinliğinden önce görünür. Bu, "üst-alt" etkinlik ilişkisinin tersidir. Bu ilişkide, ilk etkinlik hariç tüm etkinlikler, kendilerini duyuran en az bir etkinlikten sonra görünür. NamedSetOfFiles etkinliği, semantiği olmayan bir Progress etkinliğiyle duyurulur.

Bu sıralama ve paylaşım kısıtlamaları göz önüne alındığında, tipik bir tüketicinin BEP akışı tükenene kadar tüm NamedSetOfFiles etkinliklerini arabelleğe alması gerekir. Aşağıdaki JSON etkinlik akışı ve Python kodu, "default" çıkış grubundaki derlenmiş yapılarla hedef/görünüm arasındaki eşlemenin nasıl doldurulacağını ve derlenmiş hedef/görünümlerin bir alt kümesi için çıkışların nasıl işleneceğini gösterir:

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)