Daftar Isi
paket
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Fungsi ini mendeklarasikan metadata yang berlaku untuk setiap aturan berikutnya dalam paket. Ini digunakan paling banyak sekali dalam satu paket (file CREATE).
Fungsi package() harus dipanggil tepat setelah semua pernyataan load() di bagian atas file, sebelum aturan apa pun.
Argumen
Atribut | Deskripsi |
---|---|
default_applicable_licenses |
Alias untuk |
default_visibility |
Visibilitas default dari aturan dalam paket ini. Setiap aturan dalam paket ini memiliki visibilitas yang ditentukan dalam atribut ini, kecuali jika ditentukan lain dalam atribut |
default_deprecation |
Menetapkan pesan
|
default_package_metadata |
Menetapkan daftar default target metadata yang berlaku untuk semua target lainnya dalam paket. Ini biasanya merupakan target yang terkait dengan paket OSS dan deklarasi lisensi. Lihat rules_license untuk mengetahui contohnya. |
default_testonly |
Menetapkan properti
Dalam paket di bagian |
features |
Menetapkan berbagai flag yang memengaruhi semantik file BUILD ini. Fitur ini terutama digunakan oleh orang yang mengerjakan sistem build untuk memberi tag pada paket yang memerlukan penanganan khusus. Jangan gunakan ini kecuali secara eksplisit diminta oleh seseorang yang mengerjakan sistem build. |
Contoh
Deklarasi di bawah mendeklarasikan bahwa aturan dalam paket ini hanya terlihat oleh anggota grup paket//foo:target
. Deklarasi visibilitas individual pada aturan, jika ada, mengganti spesifikasi ini.
package(default_visibility = ["//foo:target"])
grup_paket
package_group(name, packages, includes)
Fungsi ini menentukan kumpulan paket
dan mengaitkan label dengan kumpulan tersebut. Label dapat dirujuk dalam
atribut visibility
.
Grup paket terutama digunakan untuk kontrol visibilitas. Target yang terlihat secara publik dapat direferensikan dari setiap paket dalam hierarki sumber. Target yang terlihat secara pribadi hanya dapat direferensikan dalam paketnya sendiri (bukan sub-paket). Di antara ekstrem ini, target dapat mengizinkan akses ke paketnya sendiri, ditambah paket apa pun yang dijelaskan oleh satu atau beberapa grup paket. Untuk penjelasan sistem visibilitas yang lebih mendetail, lihat atribut visibilitas.
Paket tertentu dianggap berada dalam grup jika cocok dengan
atribut packages
, atau sudah terdapat dalam salah satu
grup paket lain yang disebutkan dalam atribut includes
.
Grup paket secara teknis adalah target, tetapi tidak dibuat oleh aturan, dan tidak memiliki perlindungan visibilitas apa pun.
Argumen
Atribut | Deskripsi |
---|---|
name |
Nama unik untuk target ini. |
packages |
Daftar nol atau beberapa spesifikasi paket. Setiap string spesifikasi paket dapat memiliki salah satu format berikut:
Selain itu, dua jenis spesifikasi paket pertama juga dapat
diawali dengan Grup paket berisi paket yang cocok dengan setidaknya salah satu
spesifikasi positifnya dan tidak ada spesifikasi negatifnya
Misalnya, nilai Selain visibilitas publik, tidak ada cara untuk menentukan paket secara langsung di luar repositori saat ini. Jika atribut ini tidak ada, sama seperti menyetelnya ke
daftar kosong, yang juga sama dengan menetapkannya ke daftar yang hanya
berisi Catatan: Sebelum Bazel 6.0, spesifikasi Catatan: Sebelum Bazel 6.0, jika atribut ini diserialisasi sebagai
bagian dari |
includes |
Grup paket lainnya yang disertakan dalam grup ini. Label dalam atribut ini harus mengacu pada grup paket lainnya.
Paket dalam grup paket yang direferensikan dianggap sebagai bagian dari
grup paket ini. Ini bersifat transitif — jika grup paket
Saat digunakan bersama dengan spesifikasi paket yang negatif, perlu diperhatikan bahwa paket paket untuk setiap grup akan dihitung terlebih dahulu secara independen dan hasilnya akan digabungkan. Artinya, spesifikasi yang negatif dalam satu grup tidak akan berpengaruh pada spesifikasi dalam grup lain. |
Contoh
Deklarasi package_group
berikut menentukan
grup paket yang disebut "tropis" yang berisi buah-buahan tropis.
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
Deklarasi berikut menentukan grup paket aplikasi fiktif:
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"], )
file_ekspor
exports_files([label, ...], visibility, licenses)
exports_files()
menentukan daftar file milik
paket ini yang diekspor ke paket lain.
File BUILD untuk paket hanya dapat merujuk langsung ke file sumber milik
paket lain jika file tersebut diekspor secara eksplisit dengan
pernyataan exports_files()
. Baca selengkapnya tentang visibilitas file.
Sebagai perilaku lama, file yang disebutkan sebagai input ke aturan diekspor
dengan visibilitas default hingga flag
--incompatible_no_implicit_file_export
dibalik. Namun, perilaku ini sebaiknya tidak diandalkan dan dimigrasikan secara aktif.
Argumen
Argumennya adalah daftar nama file dalam paket saat ini. Deklarasi visibilitas juga dapat ditentukan; dalam hal ini, file akan terlihat oleh target yang ditentukan. Jika tidak ada visibilitas yang ditentukan, file
akan terlihat oleh setiap paket, meskipun visibilitas default paket
ditentukan dalam fungsi
package
. Lisensi
juga dapat ditentukan.
Contoh
Contoh berikut mengekspor golden.txt
, file teks dari paket test_data
, sehingga paket
lain dapat menggunakannya, misalnya, dalam atribut
pengujian data
.
# from //test_data/BUILD exports_files(["golden.txt"])
glob
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob adalah fungsi bantuan yang menemukan semua file yang cocok dengan pola jalur tertentu, dan menampilkan daftar jalur yang baru, dapat diubah, dan diurutkan. Glob hanya menelusuri file dalam paketnya sendiri, dan hanya mencari file sumber (bukan file yang dihasilkan atau target lainnya).
Label file sumber disertakan dalam hasil jika jalur relatif paket
file cocok dengan pola include
dan tidak ada
pola exclude
.
Daftar include
dan exclude
berisi pola jalur
yang relatif terhadap paket saat ini. Setiap pola dapat terdiri dari satu atau beberapa segmen jalur. Seperti biasa dengan jalur Unix, segmen ini dipisahkan oleh /
. Segmen dapat berisi karakter pengganti *
: ini cocok dengan
substring apa pun di segmen jalur (bahkan substring kosong), tidak termasuk
pemisah direktori /
. Karakter pengganti ini dapat digunakan beberapa kali
dalam satu segmen jalur. Selain itu, karakter pengganti **
dapat cocok
dengan nol atau beberapa segmen jalur yang lengkap, tetapi karakter tersebut harus dideklarasikan sebagai segmen
jalur mandiri.
foo/bar.txt
sama persis dengan filefoo/bar.txt
dalam paket inifoo/*.txt
cocok dengan setiap file dalam direktorifoo/
jika file diakhiri dengan.txt
(kecualifoo/
adalah sub-paket)foo/a*.htm*
cocok dengan setiap file dalam direktorifoo/
yang diawali dengana
, kemudian memiliki string arbitrer (bisa kosong), lalu memiliki.htm
, dan diakhiri dengan string arbitrer lainnya; sepertifoo/axx.htm
danfoo/a.html
ataufoo/axxx.html
**/a.txt
cocok dengan setiap filea.txt
di setiap subdirektori paket ini**/bar/**/*.txt
cocok dengan setiap file.txt
di setiap subdirektori paket ini, jika setidaknya satu direktori di jalur yang dihasilkan disebutbar
, sepertixxx/bar/yyy/zzz/a.txt
ataubar/a.txt
(ingat bahwa**
juga cocok dengan nol segmen) ataubar/zzz/a.txt
**
cocok dengan setiap file di setiap subdirektori paket inifoo**/a.txt
adalah pola yang tidak valid, karena**
harus berdiri sendiri sebagai segmen
Jika argumen exclude_directories
diaktifkan (ditetapkan ke 1), file direktori
jenis akan dihilangkan dari hasil (default 1).
Jika argumen allow_empty
ditetapkan ke False
, fungsi
glob
akan mengalami error jika hasilnya akan menjadi
daftar kosong.
Ada beberapa batasan dan peringatan penting:
-
Karena
glob()
berjalan selama evaluasi file build,glob()
hanya akan mencocokkan file dalam hierarki sumber Anda, yang tidak pernah menghasilkan file. Jika mem-build target yang memerlukan file sumber dan yang dihasilkan, Anda harus menambahkan daftar eksplisit file yang dihasilkan ke glob. Lihat contoh di bawah dengan:mylib
dan:gen_java_srcs
. -
Jika nama aturan sama dengan file sumber yang cocok, aturan ini akan "membayangkan" file.
Untuk memahami hal ini, ingat bahwa
glob()
menampilkan daftar jalur, jadi menggunakanglob()
dalam atribut aturan lain (misalnya,srcs = glob(["*.cc"])
) memiliki efek yang sama seperti mencantumkan jalur yang cocok secara eksplisit. Jika misalnyaglob()
menghasilkan["Foo.java", "bar/Baz.java"]
tetapi ada juga aturan dalam paket yang disebut "Foo.java" (yang diizinkan, meskipun Bazel memperingatkan tentang hal tersebut), maka konsumenglob()
akan menggunakan aturan "Foo.java" (outputnya), bukan file "Foo.java". Lihat Masalah GitHub #10395 untuk detail selengkapnya. - Globs mungkin cocok dengan file di subdirektori. Selain itu, nama subdirektori mungkin menggunakan karakter pengganti. Namun...
-
Label tidak diizinkan melewati batas paket dan glob tidak cocok dengan file dalam sub-paket.
Misalnya, ekspresi glob
**/*.cc
dalam paketx
tidak menyertakanx/y/z.cc
jikax/y
ada sebagai paket (baik sebagaix/y/BUILD
, atau di tempat lain pada jalur paket). Artinya, hasil ekspresi glob sebenarnya bergantung pada keberadaan file BUILD — yaitu, ekspresi glob yang sama akan menyertakanx/y/z.cc
jika tidak ada paket bernamax/y
atau ditandai sebagai dihapus menggunakan tanda --deleted_packages. - Pembatasan di atas berlaku untuk semua ekspresi glob, apa pun karakter pengganti yang mereka gunakan.
-
File tersembunyi dengan nama file yang dimulai dengan
.
sepenuhnya dicocokkan dengan karakter pengganti**
dan*
. Jika ingin mencocokkan file tersembunyi dengan pola gabungan, pola Anda harus dimulai dengan.
. Misalnya,*
dan.*.txt
akan cocok dengan.foo.txt
, tetapi*.txt
tidak. Direktori tersembunyi juga dicocokkan dengan cara yang sama. Direktori tersembunyi dapat mencakup file yang tidak diperlukan sebagai input, dan dapat meningkatkan jumlah penggunaan memori serta file globb yang tidak perlu. Untuk mengecualikan direktori tersembunyi, tambahkan direktori tersebut ke argumen daftar "exclude". -
Karakter pengganti "**" memiliki satu kasus sudut: pola
"**"
tidak cocok dengan jalur direktori paket. Artinya,glob(["**"], exclude_directories = 0)
cocok dengan semua file dan direktori secara transitif secara ketat dalam direktori paket saat ini (tetapi tentu saja tidak, masuk ke direktori sub-paket - lihat catatan sebelumnya tentang hal itu).
Secara umum, Anda harus mencoba memberikan ekstensi yang sesuai (misalnya, *.html) bukan menggunakan tanda '*' untuk pola glob. Nama yang lebih eksplisit adalah mendokumentasikan dirinya sendiri secara akurat dan memastikan Anda tidak sengaja cocok dengan file cadangan, atau emacs/vi/... simpan otomatis file.
Saat menulis aturan build, Anda dapat menghitung elemen glob. Hal ini memungkinkan pembuatan aturan individual untuk setiap input. Lihat bagian contoh glob yang diperluas di bawah ini.
Contoh Glob
Buat library Java yang dibuat dari semua file java dalam direktori ini,
dan semua file yang dihasilkan oleh aturan :gen_java_srcs
.
java_library( name = "mylib", srcs = glob(["*.java"]) + [":gen_java_srcs"], deps = "...", ) genrule( name = "gen_java_srcs", outs = [ "Foo.java", "Bar.java", ], ... )
Sertakan semua file txt dalam direktori data pengujian kecuali eksperimental.txt. Perlu diperhatikan bahwa file di subdirektori data pengujian tidak akan disertakan. Jika Anda ingin file tersebut disertakan, gunakan glob rekursif (**).
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob( ["testdata/*.txt"], exclude = ["testdata/experimental.txt"], ), )
Contoh Glob Rekursif
Membuat pengujian bergantung pada semua file txt dalam direktori testdata dan subdirektorinya (serta subdirektorinya, dan sebagainya). Subdirektori yang berisi file Build diabaikan. (Lihat batasan dan peringatan di atas.)
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob(["testdata/**/*.txt"]), )
Buat library yang di-build dari semua file java dalam direktori ini dan semua subdirektori, kecuali yang jalurnya mencakup direktori bernama pengujian. Pola ini harus dihindari jika memungkinkan, karena dapat mengurangi inkrementalitas build sehingga meningkatkan waktu build.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Contoh Glob yang Diperluas
Buat setiap genrule untuk *_test.cc di direktori saat ini yang menghitung jumlah baris dalam file.
# 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"])]
Jika file BUILD di atas berada dalam paket //foo dan paketnya berisi tiga file yang cocok, a_test.cc, b_test.cc, dan c_test.cc, maka menjalankan bazel query '//foo:all'
akan mencantumkan semua aturan yang dihasilkan:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
pilih
select( {conditionA: valuesA, conditionB: valuesB, ...}, no_match_error = "custom message" )
select()
adalah fungsi bantuan yang membuat atribut aturan
menjadi dapat dikonfigurasi.
Properti ini dapat menggantikan sisi kanan
hampir
penetapan atribut apa pun sehingga nilainya bergantung pada tanda Bazel command line.
Anda dapat menggunakannya, misalnya, untuk menentukan dependensi khusus platform atau menyematkan berbagai resource, bergantung pada apakah aturan dibuat dalam mode "developer" vs. "release".
Penggunaan dasar adalah sebagai berikut:
sh_binary( name = "mytarget", srcs = select({ ":conditionA": ["mytarget_a.sh"], ":conditionB": ["mytarget_b.sh"], "//conditions:default": ["mytarget_default.sh"] }) )
Hal ini membuat atribut srcs
dari
sh_binary
dapat dikonfigurasi dengan mengganti penetapan daftar
label normalnya dengan panggilan select
yang memetakan
kondisi konfigurasi ke nilai yang cocok. Setiap kondisi merupakan referensi
label ke
config_setting
atau
constraint_value
,
yang "cocok" jika konfigurasi target cocok dengan kumpulan nilai
yang diharapkan. Selanjutnya, nilai mytarget#srcs
akan menjadi
daftar label mana pun yang cocok dengan pemanggilan saat ini.
Catatan:
- Hanya satu kondisi yang dipilih pada pemanggilan.
- Jika beberapa kondisi cocok dan satu kondisi adalah spesialisasi dari kondisi lainnya, spesialisasi tersebut akan diprioritaskan. Kondisi B dianggap sebagai spesialisasi kondisi A jika B memiliki semua tanda batasan dan nilai yang sama dengan A ditambah beberapa tanda batasan atau nilai batasan tambahan. Hal ini juga berarti bahwa resolusi spesialisasi tidak dirancang untuk membuat pengurutan seperti yang ditunjukkan dalam Contoh 2 di bawah.
- Jika beberapa kondisi cocok dan satu kondisi bukan spesialisasi dari semua kondisi lainnya, Bazel akan gagal dengan error, kecuali jika semua kondisi diselesaikan ke nilai yang sama.
- Label semu khusus
//conditions:default
dianggap cocok jika tidak ada kondisi lain yang cocok. Jika kondisi ini diabaikan, beberapa aturan lain harus cocok untuk menghindari error. select
dapat disematkan di dalam penetapan atribut yang lebih besar. Jadi,srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
dansrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
adalah ekspresi yang valid.select
berfungsi dengan sebagian besar atribut, tetapi tidak semua. Atribut yang tidak kompatibel ditandainonconfigurable
dalam dokumentasinya.sub-paket
subpackages(include, exclude=[], allow_empty=True)
subpackages()
adalah fungsi bantuan, mirip denganglob()
yang mencantumkan sub-paket, bukan file dan direktori. Pola ini menggunakan pola jalur yang sama denganglob()
dan dapat cocok dengan subpaket apa pun yang merupakan turunan langsung dari file build yang sedang dimuat. Lihat glob untuk mendapatkan penjelasan terperinci dan contoh pola penyertaan dan pengecualian.Daftar subpaket yang ditampilkan ditampilkan dalam urutan yang diurutkan dan berisi jalur yang relatif terhadap paket pemuatan saat ini yang cocok dengan pola yang diberikan dalam
include
, bukan yang ada diexclude
.Contoh
Contoh berikut mencantumkan semua subpaket langsung untuk paket
foo/BUILD
# 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'
Secara umum, daripada memanggil fungsi ini secara langsung, pengguna harus menggunakan modul 'subpackages dari skylib.