İş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. Paket (BUILD dosyası) içinde 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, 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üğü şunlar için geçerli değildir: exports_files varsayılan olarak herkese açıktır.

default_deprecation

String; varsayılan değer ""

Varsayılan değerini ayarlar Bu paketteki tüm kurallar için deprecation mesajı.

default_package_metadata

Etiket listesi; varsayılan değer []

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

Varsayılan değerini ayarlar testonly özelliğini kullanmanız gerekir.

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

features

Liste dizeleri varsayılan değer []

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

Bu özellik genellikle derleme sistemi üzerinde çalışan kişiler tarafından etiket paketlerinin olması gerekir. Şu durum söz konusu değilse bunu kullanmayın: ve derleme sistemi üzerinde çalışan biri tarafından açık bir şekilde istekte bulunulabilir.

Ö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 grubunu tanımlar ve bir etiketi kümeyle ilişkilendirir. Etikete şuradan referans verilebilir: visibility özellikleri.

Paket grupları, öncelikli olarak görünürlük kontrolü için kullanılır. Herkes tarafından görülebilen bir hedefine 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ı. Daha ayrıntılı hakkında ayrıntılı bilgi için görünürlük özelliğini gönderin.

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. Bir paketin deposu olmadan, şununla başlayan tam adı: çift eğik çizgi. Örneğin, //foo/bar, paketi belirtir paketle aynı depoda bulunan ve paketle aynı depoda bulunan grubu.
  2. Yukarıdaki gibi, ancak arkasında /... var. Örneğin, //foo/..., //foo kümesini ve tüm alt paketler. //..., depodur.
  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 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 edilmemektedir.)

Herkese açık görünürlük dışında, bilgileri doğrudan paylaşmanın bir yolu paketlerini yeniden sınıflandırır.

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 şu şekilde serileştirildiğinde: bazel query --output=proto sınırlarının bir bölümü (veya --output=xml) başlarsa baştaki 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

Etiket listesi; varsayılan değer []

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, bunun bir parçası olarak alınır paket grubu. 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 bildirimi bir "tropik" adlı paket grubu bir bitki türü seçin.

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. Daha fazla bilgi: dosyaların görünürlüğü.

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. CEVAP görünürlük beyanı da belirtilebilir; Bu örnekte, dosyalar belirtilen hedefler tarafından görülebilir. Görünürlük belirtilmezse dosyalar görünür olacaktır. Paketin varsayılan görünürlüğü package içinde belirtilir işlevini kullanın. 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 dosyaları arar ve yalnızca kaynak dosyalara bakar (oluşturulan dosyaları ya da hedefler).

Dosyanın pakete bağlı olması durumunda kaynak dosyanın Etiketi sonuca dahil edilir yolu, include kalıplarından herhangi biriyle eşleşiyor ve exclude kalıp.

include ve exclude listeleri yol kalıpları içeriyor . Her model bir ya da daha fazla daha fazla yol segmenti Unix yollarında her zamanki gibi, bu segmentler / Segmentler * joker karakterini içerebilir: Bu, hariç, yol segmentindeki herhangi bir alt dize (boş alt dize dahil) dizin ayırıcı /. 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/ içindeki tüm dosyalarla eşleşir a ile başlayan ve rastgele bir dizeye sahip olan bir dizindir ( boş olmalıdır), ardından .htm değerini içerir ve başka bir rastgele dizeyle biter; foo/axx.htm ve foo/a.html gibi veya foo/axxx.html
  • **/a.txt her a.txt dosyayla eşleşir: bu paketin alt dizini
  • **/bar/**/*.txt her .txt dosyayla eşleşir: bu paketin alt dizinini (ör. sonuç yolunda en az bir dizin) bar adlı, örneğin xxx/bar/yyy/zzz/a.txt veya bar/a.txt (** değerinin de sıfır ile eşleştiğini unutmayın) segmentler) veya bar/zzz/a.txt
  • **, bu dizinin her alt dizinindeki her dosyayla eşleşir paket
  • ** olması gerektiği için foo**/a.txt geçersiz bir kalıp kendi içinde bir segment

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

allow_empty bağımsız değişkeni False olarak ayarlanırsa Aksi halde sonuç şöyle olacaksa glob işlevi hata verir: boş görünür.

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. Örneğe bakın :mylib ve :gen_java_srcs ile geride.

  2. Bir kuralın adı eşleşen kaynak dosyayla aynıysa "gölge" seçin.

    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"] ancak şurada da bir kural var: "Foo.java" adlı paket (Bazel bu konuda uyarıda bulunsa da buna izin verilir) ise glob() öğesinin tüketicisi "Foo.Java"yı kullanır. kural (çıkışları) olarak tanımlar. dosyası olarak kaydedebilirsiniz. Görüntüleyin GitHub sorun #10395 bakın.

  3. Küreler, alt dizinlerdeki dosyaları eşleştirebilir. 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, 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 tüm glob ifadeleri için geçerlidir: hangi joker karakterleri kullanırlarsa kullansınlar.
  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şecek ancak *.txt olacak . Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler giriş olarak gerekli olmayan dosyaları içerebilir ve ve bellek tüketimini ifade eder. Hariç tutulacaklar bu dizinleri "hariç tut" bölümüne ekleyin 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, uygun bir uzantı (ör. *.html) sağlamaya çalışmanız gerekir. yerine basit bir '*' karakteri kullanın. Daha açık olan ad hem kendi kendini belgeleme yapar hem de yedeğin yanlışlıkla eşleşmemesini sağlar. veya emacs/vi/... otomatik olarak kaydedebilirsiniz.

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

Küre Ö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",
    ],
    ...
)

deneysel.txt hariç dizin test verilerindeki tüm txt dosyalarını dahil edin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Eğer bu dosyaların dahil edilmesini istiyorsanız yinelemeli 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. (Sınırlamaları inceleyin dikkat edin.)

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ş 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 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ği oluşturan yardımcı işlevdir yapılandırılabilir. Bu, her bir metin parçasının sağ tarafını neredeyse özelliği atama yöntemini kullanabilirsiniz. Böylece değeri komut satırı Bazel işaretlerine bağlı olur. Ö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,srcs normal etiketinin değiştirilmesiyle yapılandırılabilen bir sh_binary eşlenen bir select çağrısıyla liste ataması yapılandırma koşullarını eşleşen değerlere ayarlayabilirsiniz. Her koşul bir etikettir referans: config_setting veya constraint_value, Hangi "eşleşir" hedefin yapılandırması, değerler. Daha sonra mytarget#srcs değeri, etiket listesi geçerli çağrıyla eşleşiyor.

Notlar:

  • Herhangi bir çağrıda tam olarak bir koşul seçildi.
  • 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 ayrıca uzmanlaşma çözümlemesinin, yalnızca aşağıdaki 2. Örnek'te 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.
  • Özel sözde etiket //conditions:default: hiçbir koşul eşleşmediği takdirde eşleşeceğ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, tüm özelliklerle olmasa da çoğu özellikle çalışır. Uyumsuz özellikleri, dokümanlarında nonconfigurable olarak işaretlenmiştir.

    alt paketler

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

    subpackages(), glob() işlevine benzer bir yardımcı işlevdir alt paketleri listeleyen bir tarayıcı oluşturur. 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.

    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 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, 'alt paketleri' modülü skylib olarak değiştirin.