Label adalah ID untuk target. Label standar dalam bentuk kanonis lengkap terlihat seperti:
@@myrepo//my/app/main:app_binary
Bagian pertama label adalah nama repositori, @@myrepo
. Sintaksis @
ganda menunjukkan bahwa ini adalah nama repo kanonis
, yang unik dalam
ruang kerja. Label dengan nama repo kanonis mengidentifikasi target secara jelas
tidak peduli di konteks mana
mereka muncul.
Sering kali nama repositori kanonis adalah string misterius yang terlihat seperti
@@rules_java~7.1.0~toolchains~local_jdk
. Yang jauh lebih sering ditemui adalah
label dengan nama repo jelas,
yang terlihat seperti ini:
@myrepo//my/app/main:app_binary
Satu-satunya perbedaan adalah nama repo diawali dengan satu @
, bukan dua.
Ini mengacu pada repo dengan nama jelas myrepo
, yang dapat berbeda
berdasarkan konteks di mana label ini muncul.
Dalam kasus umum bahwa label merujuk ke repositori yang sama tempat
label digunakan, bagian nama repo dapat dihilangkan. Jadi, di dalam @@myrepo
, label
pertama biasanya ditulis sebagai
//my/app/main:app_binary
Bagian kedua dari label adalah nama paket yang tidak memenuhi syarat
my/app/main
, jalur ke paket
relatif terhadap {i>
root <i}repositori. Bersama-sama, nama repositori dan
nama paket yang tidak memenuhi syarat membentuk nama paket yang sepenuhnya memenuhi syarat
@@myrepo//my/app/main
. Ketika label mengacu pada
paket yang digunakan, nama paket (dan jika perlu, tanda titik dua)
dapat dihilangkan. Jadi, di dalam @@myrepo//my/app/main
,
label ini dapat ditulis dengan salah satu cara berikut:
app_binary
:app_binary
Ini merupakan suatu hal yang normal di mana tanda titik dua dihilangkan untuk file, tetapi dipertahankan untuk aturan, tetapi tidak terlalu signifikan.
Bagian label setelah titik dua, app_binary
adalah nama target
yang tidak memenuhi syarat. Ketika cocok dengan komponen terakhir
dari jalur paket, itu, dan
titik dua, dapat dihilangkan. Jadi, kedua label ini setara:
//my/app/lib
//my/app/lib:lib
Nama target file dalam subdirektori paket adalah jalur file
relatif terhadap root paket (direktori yang berisi file BUILD
). Jadi,
file ini ada di subdirektori my/app/main/testdata
dari repositori:
//my/app/main:testdata/input.txt
String seperti //my/app
dan @@some_repo//my/app
memiliki dua arti, bergantung pada
konteks tempatnya digunakan: saat Bazel mengharapkan label, string tersebut masing-masing berarti
//my/app:app
dan @@some_repo//my/app:app
. Tapi, ketika Bazel
mengharapkan paket (mis. dalam spesifikasi package_group
), mereka mereferensikan
paket yang
mengandung label tersebut.
Kesalahan umum dalam file BUILD
adalah menggunakan //my/app
untuk merujuk ke sebuah paket, atau
ke semua target dalam sebuah paket, tetapi tidak demikian. Ingat, ini
setara dengan //my/app:app
, sehingga memberi nama target app
dalam paket
my/app
repositori saat ini.
Namun, penggunaan //my/app
untuk merujuk ke paket dianjurkan dalam
spesifikasi package_group
atau dalam file .bzl
, karena dengan jelas
menunjukkan bahwa nama paket bersifat absolut dan di-root di direktori
level teratas ruang kerja.
Label relatif tidak dapat digunakan untuk merujuk ke target dalam paket lain;
ID repositori dan nama paket harus selalu ditentukan dalam hal ini.
Misalnya, jika hierarki sumber berisi paket my/app
dan
paket my/app/testdata
(setiap dari dua direktori ini memiliki file
BUILD
-nya sendiri), paket kedua berisi file bernama testdepot.zip
. Berikut
ada dua cara (satu salah, satu benar) untuk merujuk ke file ini dalam
//my/app:BUILD
:
Salah — testdata
adalah paket yang berbeda, sehingga Anda tidak dapat menggunakan jalur relatif
testdata/testdepot.zip
Benar — lihat testdata
dengan jalur lengkapnya
//my/app/testdata:testdepot.zip
Label yang diawali dengan @@//
adalah referensi ke repositori
utama, yang akan tetap berfungsi bahkan dari repositori eksternal.
Oleh karena itu, @@//a/b/c
berbeda dengan
//a/b/c
saat direferensikan dari repositori eksternal.
Yang pertama merujuk kembali ke repositori utama, sedangkan yang kedua
mencari //a/b/c
di repositori eksternal itu sendiri.
Hal ini sangat relevan saat menulis aturan di repositori utama yang merujuk ke target di repositori utama, dan akan digunakan dari repositori eksternal.
Untuk mengetahui informasi tentang berbagai cara untuk merujuk ke target, lihat pola target.
Spesifikasi leksikografis label
Sintaksis label tidak menganjurkan penggunaan karakter meta yang memiliki makna khusus untuk shell. Hal ini membantu menghindari masalah kutipan yang tidak disengaja, dan mempermudah pembuatan alat dan skrip yang memanipulasi label, seperti Bazel Query Language.
Detail persis nama target yang diizinkan tercantum di bawah.
Nama target — package-name:target-name
target-name
adalah nama target dalam paket. Nama aturan
adalah nilai atribut name
dalam deklarasi aturan dalam file BUILD
; nama file adalah jalurnya yang relatif terhadap direktori yang berisi
file BUILD
.
Nama target harus terdiri sepenuhnya dari karakter yang digambar dari kumpulan a
–z
,
A
–Z
, 0
–9
, dan simbol tanda baca !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
.
Nama file harus berupa nama jalur relatif dalam bentuk normal, yang berarti nama file tidak boleh
dimulai atau diakhiri dengan garis miring (misalnya, /foo
dan foo/
dilarang) atau berisi beberapa garis miring berturut-turut sebagai pemisah jalur
(misalnya, foo//bar
). Demikian pula, referensi tingkat atas (..
) dan
referensi direktori saat ini (./
) dilarang.
Salah — Jangan gunakan `..` untuk merujuk ke file dalam paket lain
Benar — Gunakan `//package-name:filename`
Meskipun penggunaan /
dalam nama target file umum dilakukan, hindari penggunaan
/
dalam nama aturan. Terutama ketika bentuk singkat dari label
digunakan, mungkin
membingungkan pembaca. Label //foo/bar/wiz
selalu merupakan singkatan
untuk //foo/bar/wiz:wiz
, meskipun tidak ada paket foo/bar/wiz
tersebut; label ini
tidak pernah merujuk ke //foo:bar/wiz
, meskipun target tersebut ada.
Namun, ada beberapa situasi di mana garis miring lebih nyaman digunakan, atau kadang-kadang bahkan diperlukan. Misalnya, nama aturan tertentu harus cocok dengan file sumber utamanya, yang mungkin berada di subdirektori paket.
Nama paket — //package-name:target-name
Nama paket adalah nama direktori yang berisi file BUILD
-nya,
yang relatif terhadap direktori level teratas repositori yang berisi.
Contoh: my/app
.
Nama paket harus sepenuhnya terdiri dari karakter yang diambil dari kumpulan
A
-Z
, a
–z
, 0
–9
, '/
', '-
', '.
', '@
', dan '_
', dan tidak boleh
dimulai dengan garis miring.
Untuk bahasa dengan struktur direktori yang signifikan bagi sistem modulnya (misalnya, Java), Anda harus memilih nama direktori yang merupakan ID yang valid dalam bahasa tersebut.
Meskipun Bazel mendukung target dalam paket root ruang kerja (misalnya,
//:foo
), sebaiknya kosongkan paket tersebut agar semua paket yang bermakna
memiliki nama deskriptif.
Nama paket tidak boleh berisi substring //
, atau diakhiri dengan garis miring.
Aturan
Aturan menentukan hubungan antara input dan output, serta langkah-langkah untuk mem-build output. Aturan dapat berupa salah satu dari banyak jenis (terkadang disebut class aturan), yang menghasilkan library dan file yang dapat dieksekusi yang dikompilasi, menguji file yang dapat dieksekusi, dan output lain yang didukung seperti yang dijelaskan dalam Ensiklopedia Build.
File BUILD
mendeklarasikan target dengan memanggil aturan.
Pada contoh di bawah, kita melihat deklarasi my_app
target
menggunakan aturan cc_binary
.
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
Setiap pemanggilan aturan memiliki atribut name
(yang harus berupa
nama target yang valid), yang mendeklarasikan target dalam paket
file BUILD
.
Setiap aturan memiliki kumpulan atribut; atribut yang berlaku untuk aturan tertentu, serta signifikansi dan semantik setiap atribut adalah fungsi dari jenis aturan; lihat Ensiklopedia Build untuk daftar aturan dan atribut yang sesuai. Setiap atribut memiliki nama dan suatu jenis data. Beberapa tipe umum yang dapat dimiliki atribut adalah integer, label, daftar label, string, daftar {i>string<i}, label {i>output<i}, daftar label {i>output<i}. Bukan semua atribut harus ditentukan dalam setiap aturan. Atribut sehingga membentuk dari {i>key<i} (nama) ke nilai-nilai opsional yang diketik.
Atribut srcs
yang ada di banyak aturan memiliki jenis "daftar label"; nilainya, jika ada, adalah daftar label, yang masing-masing merupakan nama target yang merupakan input untuk aturan ini.
Dalam beberapa kasus, nama jenis aturan agak arbitrer, dan yang lebih menarik adalah nama file yang dihasilkan oleh aturan, dan ini berlaku untuk genrules. Untuk informasi selengkapnya, lihat Aturan Umum: genrule.
Pada kasus lain, namanya signifikan: untuk aturan *_binary
dan *_test
,
misalnya, nama aturan menentukan nama {i>executable<i} yang dihasilkan oleh
dari build tersebut.
Directed acyclic graph ini di atas target disebut grafik target atau grafik dependensi build, dan merupakan domain tempat alat Kueri Bazel beroperasi.
Target | BANGUN file |