Derleme Etkinliği Protokolü Örnekleri

Sorun bildir Kaynağı göster

Derleme Etkinliği Protokolü'nün tam spesifikasyonu, protokol arabellek tanımında bulunabilir. Ancak spesifikasyona bakmadan önce sezgilerinizi oluşturmak faydalı olabilir.

İki boş kabuk komut dosyası (foo.sh ve foo_test.sh) 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ılırken oluşturulan derleme etkinliklerinin derleme grafiği aşağıdaki grafiğe benzeyecektir. Oklar, yukarıda sözü edilen üst ve alt ilişkiyi gösterir. Bazı derleme etkinliklerinin ve çoğu alanın kısa olması için atlandığını unutmayın.

bep-grafik

Şekil 1. BEP grafiği.

Başlangıçta bir BuildStarted etkinliği yayınlanır. Etkinlik bize, derlemenin bazel test komutu aracılığıyla çağrıldığını bildirir ve alt etkinlikleri duyurur:

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

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

PatternExpanded derleme etkinliği, ... kalıbının hangi belirli hedeflere genişletildiğine dair analiz sağlar: //foo:foo_lib ve //foo:foo_test. Bunu, iki TargetConfigured etkinliğini alt öğe olarak tanımlayarak yapar. Configuration, TargetConfigured etkinliğinden önce yayınlanmış olsa bile TargetConfigured etkinliğinin Configuration etkinliğini alt etkinlik olarak tanımladığını unutmayın.

Üst ve alt ilişkinin yanı sıra etkinlikler, derleme etkinliği tanımlayıcılarını kullanarak birbirlerine de işaret edebilir. Örneğin, yukarıdaki grafikte TargetComplete etkinliği, fileSets alanındaki NamedSetOfFiles etkinliğine karşılık gelir.

Dosyalara referans veren etkinlik oluşturma etkinlikleri genellikle dosya adlarını ve yolları etkinliğe yerleştirmez. Bunun yerine, bir NamedSetOfFiles etkinliğinin derleme etkinliği tanımlayıcısını içerir. Bu tanımlayıcı, 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 belirtilmesine olanak tanır. Aksi takdirde, Derleme Etkinlik Protokolü'nün çıkış boyutu dosya sayısıyla birlikte ikinci dereceden artacağı için bu yapı gereklidir. Bir NamedSetOfFiles etkinliğine tüm dosyaları yerleştirilmiş olmayabilir ancak bunun yerine, derleme etkinliği tanımlayıcıları üzerinden diğer NamedSetOfFiles etkinliklerine başvuruda bulunabilir.

Aşağıda, yukarıdaki grafikten //foo:foo_lib hedefi için TargetComplete etkinliğinin bir örneği verilmiştir. Protokol arabelleğinin JSON gösteriminde bu etkinlik yazdırılır. 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ğine referans verir. Bu etkinlik, herhangi bir alt etkinlik duyurusu yapmaz. Yük; hedefin başarıyla derlenip derlenmediği, çıkış dosyaları grubu ve oluşturulan hedefin 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'de En Boy Sonuçları

Sıradan derlemeler, (target, configuration) çiftle ilişkili işlemleri değerlendirir. Bazel, görünümler etkin olarak derleme yaparken, belirli bir etkin unsurdan etkilenen her hedef için (target, configuration, aspect) üçlüyle ilişkili hedefleri de değerlendirir.

Boyuta özgü etkinlik türleri olmasa da yönler için değerlendirme sonuçları BEP'de mevcuttur. Bazel, geçerli bir özelliği olan her bir (target, configuration) çifti için ek bir TargetConfigured ve TargetComplete etkinliği yayınlar. Bu etkinlik, söz konusu özelliğin hedefe uygulanmasının sonucudur. Örneğin, //:foo_lib --aspects=aspects/myaspect.bzl%custom_aspect ile derlenmişse 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 en boy oranı) tarafından üretilen yapıların belirlenmesi, biraz hazırlıkla verimli bir şekilde yapılabilen yaygın bir BEP kullanım alanıdır. Bu bölümde NamedSetOfFiles etkinliği tarafından sunulan ve Starlark Depset yapısıyla eşleşen yinelemeli, paylaşılan yapı ele alınmaktadır.

Büyük derlemeler, bu tür on binlerce etkinliği içerebileceği ve ikinci dereceden karmaşık bir geçişte yüz milyonlarca işlem gerektirebileceği için tüketiciler NamedSetOfFiles etkinliklerini işlerken ikinci dereceden algoritmalardan kaçınmaya dikkat etmelidir.

adlandırılmışsetoffiles-bep-graph

2. Şekil. NamedSetOfFiles BEP grafiği.

NamedSetOfFiles etkinliği, kendisine referans veren bir TargetComplete veya NamedSetOfFiles etkinliğinden önce BEP akışında her zaman görünür. Bu, "üst-alt-öğe" etkinlik ilişkisinin tersidir. Bu ilişkide, ilk etkinlik hariç en az bir etkinlik duyurulduktan sonra tüm etkinlik görünür. Bir NamedSetOfFiles etkinliği, anlam içermeyen bir Progress etkinliği tarafından duyurulur.

Bu sıralama ve paylaşım kısıtlamaları nedeniyle, tipik bir tüketicinin BEP akışı bitene kadar tüm NamedSetOfFiles etkinliklerini arabelleğe alması gerekir. Aşağıdaki JSON etkinlik akışı ve Python kodu, bir haritanın "varsayılan" çıkış grubundaki hedef/boyuttan derlenmiş yapılara nasıl doldurulacağını ve oluşturulmuş hedeflerin/yüzlerin bir alt kümesi için çıktı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)