İşlevler

Sorun bildir Kaynağı görüntüle Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

İçindekiler

paket

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

Bu işlev, paketinden yararlanın. Bir pakette (BUILD dosyası) en fazla bir kez kullanılır.

Bütünlükteki her kurala meta verilerin uygulandığını tanımlayan diğer taraf için depo için repo() işlevini REPO.bazel dosyasını eklemeniz gerekir. repo() işlevi, package() ile tamamen aynı bağımsız değişkenleri alır.

package() işlevi, dosyanın üst kısmındaki tüm load() 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

Etiket listesi; varsayılan değer []

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

Kuralın visibility özelliğinde aksi belirtilmediği sürece, bu paketteki her kuralın görünürlük özelliği bu özellikte belirtilir. Bu özelliği için görünürlük belgelerine bakın. Paketin varsayılan görünürlüğü şunlar için geçerli değildir: exports_files varsayılan olarak herkese açıktır.

default_deprecation

String; varsayılan değer ""

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

default_package_metadata

Etiketler listesi; varsayılan değer []'dir.

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

default_testonly

Boole; belirtildiği gibi varsayılan değer False ise

Bu paketteki tüm kurallar için varsayılan testonly mülkünü ayarlar.

javatests altındaki paketlerde varsayılan değer True'dur.

features

Liste dizeleri varsayılan değer []

Bu BUILD dosyasının anlamını etkileyen çeşitli işaretler ayarlar.

Bu özellik genellikle derleme sistemi üzerinde çalışan kişiler tarafından etiket paketlerinin olması gerekir. Derleme sisteminde çalışan biri tarafından açıkça istenmediği sürece bunu kullanmayın.

Örnekler

Aşağıdaki beyan, bu paketteki kuralların yalnızca //foo:target paket grubunun üyelerine gösterileceğini belirtir. Bir kuralda varsa ayrı görünürlük beyanları bu spesifikasyonu geçersiz kılar.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

Bu işlev bir paket grubunu tanımlar ve bir etiketi kümeyle ilişkilendirir. Etiket, visibility özelliklerinde referans olarak kullanılabilir.

Paket grupları, öncelikli olarak görünürlük kontrolü için kullanılır. Herkes tarafından görülebilen bir hedefe, kaynak ağaçtaki her paketten referans verilebilir. Özel olarak Görünür hedefe yalnızca kendi paketi içinde referans verilebilir (alt paketlerde değil). Bu uç noktalar arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından açıklanan paketlerin sayısı. Görünürlük sisteminin daha ayrıntılı bir açıklaması için visibility özelliğine bakın.

Belirli bir paket, packages özelliği ya da diğer özelliklerden birinde zaten mevcut includes özelliğinde bahsedilen paket grupları.

Paket grupları teknik olarak hedeflerdir ancak kurallar tarafından oluşturulmaz ve veya görünürlük korumasına sahip değiller.

Bağımsız değişkenler

Özellik Açıklama
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

packages

Dize listesi; varsayılan değer []

Sıfır veya daha fazla paket spesifikasyonu içeren bir liste.

Her paket spesifikasyonu dizesinde aşağıdakilerden biri olabilir formlar:

  1. Deposu olmadan bir paketin tam adı, çift eğik çizgiyle başlar. Örneğin, //foo/bar, paketi belirtir paketle aynı depoda bulunan ve paketle aynı depoda bulunan grubu.
  2. Yukarıdakiyle aynıdır ancak sonuna /... eklenir. Örneğin //foo/..., //foo kümesini ve tüm alt paketler. //..., geçerli depodaki tüm paketleri belirtir.
  3. Kullanılan public veya private dizeleri her paketi ya da hiçbir paketi belirtmez. (Bu form için --incompatible_package_group_has_public_syntax işaretinin ayarlanması gerekir.)

Ayrıca, ilk iki paket spesifikasyonu türü ayrıca dikkate alınmadığını belirtmek için - ön ekini almalıdır.

Paket grubu, hiçbir olumsuz özelliği değil, olumlu özellikleri var Örneğin, [//foo/..., -//foo/tests/...] değeri //foo ürününün tüm alt paketlerini içerir ve //foo/tests alt paketleri. (//foo kendisi dahil edilmemektedir.)

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

Bu özellik eksikse, Bu, aynı zamanda listeyi içeren bir listeye ayarlamakla aynı şekilde, yalnızca private.

Not: Bazel 6.0'dan önceki sürümlerde //... , public ile aynı şekilde eski bir davranışa sahipti. Bu davranışın sabit olduğunu --incompatible_fix_package_group_reporoot_syntax Bu, Bazel 6.0'dan sonra varsayılan olarak etkindir.

Not: Bazel 6.0'dan önce bu özellik bazel query --output=proto (veya --output=xml) parçası olarak serileştirildiğinde ön eğik çizgiler atlanır. Örneğin, //pkg/foo/... örneğinin çıkışı olarak \"pkg/foo/...\". Bu davranış, Bazel 6.0'dan sonra varsayılan olarak etkinleştirilen --incompatible_package_group_includes_double_slash etkinleştirildiğinde düzeltilir.

includes

Etiketler listesi; varsayılan değer []'dir.

Bu gruba dahil olan diğer paket grupları.

Bu özellikteki etiketler diğer paket gruplarına atıfta bulunmalıdır. Referans verilen paket gruplarındaki paketler bu paket grubunun bir parçası olarak kabul edilir. Bu ilişki geçişlidir. a paket grubu b paket grubunu, b ise c paket grubunu içeriyorsa c'deki her paket a'nin de üyesi olur.

Reddedilmiş paket özellikleriyle birlikte kullanıldığında her grubun paket kümesi önce bağımsız olarak hesaplanır ve ve sonuçlar birleştirilir. Bu, bir gruptaki reddedilen özelliklerin başka bir gruptaki özellikleri etkilemediği anlamına gelir.

Örnekler

Aşağıdaki package_group beyanı, tropikal meyveler içeren "tropikal" adlı bir paket grubu belirtir.

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

Aşağıdaki beyanlar kurgusal bir öğenin paket gruplarını belirtir uygulama:

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"],
)

exports_files

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

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

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

Eski bir davranış olarak, bir kurala giriş olarak belirtilen dosyalar da dışa aktarılır bayrağa kadar varsayılan görünürlükte --incompatible_no_implicit_file_export olduğunu varsayalım. Ancak bu davranışa güvenilmemeli ve bu davranıştan aktif olarak uzaklaşılmalıdır.

Bağımsız değişkenler

Bağımsız değişken, geçerli paketteki dosya adlarının bir listesidir. CEVAP görünürlük beyanı da belirtilebilir; bu örnekte dosyalar belirtilen hedefler tarafından görülebilir. Hiçbir görünürlük belirtilmezse dosyalar, package işlevinde paket varsayılan görünürlüğü belirtilmiş olsa bile 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ılır. Böylece diğer paketler bu dosyayı (ör. testlerin data özelliğinde) 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ştirilebilir, sıralanmış bir listesini döndüren bir yardımcı işlevdir. Glob yalnızca dosyaları arar ve yalnızca kaynak dosyalara bakar (oluşturulan dosyaları ya da hedefler).

Dosyanın pakete göre yolu include kalıplarından herhangi biriyle eşleşiyorsa ve exclude kalıplarından hiçbiriyle eşleşmiyorsa kaynak dosyanın etiketi sonuca dahil edilir.

include ve exclude listeleri yol kalıpları içeriyor . Her model bir ya da daha fazla daha fazla yol segmenti Unix yollarında olduğu gibi, bu segmentler / ile ayrılır. Segmentler * joker karakterini içerebilir: Bu karakter, dizin ayırıcı / hariç olmak üzere yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter birden çok kez kullanılabilir tek bir yol segmenti içinde. Ayrıca, ** joker karakteri Sıfır veya daha fazla tam yol segmenti ancak bağımsız olarak tanımlanması gerekir yol segmenti

Örnekler:
  • foo/bar.txt, foo/bar.txt dosyasıyla tam olarak eşleşiyor bu pakette
  • foo/*.txt, foo/ dizinindeki tüm dosyalarla eşleşir dosya .txt (foo/ bir alt paket değilse)
  • foo/a*.htm*, foo/ dizinindeki a ile başlayan, ardından rastgele bir dize (boş olabilir) içeren, ardından .htm içeren ve foo/axx.htm ve foo/a.html veya foo/axxx.html gibi başka bir rastgele dizeyle biten her dosyayı eşleştirir.
  • **/a.txt, bu paketin her alt klasöründeki her a.txt dosyasıyla eşleşir
  • **/bar/**/*.txt, elde edilen yolda en az bir dizin bar olarak adlandırılıyorsa (xxx/bar/yyy/zzz/a.txt veya bar/a.txt gibi) bu paketin her alt dizinindeki her .txt dosyasıyla eşleşir (**'in sıfır segmentle de eşleştiğini unutmayın) veya bar/zzz/a.txt
  • **, bu paketin her alt klasöründeki her dosyayı eşleştirir
  • ** bir segment olarak tek başına yer alması gerektiğinden foo**/a.txt geçersiz bir kalıptır

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

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

Birkaç önemli sınırlama ve uyarı vardır:

  1. glob(), BUILD 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şturulan dosyalar. Hem oluşturulan dosyalara ait açık bir listeyi eklemeniz gerekir. glob'a gönderebilirsiniz. :mylib ve :gen_java_srcs ile ilgili aşağıdaki örneğe bakın.

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

    Bunu anlamak için glob() işlevinin bir bu nedenle diğer kurallarda glob() kullanma özelliğini (ör. srcs = glob(["*.cc"])), açık şekilde eşleştirilir. Örneğin, glob() ["Foo.java", "bar/Baz.java"] sonucunu verirse ancak pakette "Foo.java" adlı bir kural da varsa (buna izin verilir ancak Bazel bu konuda uyarı verir) glob()'nin tüketicisi "Foo.java" dosyası yerine "Foo.java" kuralını (çıktılarını) kullanır. Görüntüleyin GitHub sorun #10395 bakın.

  3. Glob'lar, alt dizinlerdeki dosyalarla eşleşebilir. Ve alt dizin adları joker karakterli olabilir. Ancak...
  4. Etiketlerin paket sınırını aşmasına izin verilmez ve glob, alt paketlerdeki dosyalarla eşleşmez.

    Örneğin, paketteki **/*.cc glob ifadesi x, şu değerleri içermiyorsa x/y/z.cc içermez: x/y paket olarak bulunur ( x/y/BUILD veya paket yolunda başka bir yerde). Bu glob ifadesinin sonucunun gerçekte mevcut olması gerekir. Yani aynı glob ifadesi x/y/z.cc x/y veya --deleted_packages tıklayın.

  5. Yukarıdaki kısıtlama, hangi joker karakterleri kullandıklarına bakılmaksızın tüm glob ifadeleri için geçerlidir.
  6. Dosya adı . ile başlayan gizli bir dosya, hem ** hem de * joker karakterleriyle tamamen eşleşir. Gizli bir dosyayı birleşik bir desenle eşleştirmek isterseniz deseninizin . ile başlaması gerekir. Örneğin, * ve .*.txt, .foo.txt ile eşleşecek ancak *.txt olacak . Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler giriş olarak gerekli olmayan dosyaları içerebilir ve gereksiz yere globblanan dosyaların sayısı ve bellek tüketimi. Gizli dizinleri hariç tutmak için "hariç tut" liste bağımsız değişkenine ekleyin.
  7. "**" Joker karakterin yalnızca bir köşesinde büyük/küçük harf kullanımı vardır: "**", paketin dizin yoluyla eşleşmiyor. Yani, glob(["**"], exclude_directories = 0) ifadesinin tüm dosyalarla eşleştiğini söyle ve dizinleri, geçişli olarak yalnızca geçerli paketin dizinindeki dizinler altında birleştirebilirsiniz (tabii ki alt paketlerin dizinlerine girmiyoruz. Önceki not edin).

Genel olarak, uygun bir uzantı (ör. *.html) sağlamaya çalışmanız gerekir. yerine basit bir '*' karakteri kullanın. Daha açık bir ad hem kendi kendini açıklayıcıdır hem de yedek dosyaları veya emacs/vi/... otomatik kayıt dosyalarını yanlışlıkla eşleştirmenizi önler.

Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. Bu sayede, örneğin her giriş için ayrı kurallar oluşturabilirsiniz. Bkz. expanded glob örneği bölümüne bakın.

Küre Örnekleri

Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs kuralı tarafından oluşturulan tüm dosyalardan 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",
    ],
    ...
)

deneysel.txt hariç dizin test verilerindeki tüm txt dosyalarını dahil edin. testdata 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"],
    ),
)

Yinelemeli Küre Örnekleri

Testin, testdata dizinindeki ve alt dizinlerindeki (ve alt dizinlerinin vb.) tüm txt dosyalarına bağlı olmasını sağlayın. BUILD dosyası içeren alt dizinler yoksayılır. (Yukarıdaki sınırlamalara ve uyarılara bakın.)

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

Bu dizindeki tüm Java dosyalarından ve tüm Java dosyalarından oluşturulmuş bir kitaplık oluşturun. alt dizinleri (yolu test adlı bir dizin içerenler hariç) Oluşturmayı azaltabileceğinden, mümkünse bu kalıptan kaçınılmalıdır. artırır ve derleme sürelerini artırır.

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

Genişletilmiş Glob Örnekleri

Geçerli dizinde *_test.cc için dosyanın satır sayısını sayan ayrı bir genrule 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 BUILD dosyası //foo paketindeyse ve paket üç tane içeriyorsa eşleşen dosyalar, a_test.cc, b_test.cc ve c_test.cc ardından çalışıyor bazel query '//foo:all', oluşturulan tüm kuralları listeler:

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

seç

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

select(), kural özelliğini yapılandırılabilir hale getiren yardımcı işlevdir. Neredeyse tüm özellik atamalarını değiştirebilir. Bu nedenle değeri, komut satırı Bazel işaretlerine bağlıdır. Örneğin bunu, platforma özgü bağımlılıkları tanımlamak ya da Bir kuralın "geliştirici" içinde yerleşik olup olmadığına bağlı olarak farklı kaynaklar yerleştirmek - "yayınlama" yatırım yapmanız önemlidir.

Temel kullanım aşağıdaki gibidir:

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

Bu, 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 bir sh_binary öğesinin srcs özelliğini yapılandırılabilir hale getirir. Her koşul, bir config_setting veya constraint_value değerine referans veren bir etikettir. Hedefin yapılandırması beklenen bir değer kümesiyle eşleşirse bu etiket "eşleşir". mytarget#srcs değeri, geçerli çağrıyla eşleşen etiket listesine dönüşür.

Notlar:

  • Her çağrıda tam olarak bir koşul seçilir.
  • Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin uzmanlık alanıysa uzmanlık önceliklidir. B koşulu, A koşuluyla aynı işaretlere ve kısıtlama değerlerine sahipse ve bazı ek işaretler veya kısıtlama değerlerine sahipse A koşulunun bir uzmanlığı olarak kabul edilir. Bu ayrıca uzmanlaşma çözümlemesinin, yalnızca aşağıdaki Örnek 2'de gösterilmiştir.
  • Birden fazla koşul eşleşiyorsa ve bir koşul tüm koşulların Diğer durumlarda, tüm koşullar aynı değerde çözümlenmediği sürece Bazel bir hata vererek başarısız olur.
  • Başka bir koşul eşleşmezse özel sözde etiket //conditions:default'ün eşleştiği kabul edilir. Bu koşul dışarıda bırakıldığında, hatadan kaçınmak için başka bir kuralın eşleşmesi gerekir.
  • select, daha büyük bir alanın içine yerleştirilebilir özellik ataması. Dolayısıyla srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) ve srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]}), geçerli ifadelerdir.
  • select, özelliklerin çoğuyla ancak tamamıyla çalışmaz. Uyumsuz özellikleri, dokümanlarında nonconfigurable olarak işaretlenmiştir.

    alt paketler

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

    subpackages(), dosya ve dizinler yerine alt paketleri listeleyen glob()'a benzer 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 tüm alt paketlerle eşleşebilir. Dahil etme ve ekleme ile ilgili ayrıntılı açıklama ve örnekler için glob'a bakın. modelleri hariç tutun.

    Döndürülen alt paketler listesi, sıralanmış haldedir ve verilen kalıplarla eşleşen geçerli yükleme paketine göre yolları include (exclude kapsamındakiler hariç).

    Örnek

    Aşağıdaki örnekte, foo/BUILD paketine ait tüm doğrudan alt paketler 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, kullanıcıların bu işlevi doğrudan çağırmak yerine skylib'in "subpackages" modülünü kullanması tercih edilir.