Label adalah ID untuk target. Label standar dalam kanonis lengkapnya tampilan formulirnya seperti ini:
@@myrepo//my/app/main:app_binary
Bagian pertama label adalah nama repositori, @@myrepo
. @
ganda
menandakan bahwa ini adalah repositori kanonik
name, 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++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 yang umum terjadi, label mengacu
pada repositori yang sama dengan
digunakan, bagian nama repo mungkin dihilangkan. Jadi, di dalam @@myrepo
,
Label 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 dari 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 tanda titik dua, app_binary
adalah target yang tidak memenuhi syarat
nama. 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
dalam konteks penggunaannya: ketika Bazel mengharapkan label, maksudnya
//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 satu paket, tetapi tidak demikian. Perlu diingat,
setara dengan //my/app:app
, sehingga nama target app
di my/app
dari repositori saat ini.
Namun, penggunaan //my/app
untuk merujuk ke paket disarankan di
spesifikasi package_group
atau dalam file .bzl
, karena terlihat jelas
mengkomunikasikan bahwa nama paket bersifat absolut dan berakar di level teratas
ruang kerja.
Label relatif tidak dapat digunakan untuk merujuk ke target dalam paket lain; tindakan
ID repositori dan nama paket harus selalu ditentukan dalam kasus ini.
Misalnya, jika hierarki sumber berisi paket my/app
dan
paket my/app/testdata
(masing-masing dari dua direktori ini memiliki
BUILD
), paket yang terakhir berisi file bernama testdepot.zip
. Di sini,
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 dimulai dengan @@//
adalah referensi ke elemen utama
repositori yang masih akan berfungsi
bahkan dari repositori eksternal.
Oleh karena itu @@//a/b/c
berbeda dengan
//a/b/c
saat direferensikan dari repositori eksternal.
Yang pertama mengacu kembali ke repositori utama, sementara yang kedua merujuk
mencari //a/b/c
di repositori eksternal itu sendiri.
Hal ini terutama relevan saat menulis aturan di bagian
repositori yang merujuk ke target di repositori utama, dan akan
yang digunakan dari repositori eksternal.
Untuk informasi tentang berbagai cara merujuk ke target, lihat pola target Anda.
Spesifikasi leksik label
Sintaksis label tidak menyarankan penggunaan karakter meta yang memiliki arti khusus {i>shell<i}. Ini membantu menghindari kutipan masalah yang tidak disengaja, dan memudahkan membangun alat dan skrip yang memanipulasi label, seperti Bahasa Kueri Bazel.
Detail tepat nama target yang diizinkan tercantum di bawah ini.
Nama target — package-name:target-name
target-name
adalah nama target dalam paket. Nama aturan
adalah nilai atribut name
dalam deklarasi aturan di BUILD
file; nama file adalah nama 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 tersebut harus
tidak diawali atau diakhiri dengan garis miring (misalnya, /foo
dan foo/
adalah
dilarang) atau memuat 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
seperti itu; 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 file sumber utamanya, yang mungkin berada di subdirektori paket itu.
Nama paket — //package-name:target-name
Nama paket adalah nama direktori yang berisi file BUILD
,
relatif terhadap direktori tingkat atas
dari repositori yang memuatnya.
Contoh: my/app
.
Dalam tingkat teknis, Bazel memberlakukan hal berikut:
- Karakter yang diizinkan dalam nama paket adalah huruf kecil
a
hinggaz
, huruf besarA
sampaiZ
, angka0
sampai9
, karakter! \"#$%&'()*+,-.;<=>?@[]^_`{|}
(ya, ada karakter spasi di sana!), dan tentu saja garis miring/
(karena ini adalah direktori pemisah). - Nama paket tidak boleh diawali atau diakhiri dengan karakter garis miring
/
. - Nama paket tidak boleh berisi substring
//
. Ini tidak akan membuat masuk akal---apa jalur direktori yang sesuai? - Nama paket tidak boleh berisi substring
/./
,/../
, atau/.../
, dll. Penegakan ini dilakukan untuk menghindari kebingungan saat menerjemahkan antara logika nama paket dan nama direktori fisik, berdasarkan arti semantik dari karakter titik di {i>string<i} jalur.
Pada tingkat praktis:
- Untuk bahasa dengan struktur direktori yang signifikan bagi modulnya (misalnya, Java), penting untuk memilih nama direktori yang pengenal yang valid dalam bahasa tersebut. Misalnya, jangan memulai dengan angka dan menghindari karakter khusus, terutama garis bawah dan tanda hubung.
- Meskipun Bazel mendukung target dalam paket root ruang kerja (misalnya,
//:foo
), sebaiknya biarkan paket tersebut kosong agar semua paket yang bermakna memiliki nama deskriptif.
Aturan
Aturan menentukan hubungan antara input dan output, dan langkah-langkah untuk membuat {i>output<i}. Aturan bisa berupa salah satu dari banyak jenis (terkadang disebut class aturan), yang menghasilkan file yang dapat dieksekusi dan library, menguji file yang dapat dieksekusi, dan library output seperti yang dijelaskan dalam Build Encyclopedia.
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 nilai yang valid
nama target), yang mendeklarasikan target dalam paket
dari file BUILD
.
Setiap aturan memiliki serangkaian atribut; atribut yang berlaku untuk aturan, dan signifikansi serta semantik dari setiap atribut adalah fungsi dari jenis aturan; lihat Membuat Ensiklopedia untuk daftar aturan dan atributnya 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"; ini
adalah daftar label, jika ada,
setiap label adalah nama target yang
input untuk aturan ini.
Dalam beberapa kasus, nama jenis aturan sedikit sewenang-wenang, dan lebih menarik adalah nama file yang dihasilkan oleh aturan tersebut, dan ini benar 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.
Grafik asiklik terarah pada target ini disebut grafik target atau grafik dependensi build, dan merupakan domain tempat Alat Kueri Bazel beroperasi.
Target | BANGUN file |