İşlevler

İçindekiler

paket

package(default_deprecation, default_testonly, default_visibility, features)

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

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_visibility

List of labels; optional

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

Kuralın visibility özelliğinde aksi belirtilmedikçe, bu paketteki her kural, bu özellikte belirtilen görünürlüğe sahiptir. Bu özelliğin söz dizimi hakkında 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

String; optional

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

default_testonly

Boolean; optional; default is False except as noted

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

javatests altındaki paketlerde varsayılan değer 1'dir.

features

List strings; optional

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

Bu özellik genellikle özel işlem gerektiren 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 talep edilmediği sürece bunu kullanmayın.

Örnekler

Aşağıdaki beyanda, bu paketteki kuralların yalnızca //foo:target paket grubunun üyeleri tarafından görülebileceği belirtilmektedir. Bir kuraldaki bağımsız 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 grubunu tanımlar ve bir etiketi grupla ilişkilendirir. Etikete visibility özelliklerinde referans verilebilir.

Paket grupları temel olarak görünürlük denetimi için kullanılır. Kaynak ağaçtaki her paketten herkese açık bir hedefe referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketi içinde referans verilebilir (alt paketler değil). Bu uç noktalar arasında, bir hedef kendi paketine ve bir veya daha fazla paket grubu tarafından tanımlanan paketlere erişime izin verebilir. Görünürlük sistemiyle ilgili daha ayrıntılı açıklama için görünürlük özelliğine bakın.

Belirli bir paket, packages özelliğiyle eşleşiyor 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ına sahip değildir.

Bağımsız değişkenler

Özellik Açıklama
name

Name; required

Bu hedef için benzersiz bir ad.

packages

List of strings; optional

Sıfır veya daha fazla paket özelliğinden oluşan liste.

Her paket spesifikasyonu 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ıdaki gibi, ancak sonuna /... eklenir. Örneğin //foo/..., //foo grubunu ve tüm alt paketlerini belirtir. //..., mevcut depodaki tüm paketleri belirtir.
  3. public veya private dizeleri (sırasıyla her paketi veya hiçbir paketi belirtmez). (Bu form için --incompatible_package_group_has_public_syntax işaretinin ayarlanması gerekir.)

Ayrıca, ilk iki paket özelliği türünün ters bırakıldığını belirtmek için bunlara - öneki de eklenebilir.

Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ancak negatif özelliklerinden hiçbiriyle eşleşen herhangi bir paket içeriyor. Örneğin, [//foo/..., -//foo/tests/...] değeri, //foo özelliğinin aynı zamanda //foo/tests alt paketleri olmayan tüm alt paketlerini içerir. (//foo/tests dahil değildir ancak //foo'ın kendisi dahil edilir.)

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 ayarlamak, yalnızca private içeren bir listeye ayarlamakla aynı şeydir.

Not: Bazel 6.0'dan önce //... spesifikasyonunun davranışı public ile aynıydı. --incompatible_fix_package_group_reporoot_syntax etkinleştirildiğinde bu davranış düzeltilir. Bu ayar, Bazel 6.0'dan sonra varsayılan olarak belirlenir.

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

includes

List of labels; optional

Buna dahil olan diğer paket grupları.

Bu özellikteki etiketler diğer paket gruplarına referans vermelidir. Başvurulan paket gruplarındaki paketler, bu paket grubunun parçası olarak kabul edilir. Bu geçişlidir. a paket grubu b paket grubunu, b paket grubunu da c paket grubunu içeriyorsa c kapsamındaki her paket de a grubunun üyesi olur.

Reddedilen paket özellikleriyle birlikte kullanıldığında, her bir grup için paket grubunun önce bağımsız olarak hesaplandığını ve daha sonra sonuçların birlikte toplandığını unutmayın. Bu da bir gruptaki reddedilen spesifikasyonların diğer gruptaki spesifikasyonlar üzerinde herhangi bir etkisi olmadığı anlamına gelir.

Örnekler

Aşağıdaki package_group beyanı, 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 DERLEME dosyası, yalnızca exports_files() ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalarına doğrudan referans verebilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.

Eski bir davranış olarak, bir kurala girdi olarak bahsedilen dosyalar da bayrak --incompatible_no_implicit_file_export çevrilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranış temel alınmaması ve etkin bir şekilde taşınmaması gerekir.

Bağımsız değişkenler

Bağımsız değişken, geçerli paketteki dosyaların 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 paket 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ılı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 bunların yollarının yeni, değişebilir, sıralanmış listesini döndüren yardımcı bir işlevdir. Glob, dosyalarda yalnızca kendi paketinde arama yapar ve sadece kaynak dosyaları arar (oluşturulan dosyaları veya diğer hedefleri değil).

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

include ve exclude listeleri, mevcut paketle göreli yol kalıpları içerir. Her kalıp, bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında her zamanki gibi bu segmentler / ile ayrılır. Segmentler, * joker karakterini içerebilir. Bu, dizin ayırıcısı / hariç olmak üzere yol segmentindeki (boş alt dize dahil) herhangi bir alt dizeyle 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/ dizinindeki a ile başlayan, rastgele bir dizeye (boş olabilir) sahip, ardından .htm içeren ve isteğe bağlı başka bir dizeyle biten her dosyayla eşleşir (ör. 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, bu paketin her alt dizinindeki her bir .txt dosyasıyla eşleşir. Sonuçta ortaya çıkan dizinlerden en az biri bar olarak adlandırılırsa (ör. xxx/bar/yyy/zzz/a.txt veya bar/a.txt) (** öğesinin sıfır segmentle eşleştiğini unutmayın) veya 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 durmalıdır

exclude_directories bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanır) 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 olursa glob işlevi hata verir.

Birkaç önemli sınırlama ve uyarı söz konusudur:

  1. glob(), DERLEME dosyası değerlendirmesi sırasında çalıştığından glob() yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiçbir zaman oluşturulmamış dosyaları eşleştirir. Hem kaynak hem de oluşturulmuş dosyalar gerektiren bir hedef oluşturuyorsanız oluşturulan dosyaların açık listesini glob'a eklemeniz gerekir. :mylib ve :gen_java_srcs ile birlikte aşağıdaki örneğe bakın.

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

    Bunu anlamak için glob() işlevinin bir yol listesi döndürdüğünü unutmayın.Dolayısıyla, diğer kuralların özelliğinde (ör. srcs = glob(["*.cc"])) glob() kullanmak, eşleşen yolların açıkça listelenmesi ile aynı etkiye sahiptir. Örneğin glob(), ["Foo.java", "bar/Baz.java"] sonucunu verir ancak pakette "Foo.java" adında bir kural da varsa (Bazel tarafından uyarılsa da buna izin verilir) glob() tüketicisi "Foo.java" dosyası yerine "Foo.java" kuralını (çıktılarını) kullanır. Daha fazla bilgi için GitHub #10395 sorunu bölümüne bakın.

  3. Glob'lar, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına da joker karakter 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 yolunda başka bir yerdeyse) x paketindeki **/*.cc glob ifadesi x/y/z.cc içermez. Diğer bir deyişle, glob ifadesi sonucunda elde edilen sonuç, aslında DERLEME dosyalarının varlığına bağlıdır. Yani, x/y adında bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlendiyse aynı glob ifadesi, x/y/z.cc ifadesini de içerir.

  5. Yukarıdaki kısıtlama, kullandıkları joker karakterlerden bağımsız olarak tüm glob ifadeleri için geçerlidir.
  6. Dosya adı . ile başlayan bir gizli dosya, hem ** hem de * joker karakterlerle tam olarak 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 yere küresel dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için "hariç tut" listesi bağımsız değişkenine ekleyin.
  7. "**" joker karakterinin yalnızca bir köşesi vardır: "**" kalıbı, paketin dizin yoluyla eşleşmiyor. Diğer bir deyişle, glob(["**"], exclude_directories = 0), mevcut paketin dizinindeki tüm dosya ve dizinleri geçişli olarak eşleştirir (ancak elbette alt paketlerin dizinlerine girmez; bu konuyla ilgili bir önceki notu inceleyin).

Genel olarak, glob kalıp için sadece "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemeniz gerekir. Daha açık olan ad, hem kendini belgeleme hem de yedek dosyaları veya emacs/vi/... otomatik kaydedilen dosyaları yanlışlıkla eşleştirmemenizi sağlar.

Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. 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.

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

Experiment.txt dışındaki tüm txt dosyalarını dizin test verilerine ekleyin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmediğini unutmayın. Bu dosyaların eklenmesini istiyorsanız yinelemeli glob (**) kullanın.

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

Yinelemeli Küre Örnekleri

Testi, testverileri dizinindeki ve bu dizinin tüm alt dizinlerindeki (ve bunların alt dizinleri vb.) tüm txt dosyalarına bağlı hale getirin. DERLEME dosyası içeren alt dizinler yok sayı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 tüm Java dosyalarından ve 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 artırabileceğ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ş Yerküre Örnekleri

Geçerli dizinde, dosyadaki satır sayısını sayan tek bir *_test.cc öğesi için tek bir tür 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 DERLEME dosyası //foo paketindeyse ve paket üç eşleşen dosya içeriyorsa (a_test.cc, b_test.cc ve c_test.cc) 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çer

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, böylece değeri komut satırındaki Bazel işaretlerine bağlıdır. Örneğin, platforma özgü bağımlılıkları tanımlamak veya bir kuralın "geliştirici" modunda mı yoksa "sürüm" modunda mı oluşturulduğuna 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, bir sh_binary öğesinin 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 sh_binary öğesinin srcs özelliğini yapılandırılabilir hale getirir. Her koşul, config_setting veya constraint_value için bir etiket referansıdır. Hedefin yapılandırması beklenen bir değer grubuyla eşleşirse "eşleşir". Ardından mytarget#srcs değeri, mevcut çağrıyla eşleşen etiket listesi olur.

Notlar:

  • Herhangi bir çağrıda tam olarak bir koşul seçilir.
  • Birden fazla koşul eşleşirse ve biri diğerlerinin uzmanlığıysa uzmanlık öncelikli olur. B koşulu, A ile aynı işaret ve kısıtlama değerlerine ve bazı ek işaretlere veya kısıtlama değerlerine sahipse B koşulu, A koşulunun uzmanlığı olarak kabul edilir. Bu, uzmanlık çözümünün aşağıdaki 2. Örnek'te gösterildiği gibi bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
  • Birden fazla koşul eşleşirse ve bir koşul diğer tüm koşulların uzmanlığı değilse Bazel bir hatayla başarısız olur.
  • Başka koşul eşleşmediğinde //conditions:default özel sözde etiket eşleşmiş olarak kabul edilir. Bu koşul dışarıda bırakılırsa hatadan kaçınmak 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ş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 şu anda yüklenen BUILD dosyasının doğrudan alt öğesi olan herhangi bir alt paketle eşleşebilir. Ayrıntılı açıklama ile dahil etme ve hariç tutma kalıplarına ilişkin örnekler için glob'a bakın.

    Döndürülen alt paketlerin sonuç listesi, sıralı düzendedir ve exclude içindekiler değil, include içindeki belirtilen kalıplarla eşleşen geçerli yükleme paketine göre yollar içerir.

    Örnek

    Aşağıdaki örnekte foo/BUILD paketi için 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 "alt paketler" modülünü kullanmaları tercih edilir.