İşlevler

İç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. Bir pakette (BUILD dosyası) en fazla bir kez kullanılır.

Deponun tamamındaki her kural için geçerli olan meta verileri bildiren karşılığı için deponuzun kökündeki REPO.bazel dosyasında repo() işlevini kullanın. repo() işlevi, package() ile tamamen aynı bağımsız değişkenleri alır.

package() işlevi, dosyanın en üstündeki 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üğü.

Bu paketteki her kural, kuralın visibility özelliğinde aksi belirtilmediği sürece bu özellikte belirtilen görünürlüğe sahiptir. Bu özelliğin söz dizimi hakkında ayrıntılı bilgi için visibility ile ilgili belgelere 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 değer: []

Paketteki diğer tüm hedefler için geçerli olan varsayılan bir meta veri hedefi listesi ayarlar. Bunlar genellikle OSS paketi ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license sayfasına bakın.

default_testonly

Boole; aksi belirtilmedikçe varsayılan değer False şeklindedir.

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

javatests altındaki paketlerde varsayılan değer True olarak ayarlanmıştır.

features

Dizeleri listele; varsayılan değer: []

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

Bu özellik, esas olarak derleme sistemi üzerinde çalışan kişiler tarafından özel işlem gerektiren paketleri etiketlemek için 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 üyeleri tarafından görülebileceğini belirtir. Bir kuralda bireysel görünürlük beyanları 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 bu grupla bir etiket ilişkilendirir. Etikete visibility özelliklerinde referans verilebilir.

Paket grupları öncelikle görünürlük kontrolü için kullanılır. Herkese açık bir hedefe, kaynak ağacındaki her paketten referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketi içinde (alt paketler değil) referans verilebilir. 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 sistemi hakkında daha ayrıntılı bilgi 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 görünürlük koruması yoktur.

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 spesifikasyonunun listesi.

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

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

Ayrıca, ilk iki paket spesifikasyonu türü, geçersiz kılındıklarını belirtmek için - ile de önceden düzeltilebilir.

Paket grubu, pozitif spesifikasyonlarından en az biriyle eşleşen ve negatif spesifikasyonlarından hiçbiriyle eşleşmeyen tüm paketleri içerir. Örneğin, [//foo/..., -//foo/tests/...] değeri, //foo/tests alt paketi olmayan tüm //foo alt paketlerini içerir. (//foo dahil edilirken //foo/tests dahil edilmez.)

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

Bu özellik eksikse boş bir listeye ayarlanmış gibi olur. Bu da yalnızca private içeren bir listeye ayarlanmış gibi olur.

Not: Bazel 6.0'dan önce //... spesifikasyonu, public ile aynı olan eski bir davranışa sahipti. Bu davranış, --incompatible_fix_package_group_reporoot_syntax etkinleştirildiğinde düzeltilir. Bu, Bazel 6.0'dan sonraki varsayılan davranıştır.

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 çıkar. Bu davranış, --incompatible_package_group_includes_double_slash etkinleştirildiğinde düzeltilir. Bu, Bazel 6.0'dan sonraki varsayılan davranıştır.

includes

Etiket listesi; varsayılan değer: []

Bu pakete dahil olan diğer paket grupları.

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

Olumsuz paket spesifikasyonlarıyla birlikte kullanıldığında, her grup için paket grubunun önce bağımsız olarak hesaplandığını ve ardından sonuçların birleştirildiğini unutmayın. Bu, bir gruptaki olumsuzlanmış spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde hiçbir etkisi olmadığı anlamına gelir.

Örnekler

Aşağıdaki package_group beyanı, tropikal meyveler içeren "tropikal" 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 exports_files() ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalara doğrudan başvurabilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.

Eski bir davranış olarak, bir kuralın girişi olarak belirtilen dosyalar da --incompatible_no_implicit_file_export işareti değiştirilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve etkin bir şekilde başka bir yönteme geçilmelidir.

Bağımsız değişkenler

Bağımsız değişken, mevcut paketteki dosyaların adlarının 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 dosyalar, package işlevinde varsayılan bir paket 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ıyor. Böylece diğer paketler bu dosyayı, örneğin 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 yardımcı bir işlevdir. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları arar (oluşturulan dosyaları veya diğer hedefleri değil).

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

include ve exclude listeleri, mevcut paketle ilgili yol kalıpları içerir. Her kalıp bir veya daha fazla yol segmentinden oluşabilir. 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 tüm alt dizelerle (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 tanımlanmalıdır.

Örnekler:
  • foo/bar.txt, bu paketteki foo/bar.txt dosyasıyla tam olarak eşleşiyor
  • foo/*.txt, dosya .txt ile bitiyorsa foo/ dizinindeki her dosyayla eşleşir (foo/ bir alt paket değilse).
  • foo/a*.htm*, foo/ dizininde a ile başlayan, ardından rastgele bir dize (boş olabilir) ve .htm gelen, başka bir rastgele dizeyle biten tüm dosyalarla eşleşir. Örneğin, foo/axx.htm ve foo/a.html veya foo/axxx.html
  • **/a.txt, bu paketin her alt dizinindeki her a.txt dosyasıyla eşleşir.
  • **/bar/**/*.txt, sonuçta elde edilen yoldaki en az bir dizinin adı bar ise bu paketin her alt dizinindeki her .txt dosyasıyla eşleşir (ör. xxx/bar/yyy/zzz/a.txt veya bar/a.txt (** ifadesinin sıfır segmentle de eşleştiğini unutmayın) ya da bar/zzz/a.txt)
  • **, bu paketin her alt dizinindeki her dosyayla eşleşir.
  • foo**/a.txt geçersiz bir kalıp çünkü ** tek başına bir segment olarak bulunmalıdır.

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

allow_empty bağımsız değişkeni False olarak ayarlanırsa sonuç boş liste olduğunda 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ığından glob() yalnızca kaynak ağacınızdaki dosyalarla eşleşir, oluşturulan dosyalarla hiçbir zaman eşleşmez. Hem kaynak hem de oluşturulan dosyaları gerektiren bir hedef oluşturuyorsanız glob'a oluşturulan dosyaların açık bir listesini eklemeniz gerekir. :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 kural, dosyayı "gölgeler".

    Bunu anlamak için glob() işlevinin 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 veriyorsa 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ını) kullanır. Daha fazla bilgi için GitHub sorunu #10395'e bakın.

  3. Glob'lar, alt dizinlerdeki dosyalarla eşleşebilir. Alt dizin adlarında joker karakterler kullanılabilir. 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 **/*.cc glob ifadesi, x/y bir paket olarak mevcutsa (x/y/BUILD olarak veya paket yolunda başka bir yerde) x/y/z.cc öğesini 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 olmasaydı veya --deleted_packages işareti kullanılarak silinmiş olarak işaretlenseydi aynı glob ifadesi x/y/z.cc öğesini içerirdi.

  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ı bileşik 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ş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 şekilde globbed dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "exclude" liste bağımsız değişkenine ekleyin.
  7. "**" joker karakterinin bir uç durumu vardır: "**" kalıbı, paketin dizin yoluyla eşleşmez. Yani glob(["**"], exclude_directories = 0), geçerli paketin dizininin altındaki tüm dosya ve dizinlerle geçişli olarak eşleşir (ancak alt paketlerin dizinlerine girmez. Bununla ilgili önceki nota bakın).

Genel olarak, glob kalıbı için yalın bir "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamaya çalışmalısınız. Daha açık bir ad, hem kendi kendini belgeleyebilir hem de yedek dosyaları veya emacs/vi/... otomatik kaydetme dosyalarını yanlışlıkla eşleştirmemenizi sağlar.

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

Glob Örnekleri

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

testdata dizinindeki experimental.txt hariç tüm txt dosyalarını dahil et. testdata'nın alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız özyinelemeli glob (**) kullanın.

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

Yinelemeli Glob Örnekleri

Testi, testdata dizinindeki ve alt dizinlerindeki (ve bunların alt dizinlerindeki vb.) tüm txt dosyalarına bağlı hale getirin. 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 yolu "testing" adlı bir dizin içerenler hariç tüm alt dizinlerden oluşturulan bir kitaplık oluşturun. Derleme artımlılığını azaltabileceği ve dolayısıyla derleme sürelerini uzatabileceği için mümkünse bu kalıptan kaçınılmalıdır.

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

Genişletilmiş Glob Örnekleri

Geçerli dizinde *_test.cc için dosyadaki satır sayısını hesaplayan 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 pakette eşleşen üç dosya (a_test.cc, b_test.cc ve c_test.cc) varsa bazel query '//foo:all' komutunu çalıştırdığınızda 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(), bir 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. Böylece, değeri komut satırı Bazel işaretlerine bağlı olur. Örneğin, platforma özgü bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ya da "sürüm" modunda oluşturulup oluşturulmadığına bağlı olarak farklı kaynaklar yerleştirmek için bu özelliği kullanabilirsiniz.

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, hedefin yapılandırması beklenen bir değer kümesiyle eşleşirse "eşleşen" bir config_setting veya constraint_value için etiket referansıdır. mytarget#srcs değeri, mevcut çağrıyla eşleşen etiket listesi olur.

Notlar:

  • Her çağrıda tam olarak bir koşul seçilir.
  • Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin özelleştirmesiyse özelleştirme öncelikli olur. B koşulu, A ile aynı işaretlere ve kısıtlama değerlerine ek olarak bazı ek işaretlere veya kısıtlama değerlerine sahipse A koşulunun bir uzmanlığı olarak kabul edilir. Bu aynı zamanda, uzmanlık çözümünün aşağıdaki Örnek 2'de gösterildiği gibi bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
  • Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin tümünün özelleştirmesi değilse tüm koşullar aynı değere çözümlenmediği sürece Bazel hata verir.
  • Başka bir koşul eşleşmezse özel sözde etiket //conditions:default eşleşmiş kabul edilir. Bu koşulun atlanması durumunda, hata oluşmaması 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. 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 değil, çoğu özellik ile çalışır. Uyumsuz özellikler, belgelerinde nonconfigurable ile işaretlenir.

    alt paketler

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

    subpackages(), dosya ve dizinler yerine alt paketleri listeleyen glob() işlevine benzer bir yardımcı işlevdir. glob() ile aynı yol kalıplarını kullanır ve o 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ının ayrıntılı açıklaması ve örnekleri için glob sayfasına bakın.

    Döndürülen alt paketlerin listesi sıralama ölçütüne göre sıralanmıştır ve include içindeki kalıplarla eşleşen ancak exclude içindeki kalıplarla eşleşmeyen, mevcut yükleme paketiyle ilgili yolları içerir.

    Örnek

    Aşağıdaki örnekte, foo/BUILD paketinin tüm doğrudan alt paketleri listelenmiştir.

    # 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.