İşlevler

Sorun bildirin Kaynağı göster

İçindekiler

paket

package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)

Bu işlev, pakette sonraki her kural için geçerli olan meta verileri tanımlar. Paket içinde en fazla bir kez kullanılır (DERLE dosyası).

package() işlevi, dosyanın üst kısmındaki tüm yük() ifadelerinden hemen sonra, herhangi bir kuraldan önce çağrılmalıdır.

Bağımsız değişkenler

Özellik Açıklama
default_applicable_licenses

default_package_metadata için takma ad.

default_visibility

List of labels; optional

Bu paketteki kuralların varsayılan görünürlüğü.

Bu paketteki her kural, kuralın visibility özelliğinde aksi belirtilmedikçe bu özellikte belirtilen görünürlüğe sahiptir. Bu özelliğin söz dizimiyle ilgili ayrıntılı bilgi için görünürlük dokümanlarına bakın. Paket varsayılanı görünürlüğü, varsayılan olarak herkese açık olan exports_files için geçerli değildir.

default_deprecation

String; optional

Bu paketteki tüm kurallar için varsayılan deprecation mesajını ayarlar.

default_package_metadata

List of labels; optional

Paketteki diğer tüm hedefler için geçerli olan meta veri hedeflerinin varsayılan listesini oluşturur. Bunlar genellikle OSS paket ve lisans bildirimleriyle ilgili hedeflerdir. Örnekler için kural_lisansı bölümüne bakın.

default_testonly

Boolean; optional; default is False except as noted

Bu paketteki tüm kurallar için varsayılan testonly özelliğini belirler.

javatests altındaki paketlerde varsayılan değer 1'dir.

features

List strings; optional

Bu BUILD dosyasının semantiğini etkileyen çeşitli işaretleri ayarlar.

Bu özellik, özellikle bir tür özel işlem gerektiren paketleri etiketlemek için derleme sisteminde çalışan kişiler tarafından kullanılır. Derleme sisteminde çalışan biri tarafından açıkça istenmediği sürece bu özelliği kullanmayın.

Örnekler

Aşağıdaki beyan, bu paketteki kuralların yalnızca //foo:target paket grubunun üyeleri tarafından görülebileceğini ifade eder. Bir kuraldaki bağımsız görünürlük beyanları (varsa) bu spesifikasyonu geçersiz kılar.
package(default_visibility = ["//foo:target"])

paket_grubu

package_group(name, packages, includes)

Bu işlev, bir paket grubunu tanımlar ve bir etiketle grubu ilişkilendirir. Etikete visibility özelliklerinde referans verilebilir.

Paket grupları özellikle görünürlük kontrolü için kullanılır. Kaynak ağaçtaki her paketten herkese açık bir hedefe referans verilebilir. Gizli olarak görünür bir hedefe yalnızca kendi paketi içinde başvurulabilir (alt paketlere değil). Bu uç noktaları arasında, hedef kendi paketine ve bir veya daha fazla paket grubu tarafından açıklanan paketlere erişim izni verebilir. Görünürlük sisteminin daha ayrıntılı bir açıklaması için görünürlük özelliğine bakın.

Belirli bir paketin, packages özelliğiyle eşleşmesi veya includes özelliğinde bahsedilen diğer paket gruplarından birinde zaten yer alması durumunda grupta yer aldığı kabul edilir.

Paket grupları teknik olarak hedeflidir ancak kurallar tarafından oluşturulmaz ve kendileri herhangi bir görünürlük korumasına sahip değildir.

Bağımsız değişkenler

Özellik Açıklama
name

Name; required

Bu hedef için benzersiz bir ad.

packages

List of strings; optional

Sıfır veya daha fazla paket spesifikasyonu listesi.

Her paket spesifikasyonu dizesi aşağıdaki biçimlerden birine sahip olabilir:

  1. Çift eğik çizgiyle başlayan ve deposunun olmadığı tam paket adı. Örneğin //foo/bar, bu ada sahip olan ve paket grubuyla aynı depoda yer alan paketi belirtir.
  2. Yukarıda olduğu gibi ancak sonda /... ile. Örneğin, //foo/..., //foo kümesini ve tüm alt paketlerini belirtir. //..., geçerli depodaki tüm paketleri belirtir.
  3. Her paketin mevcut olup olmadığını belirten public veya private dizeleri. (Bu form için --incompatible_package_group_has_public_syntax işaretinin ayarlanması gerekir.)

Buna ek olarak, ilk iki paket spesifikasyonu türü de zorunlu tutulmadıklarını belirtmek için - önekine sahip olabilir.

Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ve negatif spesifikasyonlarının hiçbiriyle eşleşmeyen bir paket içeriyor. Örneğin, [//foo/..., -//foo/tests/...] değeri, aynı zamanda //foo/tests alt paketleri olmayan //foo tüm alt paketlerini içeriyor. (//foo dahil edilir ancak //foo/tests kendisi dahil değildir.)

Herkese açık görünmenin dışında, mevcut deponun dışındaki paketleri doğrudan belirtmenin bir yolu yoktur.

Bu özelliğin eksik olması, özelliğin boş bir listeye ayarlanmasıyla aynı şeydir. Bu, yalnızca private içeren bir listeye ayarlanmasıyla aynıdır.

Not: Bazel 6.0'dan önce //... spesifikasyonunda, public ile aynı olan eski bir davranış bulunuyordu. --incompatible_fix_package_group_reporoot_syntax etkinleştirildiğinde bu davranış düzeltilir. Varsayılan değer, Bazel 6.0'dan sonraki varsayılan ayardır.

Not: Bu özellik bazel query --output=proto (veya --output=xml) kapsamında serileştirildiğinde Bazel 6.0'dan önce baştaki eğik çizgiler atlanır. Örneğin //pkg/foo/..., \"pkg/foo/...\" şeklinde çıkış verir. Bu davranış, --incompatible_package_group_includes_double_slash etkinleştirildiğinde düzeltilir. Varsayılan mod, Bazel 6.0'dan sonra varsayılan seçenektir.

includes

List of labels; optional

Buna dahil olan diğer paket grupları.

Bu özellikteki etiketler, diğer paket gruplarına referans vermelidir. Başvurulan paket gruplarındaki paketler, bu paket grubunun bir parçası olarak alınır. Bu geçişli bir işlemdir. a paket grubu b paket grubunu, b paket grubunu c içeriyorsa c içindeki her paket ayrıca a üyesi olur.

Zorunlu paket spesifikasyonlarıyla birlikte kullanıldığında her bir grubun paket grubunun bağımsız olarak hesaplandığını ve sonuçların birlikte birleştirildiğini unutmayın. Bu, bir gruptaki negatif özelliklerin başka bir gruptaki spesifikasyonlar üzerinde hiçbir etkisi olmadığı anlamına gelir.

Örnekler

Aşağıdaki package_group beyanı, tropik meyveler içeren "tropikal" adlı bir paket grubunu belirtmektedir.

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

Aşağıdaki bildirimler, kurgusal bir uygulamanın paket gruplarını belirtir:

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

dışa_aktarılan_dosyalar

exports_files([label, ...], visibility, licenses)

exports_files(), bu pakete ait olan ve diğer paketlere aktarılan dosyaların listesini belirtir.

Bir paketin DERLEME dosyası, yalnızca bir exports_files() ifadesiyle açıkça dışa aktarıldığında başka bir pakete ait kaynak dosyalara doğrudan başvuruda bulunabilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.

Eski bir davranış olarak, bir kurala giriş olarak belirtilen dosyalar da --incompatible_no_implicit_file_export işareti tersine kaydırılana kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa dayanmamalı ve bu davranıştan etkin bir şekilde uzaklaşılmamalıdır.

Bağımsız değişkenler

Bağımsız değişken, geçerli paketteki dosya adlarının bir listesidir. Görünürlük beyanı da belirtilebilir. Bu durumda, dosyalar belirtilen hedefler tarafından görülebilir. Görünürlük belirtilmediğinde package işlevinde paket varsayılan görünürlüğü belirtilmiş olsa bile dosyalar her paket tarafından görülebilir. Lisanslar da belirtilebilir.

Örnek

Aşağıdaki örnekte, test_data paketindeki bir metin dosyası olan golden.txt dışa aktarılmaktadır. Böylece diğer paketler, örneğin testlerin data özelliğinde bu dosyayı kullanabilir.

# from //test_data/BUILD

exports_files(["golden.txt"])

glob

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

Glob, belirli yol kalıplarıyla eşleşen tüm dosyaları bulan ve yollarının yeni, değiştirilemez, sıralı bir listesini döndüren yardımcı bir işlevdir. Glob, yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları (oluşturulan dosyalar veya diğer hedefler değil) arar.

Dosyanın pakete özgü yolu include kalıplarından herhangi biriyle eşleşirse ve exclude kalıplarından hiçbiriyle eşleşmezse kaynak dosyanın etiketi sonuca dahil edilir.

include ve exclude listeleri, geçerli pakete göre yol kalıpları içerir. Her kalıp, bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında olduğu gibi, bu segmentler de / ile ayrılır. Segmentlerde * joker karakteri bulunabilir: Bu, dizin ayırıcısı / hariç olmak üzere yol segmentindeki herhangi bir alt dizeyle (boş alt dize bile olsa) eşleşir. Bu joker karakter bir yol segmentinde birden fazla kez kullanılabilir. Ayrıca, ** joker karakteri sıfır veya daha eksiksiz yol segmentleriyle eşleşebilir ancak bağımsız bir yol segmenti olarak tanımlanması gerekir.

Örnekler:
  • foo/bar.txt, bu paketteki foo/bar.txt dosyayla tam olarak eşleşiyor
  • foo/*.txt, dosya .txt ile bitiyorsa (foo/ alt paket değilse) foo/ dizinindeki her dosyayla eşleşir
  • foo/a*.htm*, foo/ dizininde a ile başlayan, rastgele bir dizeye sahip (boş olabilir), ardından .htm içeren ve başka bir rastgele dizeyle (ör. foo/axx.htm, foo/a.html veya foo/axxx.html) biten her dosyayla eşleşir
  • **/a.txt, bu paketin her alt dizinindeki her a.txt dosyasıyla eşleşir
  • **/bar/**/*.txt, bu yoldaki her bir alt dizindeki her .txt dosyasıyla eşleşir. Sonuçta ortaya çıkan yolda en az bir dizin bar olarak adlandırılırsa (xxx/bar/yyy/zzz/a.txt veya bar/a.txt gibi) ** (bunun da sıfır segmentle eşleştiğini unutmayın) veya bar/zzz/a.txt
  • **, bu paketin her alt dizinindeki her dosyayla eşleşir
  • foo**/a.txt geçersiz bir kalıp olduğundan ** segmentin kendisi olarak bir

exclude_directories bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanır) tür dizinindeki dosyalar sonuçlardan çıkarılır (varsayılan 1).

allow_empty bağımsız değişkeni False olarak ayarlanırsa sonuç boş değilse glob işlevi hata verir.

Bazı önemli sınırlamalar ve uyarılar vardır:

  1. glob(), DERLEME dosyası değerlendirmesi sırasında çalıştığı için glob(), yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiçbir zaman oluşturulmamış dosyaları eşleştirir. Hem kaynak hem de oluşturulan dosyaları gerektiren bir hedef oluşturuyorsanız oluşturulan dosyaların açık bir listesini glob'a eklemeniz gerekir. :mylib ve :gen_java_srcs ile ilgili aşağıdaki örneğe bakın.

  2. Bir kural, eşleşen kaynak dosyayla aynı ada sahipse dosyayı "gölgelendirir".

    Bunu anlamak için glob()'nin bir yol listesi döndürdüğünü unutmayın.Bu nedenle, diğer kuralların özelliğinde (ör. srcs = glob(["*.cc"])) glob() etiketinin kullanılması, eşleşen yolları açık bir şekilde listelemeyle aynı etkiye sahiptir. Örneğin glob(), ["Foo.java", "bar/Baz.java"] özelliğini sağlıyor ancak pakette "Foo.java" adlı bir kural varsa (Bael bununla ilgili uyarıda bulunmasına izin veriliyorsa) glob() ürününün tüketicisi, "Foo.java" dosyası yerine "Foo.java" kuralını (çıkışları) kullanacaktır. Daha fazla bilgi için GitHub #10395 sorunu sayfasına bakın.

  3. Yerküreler, alt dizinlerdeki dosyalarla eşleşebilir. Alt dizin adlarına da joker karakter eklenebilir. Ancak...
  4. Etiketlerin paket sınırını aşmasına izin verilmez ve glob, alt paketlerdeki dosyalarla eşleşmez.

    Örneğin, x paketindeki glob ifadesi x/y/z.cc, x/y bir paket olarak mevcutsa (x/y/BUILD olarak veya paket yolunda başka bir yerde) yer almaz. Yani glob ifadesinin sonucu, BUILD dosyalarının varlığına bağlıdır. Yani aynı glob ifadesi, x/y adında bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlendiyse bu ifadeyi de içerir.

  5. Yukarıdaki kısıtlama, hangi joker karakterleri kullanırsa kullansınlar tüm glob ifadeleri için geçerlidir.
  6. . ile başlayan dosya adına sahip gizli bir dosya hem ** hem de * joker karakteriyle tamamen eşleşir. Gizli bir dosyayı bileşik bir kalıpla eşleştirmek istiyorsanız kalıbınızın . ile başlaması gerekir. Örneğin, * ve .*.txt .foo.txt ile eşleşecektir ancak *.txt eşleşmeyecektir. Gizlenen dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak kullanılması gerekmeyen dosyaları içerebilir ve gereksiz şekilde sıkıştırılmış dosya sayısını ve bellek tüketimini artırabilir. Hariç tutmak istediğiniz dizinleri "hariç tutma" liste bağımsız değişkenine ekleyin.
  7. "**" joker karakterinin bir köşesi vardır: "**" kalıbı, paketin dizin yoluyla eşleşmiyor. Yani glob(["**"], exclude_directories = 0), tüm dosyaları ve dizinleri sıkı bir şekilde mevcut paketin diziniyle eşleştirir (ancak elbette alt paket dizinlerine girmez; bununla ilgili önceki notu inceleyin).

Genel olarak, bir glob kalıbı için basit bir "*" karakteri kullanmak yerine uygun bir uzantı (ör. *.html) sağlamaya çalışmalısınız. Daha açık olan ad hem kendi kendine belgeleme hem de emacs/vi/... dosyalarını yanlışlıkla eşleştirmemenizi ve dosyaları otomatik kaydetmemenizi sağlar.

Derleme kuralları yazarken glob öğelerini sıralayabilirsiniz. Bu sayede, örneğin her giriş için ayrı kurallar oluşturabilirsiniz. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.

Yerküre Örnekleri

Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs kuralıyla oluşturulan tüm dosyalardan oluşturulmuş bir Java kitaplığı oluşturun.

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

Experimental.txt haricinde, tüm test dosyalarını dizin test verilerine ekleyin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız yinelenen bir glob (**) kullanın.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

Yineleme Küresi Örnekleri

Testin, testdata dizinindeki ve tüm alt dizinlerindeki (ve bunların alt dizinlerinde vb.) tüm txt dosyalarına bağlı olmasını sağlayın. DERLEME dosyası içeren alt dizinler yoksayılır. (Yukarıdaki sınırlamaları ve uyarıları inceleyin.)

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

Yolundaki "test" adlı bir dizin içeren dizinler hariç, bu dizindeki tüm Java dosyalarından ve tüm alt dizinlerden oluşturulan bir kitaplık oluşturun. Derleme artımlılığını azaltabileceğinden ve bu şekilde derleme sürelerini artırabileceğinden, bu kalıptan kaçınılmalıdır.

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

Genişletilmiş Küre Örnekleri

Mevcut dizinde *_test.cc için dosyadaki satırların sayısını hesaplayan bağımsız bir kişi grubu oluşturun.

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

Yukarıdaki DERLEME dosyası //foo paketindeyse ve paket üç eşleşen dosya içeriyorsa a_test.cc, b_test.cc ve c_test.cc dosyalarını çalıştırırsanız bazel query '//foo:all' oluşturulan tüm kurallar listelenir:

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test

seçer

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select(), kural özelliğini yapılandırılabilir hâle getiren yardımcı işlevdir. Neredeyse herhangi bir özellik atamasının sağ tarafını değiştirebilir. Böylece değeri, komut satırı Bazel flag'lerine bağlı olur. Örneğin, platforma özgü bağımlılıklar tanımlamak veya bir kuralın "geliştirici" ve "sürüm" modunda oluşmasına bağlı olarak farklı kaynaklar yerleştirmek için bunu kullanabilirsiniz.

Temel kullanım şekli şöyledir:

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

Bu, sh_binary öğesinin srcs özelliğini, normal etiket listesi atamasını, yapılandırma koşullarını eşleşen değerlerle eşleyen bir select çağrısıyla değiştirerek yapılandırılabilir hale getirir. Her koşul, hedefin yapılandırması beklenen bir değer grubuyla eşleşiyorsa "eşleşen" bir config_setting veya constraint_value için bir etiket referansıdır. Daha sonra mytarget#srcs değeri, mevcut çağrıyla eşleşen etiket listesi olur.

Notlar:

  • Herhangi bir çağrıda tam olarak bir koşul seçilir.
  • Birden fazla koşul eşleşiyorsa ve biri diğerlerinin bir uzmanlığıysa uzmanlık önceliklidir. B koşulu A ile aynı işaretlere ve kısıtlama değerlerine ve bazı ek işaretler veya kısıtlama değerlerine sahipse B koşulu, A koşulunun bir uzmanlığı olarak kabul edilir. Bu, uzmanlık çözümünün aşağıdaki 2. Örnek'te gösterildiği gibi bir sipariş oluşturmak için tasarlanmadığı anlamına da gelir.
  • Birden fazla koşul eşleşiyor ve biri diğer tüm özelliklerin konusunda uzman değilse tüm koşullar aynı değere çözümlenmediği sürece Bazel hatayla başarısız olur.
  • Başka bir koşul eşleşmezse özel sözde //conditions:default etiketinin eşleştiği kabul edilir. Bu koşul dışarıda bırakılırsa hata olmaması için diğer bazı kuralların eşleşmesi gerekir.
  • select, daha büyük bir özellik atamasının içine yerleştirilebilir. Bu nedenle srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) ve srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]}) geçerli ifadelerdir.
  • select tüm özelliklerle olmasa da çoğu özellikle çalışır. Uyumsuz özellikler, dokümanlarında nonconfigurable olarak işaretlenir.

    alt paketler

    subpackages(include, exclude=[], allow_empty=True)

    subpackages(), dosyalar ve dizinler yerine alt paketleri listeleyen glob() özelliğine benzeyen bir yardımcı işlevdir. glob() ile aynı yol kalıplarını kullanır ve şu anda yüklenen BUILD dosyasının doğrudan alt öğesi olan herhangi bir alt paketle eşleşebilir. Dahil etme ve hariç tutma kalıplarının ayrıntılı bir açıklaması ve örnekleri için glob sayfasına bakın.

    Döndürülen alt paketlerin listesi sıralanmış haldedir ve exclude içindekiyle değil, include'deki belirli kalıplarla eşleşen mevcut yükleme paketine göre yollar içerir.

    Örnek

    Aşağıdaki örnekte foo/BUILD paketinin tüm doğrudan alt paketleri listelenmektedir

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs = subpackages(include = ["**"])
    
    # results in subs == ["sub", "bar/baz"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    

    Genel olarak, bu işlevi doğrudan çağırmak yerine, kullanıcıların skylib'in "alt paketler" modülünü kullanmaları tercih edilir.