İşlevler

Sorun bildirin Kaynağı göster

İçindekiler

paket

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

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

Depodaki her kurala meta verilerin uygulandığını beyan eden eşdeğeri için deponuzun kök konumundaki REPO.bazel dosyasında repo() işlevini kullanın. repo() işlevi, package() ile tamamen aynı bağımsız değişkenleri alır.

Bundle() 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 []

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

Bu paketteki her kural, 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. Paketin varsayılan görünürlüğü, varsayılan olarak herkese açık olan exports_files için geçerli değildir.

default_deprecation

Dize; varsayılan değer ""

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

default_package_metadata

Etiket listesi; varsayılan []

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; belirtilen durumlar dışında varsayılan değer False

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

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 özel bir işleme ihtiyacı olan paketleri etiketlemek için derleme sistemi üzerinde çalışan kişiler tarafından kullanılır. Derleme sistemi üzerinde ç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örünür olduğunu bildirir. Bir kuraldaki bağımsız görünürlük bildirimleri (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, visibility özelliklerinde referans verilebilir.

Paket grupları, öncelikli olarak görünürlük kontrolü için kullanılır. Herkese açık bir hedefe, kaynak ağaçtaki her paketten referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketinin 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 paketlere erişime izin verebilir. Görünürlük sisteminin daha ayrıntılı açıklaması için görünürlük özelliğine bakın.

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 kabul edilir.

Paket grupları teknik olarak hedeflerdir 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

Ad; gerekli

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 dizesi, aşağıdaki biçimlerden birine sahip olabilir:

  1. Bir paketin, çift eğik çizgiyle başlayan, deposu olmadan tam adı. Örneğin //foo/bar, bu ada sahip olan ve paket grubuyla aynı depoda bulunan paketi belirtir.
  2. Yukarıdaki gibi, ancak arkasında /... var. Örneğin //foo/..., //foo grubunu ve tüm alt paketlerini belirtir. //..., mevcut depodaki tüm paketleri belirtir.
  3. Sırasıyla her paketi veya hiçbir paketi belirten public veya private dizeleri. (Bu form için --incompatible_package_group_has_public_syntax işaretinin ayarlanması gerekir.)

Buna ek olarak, paket spesifikasyonlarının ilk iki türü, bunların reddedildiğini belirtmek için - ön ekini de içerebilir.

Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ve negatif özelliklerinden hiçbirini içermeyen herhangi bir paket içerir. Örneğin [//foo/..., -//foo/tests/...] değeri, //foo/tests öğesinin alt paketleri olmayan tüm //foo alt paketlerini içerir. (//foo'ın kendisi dahil edilir, //foo/tests'in kendisi ise dahil edilmez.)

Mevcut deponun dışındaki paketleri herkese açık görünürlüğün dışında doğrudan belirtmek mümkün değildir.

Bu özellik eksikse boş bir listeye ayarlamakla aynıdır. Bu, özelliği yalnızca private içeren bir listeye ayarlamakla aynıdır.

Not: Bazel 6.0'dan önce //... spesifikasyonunun, public ile aynı olan eski bir davranışı vardı. Bu davranış, Bazel 6.0'dan sonra varsayılan olarak --incompatible_fix_package_group_reporoot_syntax etkinleştirildiğinde düzelir.

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

includes

Etiket listesi; varsayılan []

Buna dahil olan diğer paket grupları.

Bu özellikteki etiketler diğer paket gruplarına başvuruda bulunmalıdır. Başvurulan paket gruplarındaki paketler bu paket grubunun bir parçası olarak alınır. Bu geçişlidir. a paket grubu b paket grubunu ve b, c paket grubunu içeriyorsa c içindeki her paket de a grubunun üyesi olur.

Yok sayılan paket özellikleriyle birlikte kullanıldığında, her bir grubun paket kümesinin önce bağımsız olarak hesaplandığını ve sonuçların daha sonra birleştirildiğini unutmayın. Bu, bir gruptaki reddedilen spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde etkisi olmadığı anlamına gelir.

Örnekler

Aşağıdaki package_group bildirimi, tropik meyveler içeren "tropik" adlı bir paket grubunu belirtir.

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

Aşağıdaki beyanlar 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"],
)

exports_files

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

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

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

Eski bir davranış olarak, bir kuralda girdi olarak bahsedilen dosyalar da --incompatible_no_implicit_file_export bayrağı değiştirilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve bu davranış aktif bir şekilde kullanımdan kaldırılmalı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 belirtilmezse package işlevinde paketin 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, diğer paketlerin (örneğin testlerin data özelliğinde) kullanabilmesi için test_data paketinden bir metin dosyası olan golden.txt dışa aktarılmaktadır.

# 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 ve sıralanmış 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 hedefleri değil) arar.

Bir kaynak dosyanın Etiketi, dosyanın pakete bağlı yolu include kalıplarından herhangi biriyle eşleşiyor ve exclude kalıplarından hiçbiriyle eşleşiyorsa sonuca dahil edilir.

include ve exclude listeleri, mevcut paketle göreceli yol kalıpları içerir. Her kalıp, bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında her zaman olduğu gibi, bu segmentler / ile ayrılır. Segmentler * joker karakterini içerebilir: Bu, / dizin ayırıcısı hariç yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter, bir yol segmentinde birden çok kez kullanılabilir. Ayrıca, ** joker karakteri sıfır veya daha fazla tam yol segmentiyle eşleşebilir ancak bağımsız bir yol segmenti olarak bildirilmelidir.

Örnekler:
  • foo/bar.txt, bu paketteki foo/bar.txt dosyasıyla tam olarak eşleşir
  • Dosya .txt ile bitiyorsa foo/*.txt, foo/ dizinindeki her dosyayla eşleşir (foo/ bir alt paket değilse)
  • foo/a*.htm*, foo/ dizininde a ile başlayan, sonra rastgele bir dizeye (boş olabilir) ve .htm öğesine sahip olup başka bir rastgele dizeyle (ör. foo/axx.htm ve 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
  • Sonuçta elde edilen yoldaki en az bir dizine bar denirse **/bar/**/*.txt (** değerinin de sıfır segmentle eşleştiğini unutmayın) veya bar/zzz/a.txt, bu paketin her alt dizinindeki her .txt dosyasıyla eşleşir.xxx/bar/yyy/zzz/a.txtbar/a.txt
  • **, bu paketin her alt dizinindeki her dosyayla eşleşir
  • foo**/a.txt geçersiz bir kalıptır çünkü ** bir segment olarak kendi başına bulunmalıdı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 dosya değerlendirmesi sırasında çalıştırıldığından glob() yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiç oluşturulmamış dosyalardır. Hem kaynak hem de oluşturulmuş 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ölgeler".

    Bunu anlamak için glob() işlevinin bir yol listesi döndürdüğünü ve dolayısıyla diğer kuralların özelliğinde (ör. srcs = glob(["*.cc"])) glob() kullanmanın, eşleşen yolların açık bir şekilde listelenmesi ile aynı etkiye sahip olduğunu unutmayın. Örneğin glob(), ["Foo.java", "bar/Baz.java"] döndürüyorsa ancak pakette "Foo.java" adlı bir kural da varsa (Bazel bu konuda uyarıda bulunsa da buna izin verilir) glob() tüketicisi, "Foo.java" dosyası yerine "Foo.java" kuralını (çıkışları) kullanır. Daha ayrıntılı bilgi için GitHub sorun #10395 bölümüne bakın.

  3. Küreler, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına joker karakterler de 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/y paket olarak mevcutsa (x/y/BUILD olarak veya paket yolundaki başka bir yerde) x paketindeki **/*.cc glob ifadesi x/y/z.cc değerini içermez. Bu, glob ifadesinin sonucunun aslında BUILD dosyalarının varlığına bağlı olduğu anlamına gelir. Yani, x/y adlı bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlenmişse aynı glob ifadesi x/y/z.cc öğesini içerir.

  5. Yukarıdaki kısıtlama, hangi joker karakterleri kullanırsa kullansı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şiyor. Gizli bir dosyayı bileşik bir kalıpla eşleştirmek istiyorsanız deseninizin . ile başlaması gerekir. Örneğin, * ve .*.txt, .foo.txt ile eşleşir ancak *.txt eşleşmez. Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak gerekli olmayan dosyaları içerebilir ve gereksiz bir şekilde globb olan dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "hariç tut" listesi bağımsız değişkenine ekleyin.
  7. "**" joker karakterinin bir köşesinde büyük/küçük harf kullanımı vardır: "**" kalıbı, paketin dizin yoluyla eşleşmiyor. Yani glob(["**"], exclude_directories = 0), tüm dosya ve dizinleri yalnızca geçerli paketin dizinindeki geçişli olarak eşleştirir (ancak alt paketlerin dizinlerine girmez; bununla ilgili önceki nota bakın).

Genel olarak, bir glob kalıbı için çıplak "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemelisiniz. Daha açık olan ad, hem belgelemeyi sağlar hem de yedek dosyaları veya emacs/vi/... otomatik kaydetme dosyalarını yanlışlıkla eşleştirmenizi engeller.

Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. Bu sayede her giriş için ayrı kurallar oluşturulabilir. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.

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

deneysel.txt hariç dizin test verilerindeki tüm txt dosyalarını dahil edin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız özyinelemeli bir glob (**) kullanın.

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

Yinelemeli Küre Örnekleri

Testin, testverileri dizinindeki ve bunun alt dizinlerindeki (ve bunların alt dizinlerindeki vb.) tüm txt dosyalarına dayalı 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"]),
)

Yolu test adlı bir dizin içerenler hariç, bu dizindeki ve tüm alt dizinlerdeki tüm Java dosyalarından derlenmiş bir kitaplık oluşturun. Derleme artışını azaltıp derleme sürelerini artırabileceğinden, mümkünse bu kalıptan kaçınılmalıdır.

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

Genişletilmiş Yerküre Örnekleri

Geçerli dizinde, *_test.cc için dosyadaki satır sayısını sayan ayrı bir genel 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 üç eşleşen dosya (a_test.cc, b_test.cc ve c_test.cc) içeriyorsa 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 herhangi bir özellik atamasının sağ tarafını değiştirebilir. Böylece değeri komut satırı Bazel işaretlerine bağlıdır. Örneğin, platforma özgü bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ya da "yayın" modunda derlenmiş olmasına bağlı olarak farklı kaynakları yerleştirmek için bunu kullanabilirsiniz.

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, 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, config_setting veya constraint_value için bir etiket referansıdır. Bu referanslar, hedefin yapılandırması beklenen bir değer grubuyla eşleşirse "eşleşir". Böylece mytarget#srcs değeri, geçerli çağrıyla eşleşen etiket listesi haline gelir.

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 uzmanlık önceliklidir. B koşulu, A ile aynı flag'lere ve kısıtlama değerlerine ve bazı ek işaretlere ya da kısıtlama değerlerine sahipse A koşulunun uzmanlığı olarak kabul edilir. Bu aynı zamanda, uzmanlık çözümlemesinin aşağıdaki 2. Örnek'te gösterildiği gibi bir sıralama oluşturacak şekilde tasarlanmadığı anlamına gelir.
  • Birden fazla koşul eşleşiyorsa ve bir koşul diğer tüm koşulların uzmanlığı arasında değilse tüm koşullar aynı değere sahip olmadığı sürece Bazel bir hatayla başarısız olur.
  • Başka hiçbir koşul eşleşmediği takdirde //conditions:default özel sözde etiketi, eşleşecek şekilde kabul edilir. Bu koşul dışarıda bırakılırsa hata olmaması için başka bir kuralın eşleşmesi gerekir.
  • select, daha büyük bir özellik atamasının içine yerleştirilebilir. 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 özellikler, dokümanlarında nonconfigurable olarak işaretlenmiştir.

    alt paketler

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

    subpackages(), dosyalar ve dizinler yerine alt paketleri listeleyen glob() gibi 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 hariç tutma kalıplarıyla ilgili ayrıntılı açıklama ve örnekler için glob bölümüne bakın.

    Döndürülen alt paketlerin sonuç olarak sıralandığı liste, sıralı sırada olup exclude içinde değil, include içinde belirtilen kalıplarla eşleşen geçerli 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 "subpackages" modülünü kullanması tercih edilir.