İşlevler

. Sorun bildir Kaynağı göster Gece · 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.

Depo genelindeki her kural için geçerli olan meta verileri açıklayan karşı taraf için, deponuzun kökündeki REPO.bazel dosyasında repo() işlevini kullanın. repo() işlevi, package() ile tam olarak aynı bağımsız değişkenleri alır.

package() işlevi, dosyası olmalı.

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üğü.

Bu paketteki her kural, bu özelliği (visibility içinde aksi belirtilmedikçe) özelliğini gönderin. Bu özelliği için görünürlük belgelerine bakın. Paketin varsayılan görünürlüğü, varsayılan olarak herkese açık olan exports_files için geçerli değildir.

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 varsayılan bir meta veri hedefi listesi ayarlar. Bunlar genellikle OSS paket ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license bölümüne bakın.

default_testonly

Boole; belirtilmediği sürece varsayılan değer False'tür

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

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

features

Dize listesi; varsayılan değer []'tür.

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

Bu özellik, genellikle derleme sisteminde çalışan kişiler tarafından bir tür özel işleme tabi tutulması gereken paketleri etiketlemek için kullanılır. 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 paketin üyeleri görebilir //foo:target grubu. Bağımsız görünürlük bildirimleri bir kuralda varsa bu spesifikasyonu geçersiz kılar.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

Bu işlev, bir paket grubu tanımlar ve bir etiketi grupla ilişkilendirir. Etiket, visibility özelliklerinde referans olarak kullanılabilir.

Paket grupları öncelikle görünürlük kontrolü için kullanılır. Herkesin görebileceği bir hedefe kaynak ağacındaki her paketten referans verilebilir. Özel olarak Görünür hedefe yalnızca kendi paketi içinde referans verilebilir (alt paketlerde değil). Bu iki uç nokta arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından açıklanan paketlerin herhangi birine erişime izin verebilir. Daha ayrıntılı hakkında daha fazla bilgi için görünürlük özelliğini gönderin.

Belirli bir paket, packages özelliğiyle eşleşiyorsa veya includes özelliğinde belirtilen diğer paket gruplarından birinde zaten yer alıyorsa grupta yer aldığı kabul edilir.

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 []'tir.

Sıfır veya daha fazla paket özelliğinin listesi.

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

  1. Bir paketin deposu olmadan, şununla başlayan tam adı: çift eğik çizgi. Örneğin, //foo/bar, bu ada sahip ve paket grubuyla aynı depoda bulunan paketi belirtir.
  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. Sırasıyla her paketi veya hiçbir paketi belirten public ya da private dizeleri. (Bu form için --incompatible_package_group_has_public_syntax bayrağı ayarlayın.)

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 edilirken //foo/testler kendisi dahil edilmez.)

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 önce //... spesifikasyonunun davranışı, public ile aynı olan eski bir davranıştı. 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ış, --incompatible_package_group_includes_double_slash Bu, Bazel 6.0'dan sonra varsayılan olarak etkindir.

includes

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

Buna dahil olan diğer paket grupları.

Bu özellikteki etiketler diğer paket gruplarına başvuruda bulunmalıdır. Referans verilen paket gruplarındaki paketler bu paket grubunun bir parçası olarak kabul edilir. Geçişli bir yöntemdir (paket grubu a, b ve b paket grubunu içeriyor c paket grubunu, ardından şu gruptaki tüm paketleri içerir: c ayrıca a grubunun üyesi olacak.

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, ters çevrilmiş özellikleri üzerinde hiçbir etkisi yoktur. olabilir.

Ö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(), şuna ait dosyaların listesini belirtir: diğer paketlere aktarılan verileri içerir.

Bir paketin BUILD dosyası, yalnızca doğrudan ait olan kaynak dosyalarına başvurabilir açıkça dışa aktarılırsa başka bir pakete exports_files() ifadesi. 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 aktif bir şekilde bazı yerler var.

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 hedeflere görünür olur. Hiçbir görünürlük belirtilmezse package işlevinde paket varsayılan görünürlük belirtilmiş olsa bile dosyalar her paket tarafından görülebilir. Lisanslar belirtilebilir.

Örnek

Aşağıdaki örnekte golden.txt, a test_data paketindeki diğer metin dosyasını paketler hâlinde kullanabilir (örneğin, data özelliğinde) olabilir.

# 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ı bularak ve yollarının yeni, değişebilir, sıralanmış bir listesini döndürür. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları (oluşturulan dosyaları veya diğer hedefleri değil) arar.

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, mevcut pakete göre yol kalıplarını içerir. Her model bir ya da daha fazla daha fazla yol segmenti Unix yollarında olduğu gibi, bu segmentler / ile ayrılır. Kalıptaki segmentler, şu segmentlerin segmentleriyle eşleştirilir: gösterir. Segmentler * joker karakterini içerebilir: Bu karakter, dizin ayırıcı / hariç olmak üzere yol segmentindeki herhangi bir alt diziyle (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/ bir alt paket değilse)
  • 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, ardından rastgele bir dize (boş olabilir) içeren, ardından .htm içeren ve başka bir rastgele dizeyle biten (foo/ alt paket olmadığı sürece) her dosyayı eşleştirir. Örneğin, foo/axx.htm ve foo/a.html veya foo/axxx.html
  • foo/*, foo/ dizinindeki tüm dosyalarla eşleşir. (foo/ bir alt paket değilse); foo ile eşleşmiyor exclude_directories değeri şu şekilde ayarlanmış olsa bile dizinin kendisidir: 0
  • foo/**, paketin birinci düzey alt dizini foo/ altındaki alt paket olmayan her alt dizindeki her dosyayı eşleştirir; exclude_directories 0 olarak ayarlanırsa foo dizini de kalıpla eşleşir; bu durumda **'in sıfır yol segmentiyle eşleştiği kabul edilir
  • **/a.txt, bu paketin dizininde ve alt paket olmayan alt dizinlerde a.txt dosyaları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 alt paket olmayan 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
  • **, alt paket olmayan her alt dizinindeki tüm dosyalarla eşleşir: bu paket
  • ** bir segment olarak tek başına durması gerektiğinden foo**/a.txt geçersiz bir kalıptır
  • /'dan sonra tanımlanan ikinci segment boş bir dize olduğu için foo/ 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()'ün bir yol listesi döndürdüğünü unutmayın. Bu nedenle, diğer kuralların özelliğinde (ör. srcs = glob(["*.cc"])) glob() kullanmak, eşleşen yolları açıkça listelemekle aynı etkiye sahiptir. Ö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'un bunu aşmasına izin verilmez. alt paketlerdeki dosyalarla eşleşmez.

    Örneğin, x/y bir paket olarak mevcutsa (x/y/BUILD olarak veya package-path'te başka bir yerde) x paketindeki **/*.cc genel ifadesi x/y/z.cc'yi içermez. 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 karakterleri. Gizli bir dosyayı eşleştirmek istiyorsanız kalıbınızın bir . ile başlaması gerekir. Örneğin, * ve .*.txt, .foo.txt ile eşleşir ancak *.txt ile eşleşmez. Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak gerekli olmayan dosyalar içerebilir ve gereksiz şekilde genelleştirilmiş dosya sayısını ve bellek tüketimini artırabilir. Hariç tutulacaklar gizli dizinleri "hariç tut" liste bağımsız değişkenine dokunun.
  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, bir glob kalıbı için yalnızca "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamaya çalışmalısınız. Daha açık olan ad hem kendi kendine belgeleme yapar hem de yedeğin yanlışlıkla eşleşmemesini sağlar. veya emacs/vi/... otomatik olarak kaydedebilirsiniz.

Derleme kuralları yazarken glob öğelerini sayabilirsiniz. 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.

Glob Örnekleri

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

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

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

experimental.txt hariç tüm txt dosyalarını testdata dizinine 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"],
    ),
)

Yinelemeli Küre Örnekleri

Testin, testdata dizinindeki tüm txt dosyalarına ve . 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 ve yolları testing adlı bir dizin içerenler hariç tüm alt dizinlerdeki tüm Java dosyalarından oluşturulmuş bir kitaplık oluşturun. 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ş Yerküre Örnekleri

Geçerli dizinde *_test.cc için ayrı bir genel kural oluşturun dosyadaki satır sayısını hesaplar.

# 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 pakette a_test.cc, b_test.cc ve c_test.cc adlı üç eşleşen dosya varsa bazel query '//foo:all' çalıştırıldığında 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ç

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ın sağ tarafı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 şu şekildedir:

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". Daha sonra mytarget#srcs değeri, etiket listesi geçerli çağrıyla eşleşiyor.

Notlar:

  • Her çağrıda tam olarak bir koşul seçilir.
  • Birden fazla koşul eşleşiyorsa ve koşullardan biri diğerlerinin uzmanlığıysa uzmanlaşmaya öncelik verilecek. B koşulu, B koşulun işaretleri ve kısıtları aynıysa A koşulunun özelleştirilmesi değerlerini A ile birlikte bazı ek işaretler veya kısıtlama değerleri olarak sunar. Bu durum, aşağıdaki 2. örnekte gösterildiği gibi uzmanlık çözümünün bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
  • 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 eşleşir. 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, tüm özelliklerle olmasa da çoğu özellikle çalışır. Uyumlu olmayan özellikler, dokümanlarda nonconfigurable ile işaretlenir.

    alt paketler

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

    subpackages(), dosya ve dizinler yerine alt paketleri listeleyen glob()'a benzer bir yardımcı işlevdir. Aynı yol kalıplarını glob() olarak tanımlar ve şu anda yüklenen BUILD dosyasının doğrudan alt öğesidir. Dahil etme ve ekleme ile ilgili ayrıntılı açıklama ve örnekler için glob'a bakın. modelleri hariç tutun.

    Sonuç olarak döndürülen alt paket listesi sıralı olarak listelenir ve mevcut yükleme paketine göre exclude'daki değil, include'teki belirli kalıplarla eşleşen 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/bar/but/bad/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs1 = subpackages(include = ["**"])
    
    # results in subs1 == ["sub", "bar/baz", "bar/but/bad"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    
    subs2 = subpackages(include = ["bar/*"])
    # results in subs2 = ["bar/baz"]
    #
    # Since 'bar' is not a subpackage itself, this looks for any subpackages under
    # all first level subdirectories of 'bar'.
    
    subs3 = subpackages(include = ["bar/**"])
    # results in subs3 = ["bar/baz", "bar/but/bad"]
    #
    # Since bar is not a subpackage itself, this looks for any subpackages which are
    # (1) under all subdirectories of 'bar' which can be at any level, (2) not a
    # subpackage of another subpackages.
    
    subs4 = subpackages(include = ["sub"])
    subs5 = subpackages(include = ["sub/*"])
    subs6 = subpackages(include = ["sub/**"])
    # results in subs4 and subs6 being ["sub"]
    # results in subs5 = [].
    #
    # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a
    # subpackage of 'foo').
    # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since
    # 'foo/sub' is already a subpackage itself, the subdirectories will not be
    # traversed anymore.
    # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it
    # is returned. But the subdirectories of 'foo/sub' will not be traversed
    # anymore.
    

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