Daftar Isi
Paket
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Fungsi ini mendeklarasikan metadata yang berlaku untuk setiap aturan dalam paket. Fungsi ini digunakan paling banyak satu kali dalam paket (file BUILD).
Untuk fungsi yang mendeklarasikan metadata yang berlaku untuk setiap aturan di seluruh
repositori, gunakan fungsi repo() dalam file
REPO.bazel di root repo Anda.
Fungsi repo() menggunakan argumen yang sama persis dengan package().
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 |
Daftar label; default-nya adalah Visibilitas default target aturan level atas dan makro simbolis
dalam paket ini — yaitu, target dan makro simbolis
yang tidak dideklarasikan di dalam makro simbolis. Atribut ini
diabaikan jika target atau makro menentukan nilai Untuk informasi mendetail tentang sintaksis atribut ini, lihat dokumentasi visibility. Visibilitas default paket tidak berlaku untuk exports_files, yang bersifat publik secara default. |
default_deprecation |
String; default-nya adalah Menetapkan pesan
|
default_package_metadata |
Daftar label; default-nya adalah Menetapkan daftar default target metadata yang berlaku untuk semua target lain dalam paket. Target ini biasanya terkait dengan deklarasi paket dan lisensi OSS. Lihat rules_license untuk contohnya. |
default_testonly |
Boolean; default-nya adalah Menetapkan properti
Dalam paket di bagian |
features |
String daftar; default-nya adalah Menetapkan berbagai flag yang memengaruhi semantik file BUILD ini. Fitur ini terutama digunakan oleh orang yang mengerjakan sistem build untuk menandai paket yang memerlukan penanganan khusus. Jangan gunakan fitur ini kecuali jika diminta secara eksplisit oleh seseorang yang mengerjakan sistem build. |
Contoh
Deklarasi di bawah mendeklarasikan bahwa aturan dalam paket ini hanya dapat dilihat oleh anggota grup paket//foo:target. Deklarasi visibilitas individual pada aturan, jika ada, akan mengganti spesifikasi ini.
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
Fungsi ini menentukan sekumpulan paket
dan mengaitkan label dengan kumpulan tersebut. Label dapat direferensikan dalam atribut visibility.
Grup paket terutama digunakan untuk kontrol visibilitas. Target yang terlihat secara publik dapat direferensikan dari setiap paket di pohon sumber. Target yang terlihat secara pribadi hanya dapat direferensikan dalam paketnya sendiri (bukan subpaket). Di antara kedua ekstrem ini, target dapat mengizinkan akses ke paketnya sendiri ditambah paket apa pun yang dijelaskan oleh satu atau beberapa grup paket. Untuk penjelasan yang lebih mendetail tentang sistem visibilitas, lihat atribut visibilitas.
Paket tertentu dianggap berada dalam grup jika cocok dengan atribut packages, atau sudah ada 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.
Argumen
| Atribut | Deskripsi |
|---|---|
name |
Nama; wajib Nama unik untuk target ini. |
packages |
Daftar string; default-nya adalah Daftar nol atau beberapa spesifikasi paket. Setiap string spesifikasi paket dapat memiliki salah satu bentuk berikut:
Selain itu, dua jenis spesifikasi paket pertama juga dapat
diawali dengan Grup paket berisi paket apa pun yang cocok dengan setidaknya satu spesifikasi positifnya dan tidak ada spesifikasi negatifnya. Misalnya, nilai Selain visibilitas publik, tidak ada cara untuk menentukan paket di luar repositori saat ini secara langsung. Jika atribut ini tidak ada, atribut ini sama dengan menetapkannya ke daftar kosong, yang juga sama dengan menetapkannya ke daftar yang hanya berisi Catatan: Sebelum Bazel 6.0, spesifikasi Catatan: Sebelum Bazel 6.0, saat atribut ini diserialkan sebagai
bagian dari |
includes |
Daftar label; default-nya adalah Grup paket lain yang disertakan dalam grup paket ini. Label dalam atribut ini harus merujuk ke grup paket lain.
Paket dalam grup paket yang direferensikan dianggap sebagai bagian dari grup paket ini. Hal ini bersifat transitif — jika grup paket
Saat digunakan bersama dengan spesifikasi paket yang dinegasikan, perhatikan bahwa kumpulan paket untuk setiap grup pertama-tama dihitung secara independen dan hasilnya kemudian digabungkan. Artinya, spesifikasi yang dinegasikan berpengaruh pada spesifikasi di grup lain. |
Contoh
Deklarasi package_group berikut menentukan grup paket bernama "tropical" 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"],
)
exports_files
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 diekspor secara eksplisit dengan
exports_files() pernyataan. Baca lebih lanjut tentang
visibilitas file.
Sebagai perilaku lama, file yang disebutkan sebagai input ke aturan juga diekspor
dengan visibilitas default hingga flag
--incompatible_no_implicit_file_export
diubah. Namun, perilaku ini tidak boleh diandalkan dan harus 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 data pengujian.
# 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 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 salah satu 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 dalam pola dicocokkan dengan segmen jalur. Segmen dapat berisi karakter pengganti *: karakter ini cocok dengan
substring apa pun dalam segmen jalur (bahkan substring kosong), kecuali 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 lengkap, tetapi harus dideklarasikan sebagai segmen jalur mandiri.
foo/bar.txtcocok dengan filefoo/bar.txtdalam paket ini (kecuali jikafoo/adalah subpaket)foo/*.txtcocok dengan setiap file di direktorifoo/jika file diakhiri dengan.txt(kecuali jikafoo/adalah subpaket)foo/a*.htm*cocok dengan setiap file di direktorifoo/yang dimulai dengana, lalu memiliki string arbitrer (bisa kosong), lalu memiliki.htm, dan diakhiri dengan string arbitrer lainnya (kecuali jikafoo/adalah subpaket); sepertifoo/axx.htmdanfoo/a.htmlataufoo/axxx.htmlfoo/*cocok dengan setiap file di direktorifoo/, (kecuali jikafoo/adalah subpaket); tidak cocok dengan direktorifooitu sendiri meskipunexclude_directoriesditetapkan ke 0foo/**cocok dengan setiap file di setiap subdirektori non-subpaket di bawah subdirektori tingkat pertama paketfoo/; jikaexclude_directoriesditetapkan ke 0,foodirektori itu sendiri juga cocok dengan pola; dalam hal ini,**dianggap cocok dengan nol segmen jalur**/a.txtcocok dengan filea.txtdi direktori paket ini ditambah subdirektori non-subpaket.**/bar/**/*.txtcocok dengan setiap file.txtdi setiap subdirektori non-subpaket dari paket ini, jika setidaknya satu direktori di jalur yang dihasilkan disebutbar, sepertixxx/bar/yyy/zzz/a.txtataubar/a.txt(ingat bahwa**juga cocok dengan nol segmen) ataubar/zzz/a.txt**cocok dengan setiap file di setiap subdirektori non-subpaket dari paket inifoo**/a.txtadalah pola yang tidak valid, karena**harus berdiri sendiri sebagai segmenfoo/adalah pola yang tidak valid, karena segmen kedua yang ditentukan setelah/adalah string kosong
Jika argumen exclude_directories diaktifkan (ditetapkan ke 1), file jenis direktori akan dihilangkan dari hasil (default 1).
Jika argumen allow_empty ditetapkan ke False, fungsi glob akan menampilkan error jika hasilnya adalah daftar kosong.
Ada beberapa batasan dan peringatan penting:
-
Karena
glob()berjalan selama evaluasi file BUILD,glob()hanya cocok dengan file di pohon sumber Anda, bukan file yang dihasilkan. Jika Anda membuat target yang memerlukan file sumber dan file yang dihasilkan, Anda harus menambahkan daftar eksplisit file yang dihasilkan ke glob. Lihat contoh di bawah dengan:mylibdan:gen_java_srcs. -
Jika aturan memiliki nama yang sama dengan file sumber yang cocok, aturan tersebut akan "menutupi" file.
Untuk memahaminya, ingatlah bahwa
glob()menampilkan daftar jalur, sehingga menggunakanglob()dalam atribut aturan lain (misalnya,srcs = glob(["*.cc"])) memiliki efek yang sama dengan mencantumkan jalur yang cocok secara eksplisit. Jika, misalnya,glob()menghasilkan["Foo.java", "bar/Baz.java"]tetapi ada juga aturan dalam paket yang disebut "Foo.java" (yang diizinkan, meskipun Bazel memperingatkannya), maka konsumenglob()akan menggunakan aturan "Foo.java" (outputnya), bukan file "Foo.java". Lihat GitHub masalah #10395 untuk mengetahui detail selengkapnya. - Glob dapat cocok dengan file di subdirektori. Nama subdirektori juga dapat menggunakan karakter pengganti. Namun...
-
Label tidak diizinkan untuk melintasi batas paket dan glob tidak cocok dengan file di subpaket.
Misalnya, ekspresi glob
**/*.ccdalam paketxtidak menyertakanx/y/z.ccjikax/yada sebagai paket (baik sebagaix/y/BUILD, atau di tempat lain di jalur paket). Artinya, hasil ekspresi glob sebenarnya bergantung pada keberadaan file BUILD — yaitu, ekspresi glob yang sama akan menyertakanx/y/z.ccjika tidak ada paket bernamax/yatau paket tersebut ditandai sebagai dihapus menggunakan flag --deleted_packages. - Pembatasan di atas berlaku untuk semua ekspresi glob, apa pun karakter pengganti yang digunakan.
-
File tersembunyi dengan nama file yang dimulai dengan
.sepenuhnya cocok dengan karakter pengganti**dan*Jika Anda ingin mencocokkan file tersembunyi dengan pola gabungan, pola Anda harus dimulai dengan.. Misalnya,*dan.*.txtakan cocok dengan.foo.txt, tetapi*.txttidak akan cocok. Direktori tersembunyi juga cocok dengan cara yang sama. Direktori tersembunyi dapat menyertakan file yang tidak diperlukan sebagai input, dan dapat meningkatkan jumlah file yang tidak perlu di-glob dan penggunaan memori. Untuk mengecualikan direktori tersembunyi, tambahkan direktori tersebut ke argumen daftar "exclude". -
Karakter pengganti "**" memiliki satu kasus ekstrem: pola
"**"tidak cocok dengan jalur direktori paket. Artinya,glob(["**"], exclude_directories = 0)cocok dengan semua file dan direktori secara transitif dan ketat di bawah direktori paket saat ini (tetapi tentu saja tidak masuk ke direktori subpaket - lihat catatan sebelumnya tentang hal tersebut).
Secara umum, Anda harus mencoba memberikan ekstensi yang sesuai (misalnya, *.html), bukan menggunakan '*' kosong untuk pola glob. Nama yang lebih eksplisit akan mendokumentasikan dirinya sendiri dan memastikan Anda tidak secara tidak sengaja mencocokkan file cadangan, atau file simpan otomatis emacs/vi/....
Saat menulis aturan build, Anda dapat menghitung elemen glob. Hal ini memungkinkan pembuatan aturan individual untuk setiap input, misalnya. Lihat bagian contoh glob yang diperluas di bawah.
Contoh Glob
Buat library Java yang dibuat dari semua file java di 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 di direktori testdata kecuali experimental.txt. Perhatikan bahwa file di subdirektori testdata tidak akan disertakan. Jika Anda ingin menyertakan file tersebut, gunakan glob rekursif (**).
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(
["testdata/*.txt"],
exclude = ["testdata/experimental.txt"],
),
)
Contoh Glob Rekursif
Buat pengujian bergantung pada semua file txt di direktori testdata dan subdirektori mana pun (dan subdirektorinya, dan seterusnya). Subdirektori yang berisi file BUILD akan diabaikan. (Lihat batasan dan peringatan di atas.)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(["testdata/**/*.txt"]),
)
Buat library yang dibuat dari semua file java di direktori ini dan semua subdirektori kecuali yang jalurnya menyertakan direktori bernama testing. Pola ini harus dihindari jika memungkinkan, karena dapat mengurangi inkrementalitas build dan oleh karena itu meningkatkan waktu build.
java_library(
name = "mylib",
srcs = glob(
["**/*.java"],
exclude = ["**/testing/**"],
),
)
Contoh Glob yang Diperluas
Buat genrule individual 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 paket tersebut berisi tiga file yang cocok, a_test.cc, b_test.cc, dan c_test.cc, 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
select
select(
{conditionA: valuesA, conditionB: valuesB, ...},
no_match_error = "custom message"
)
select() adalah fungsi bantuan yang membuat atribut aturan
dapat dikonfigurasi.
Fungsi ini dapat menggantikan sisi kanan
hampir
penetapan atribut apa pun sehingga nilainya bergantung pada flag Bazel command line.
Anda dapat menggunakan fungsi ini, misalnya, untuk menentukan dependensi khusus platform atau menyematkan resource yang berbeda, bergantung pada apakah aturan dibuat dalam mode "developer" atau "rilis".
Penggunaan dasarnya 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 adalah referensi label ke config_setting atau constraint_value, yang "cocok" jika konfigurasi target cocok dengan kumpulan nilai yang diharapkan. Nilai mytarget#srcs kemudian menjadi daftar label mana pun yang cocok dengan pemanggilan saat ini.
Catatan:
- Hanya satu kondisi yang dipilih pada pemanggilan apa pun.
- Jika beberapa kondisi cocok dan salah satunya adalah spesialisasi dari kondisi lainnya, spesialisasi akan diutamakan. Kondisi B dianggap sebagai a spesialisasi kondisi A jika B memiliki semua flag dan batasan nilai yang sama dengan A ditambah beberapa flag 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 salah satunya bukan spesialisasi dari semua kondisi lainnya, Bazel akan gagal dengan error, kecuali jika semua kondisi di-resolve ke nilai yang sama.
- Pseudo-label khusus
//conditions:defaultdianggap cocok jika tidak ada kondisi lain yang cocok. Jika kondisi ini dihilangkan, beberapa aturan lain harus cocok untuk menghindari error. selectdapat 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.selectberfungsi dengan sebagian besar, tetapi tidak semua, atribut. Atribut yang tidak kompatibel ditandainonconfigurabledalam dokumentasinya.subpackages
subpackages(include, exclude=[], allow_empty=True)
subpackages()adalah fungsi bantuan, mirip denganglob()yang mencantumkan subpaket, bukan file dan direktori. Fungsi ini menggunakan pola jalur yang sama denganglob()dan dapat cocok dengan subpaket apa pun yang merupakan turunan langsung dari file BUILD yang saat ini dimuat. Lihat glob untuk penjelasan mendetail dan contoh pola sertakan dan kecualikan.Daftar subpaket yang dihasilkan ditampilkan dalam urutan yang diurutkan dan berisi jalur yang relatif terhadap paket pemuatan saat ini yang cocok dengan pola yang diberikan di
includedan 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/bar/but/bad/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs1 = subpackages(include = ["**"]) # results in subs1 == ["sub", "bar/baz", "bar/but/bad"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo' subs2 = subpackages(include = ["bar/*"]) # results in subs2 = ["bar/baz"] # # Since 'bar' is not a subpackage itself, this looks for any subpackages under # all first level subdirectories of 'bar'. subs3 = subpackages(include = ["bar/**"]) # results in subs3 = ["bar/baz", "bar/but/bad"] # # Since bar is not a subpackage itself, this looks for any subpackages which are # (1) under all subdirectories of 'bar' which can be at any level, (2) not a # subpackage of another subpackages. subs4 = subpackages(include = ["sub"]) subs5 = subpackages(include = ["sub/*"]) subs6 = subpackages(include = ["sub/**"]) # results in subs4 and subs6 being ["sub"] # results in subs5 = []. # # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a # subpackage of 'foo'). # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since # 'foo/sub' is already a subpackage itself, the subdirectories will not be # traversed anymore. # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it # is returned. But the subdirectories of 'foo/sub' will not be traversed # anymore.
Secara umum, sebaiknya pengguna menggunakan modul 'subpackages' skylib , bukan memanggil fungsi ini secara langsung.