Derleme Etkinliği Protokolü Örnekleri

Sorun bildirin Kaynağı göster

Derleme Etkinliği Protokolü'nün tüm spesifikasyonu, protokol arabelleği tanımında bulunabilir. Ancak spesifikasyona bakmadan önce biraz sezgi oluşturmak faydalı olabilir.

foo.sh ve foo_test.sh adlı iki boş kabuk komut dosyası ile aşağıdaki BUILD dosyasından oluşan basit bir Bazel çalışma alanını 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 benzeyecektir. Oklar, yukarıda bahsedilen üst ve alt ilişkisini gösterir. Bazı derleme etkinliklerinin ve çoğu alanın kısaltılması için çıkarıldığını unutmayın.

bep-graph

Şekil 1. BEP grafiği.

Başlangıçta bir BuildStarted etkinliği yayınlanır. Etkinlik, derlemenin bazel test komutu aracılığıyla çağrıldığını bize bildirir 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, ... kalıbının hangi belirli hedeflere genişlediği hakkında bilgi 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şkisinin yanı sıra etkinlikler de oluşturma etkinliği tanımlayıcıları kullanılarak birbirlerine işaret edebilir. Örneğin, yukarıdaki grafikte TargetComplete etkinliği, fileSets alanındaki NamedSetOfFiles etkinliğine başvuruda bulunur.

Dosyalara atıfta bulunan derleme 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. Daha sonra bu etkinlik, gerçek dosya adlarını ve yollarını içerir. NamedSetOfFiles etkinliği, bir grup dosyanın bir kez raporlanmasına ve birçok hedef tarafından atıfta bulunulmasına olanak tanır. Aksi takdirde, bazı durumlarda Derleme Etkinlik Protokolü çıkış boyutu, dosya sayısıyla birlikte ikinci dereceye kadar büyüyeceğinden bu yapı gereklidir. Ayrıca bir NamedSetOfFiles etkinliğine tüm dosyalar yerleştirilmemiş olabilir. Bunun yerine, oluşturma etkinliği tanımlayıcıları aracılığıyla diğer NamedSetOfFiles etkinliklerine referans verilir.

Aşağıda, yukarıdaki grafikte yer alan ve //foo:foo_lib hedefi için protokol arabelleğinin JSON temsilinde basılı olan TargetComplete etkinliğinin bir örneği bulunmaktadı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 başvuruda bulunur. Etkinlikte hiçbir alt etkinlik duyurulmaz. Yük, hedefin başarılı bir şekilde oluşturulup oluşturulmadığı, çıkış dosyaları kümesi ve oluşturulan hedefin türü ile ilgili bilgileri 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 Aspect Sonuçları

Sıradan derlemeler, (target, configuration) çiftiyle ilişkili işlemleri değerlendirir. Bazel, yönleri etkinleştirerek derleme yaparken, belirli bir etkin özellikten etkilenen her hedef için (target, configuration, aspect) üçlüyle ilişkili hedefleri de değerlendirir.

Konuya özgü etkinlik türleri bulunmasa bile, unsurlara ilişkin değerlendirme sonuçları BEP'de mevcuttur. Bazel, uygun bir yönü olan her (target, configuration) çifti için söz konusu özelliğin hedefe uygulanmasından 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 derlenirse şu 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 unsur) tarafından üretilen yapıları belirlemek, bir miktar hazırlıkla verimli bir şekilde yapılabilecek, yaygın olarak kullanılan bir BEP kullanım alanıdır. Bu bölümde, bir Starlark Depset'in yapısına uygun olan NamedSetOfFiles etkinliği tarafından sunulan yinelemeli ve paylaşılan yapı ele alınmaktadır.

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

namesetoffiles-bep-graph

Şekil 2. NamedSetOfFiles BEP grafiği.

NamedSetOfFiles etkinliği, bu etkinliğe referans veren TargetComplete veya NamedSetOfFiles etkinliğinden önce BEP akışında her zaman görünür. Bu, "üst-alt" etkinlik ilişkisinin tersidir. Burada, ilk etkinlik dışındaki her etkinlik, onu duyuran en az bir etkinlikten sonra görünür. Bir NamedSetOfFiles etkinliği, anlamsız bir Progress etkinliği tarafından duyurulur.

Bu sipariş ve paylaşım kısıtlamaları nedeniyle, normal bir tüketici BEP akışı bitene kadar tüm NamedSetOfFiles etkinliklerini arabelleğe almalıdır. Aşağıdaki JSON etkinlik akışı ve Python kodu, bir haritanın "varsayılan" çıkış grubundaki hedeften/aspect'ten yerleşik yapılara nasıl doldurulacağını ve oluşturulmuş hedeflerin/yönlerin bir alt kümesi için çıkışların nasıl işleneceğini göstermektedir:

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)