Semua target termasuk dalam satu paket. Nama target disebut label. Setiap label secara unik mengidentifikasi target. Label standar dalam bentuk kanonis terlihat seperti ini:
@myrepo//my/app/main:app_binary
Bagian pertama label adalah nama repositori, @myrepo//
.
Dalam kasus umum, ketika label merujuk pada repositori yang sama dengan tempat
digunakan, ID repositori dapat disingkat menjadi //
.
Jadi, di dalam @myrepo
, label ini biasanya ditulis sebagai
//my/app/main:app_binary
Bagian kedua label adalah nama paket yang tidak memenuhi syarat
my/app/main
, jalur ke paket
yang relatif terhadap root repositori. Bersama-sama, nama repositori dan
nama paket yang tidak memenuhi syarat akan membentuk nama paket yang sepenuhnya memenuhi syarat
@myrepo//my/app/main
. Jika label merujuk ke paket yang sama dengan
penggunaannya, 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
Sesuai dengan konvensi bahwa titik dua dihilangkan untuk file, tetapi dipertahankan untuk aturan, tetapi tidak signifikan.
Bagian label setelah tanda titik dua, app_binary
adalah nama target
yang tidak memenuhi syarat. Jika cocok dengan komponen terakhir dari jalur paket, atribut tersebut, 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
yang relatif terhadap root paket (direktori yang berisi file BUILD
). Jadi,
file ini berada 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 yang digunakan: saat Bazel mengharapkan label, maksudnya masing-masing
//my/app:app
dan @some_repo//my/app:app
. Namun, saat Bazel
mengharapkan paket (misalnya dalam spesifikasi package_group
), Bazel akan mereferensikan
paket yang berisi label tersebut.
Kesalahan umum dalam file BUILD
adalah menggunakan //my/app
untuk merujuk ke sebuah paket, atau
ke semua target dalam sebuah paket--bukanlah demikian. Ingat, fungsi ini
setara dengan //my/app:app
sehingga menamai target app
dalam paket my/app
dari repositori saat ini.
Namun, penggunaan //my/app
untuk merujuk ke paket dianjurkan dalam
spesifikasi package_group
atau dalam file .bzl
, karena dengan jelas
mengkomunikasikan bahwa nama paket bersifat absolut dan di-root pada direktori
level atas ruang kerja.
Label relatif tidak dapat digunakan untuk merujuk ke target di 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
(masing-masing dari kedua direktori ini memiliki file
BUILD
sendiri), paket terakhir berisi file bernama testdepot.zip
. Berikut
adalah 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
beserta jalur lengkapnya
//my/app/testdata:testdepot.zip
Label yang dimulai dengan @//
adalah referensi ke repositori
utama, yang masih akan berfungsi bahkan dari repositori eksternal.
Oleh karena itu, @//a/b/c
berbeda dengan
//a/b/c
saat dirujuk 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 merujuk pada target, lihat pola target.
Spesifikasi leksik label
Sintaksis label mencegah penggunaan karakter meta yang memiliki arti khusus bagi shell. Hal ini membantu menghindari masalah kutipan yang tidak disengaja, dan mempermudah pembuatan alat serta skrip yang memanipulasi label, seperti Bahasa Kueri Bazel.
Detail persis nama target yang diizinkan ada 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 file BUILD
; nama file adalah nama jalurnya dibandingkan dengan direktori yang berisi file BUILD
.
Nama target harus seluruhnya terdiri dari karakter yang diambil 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 tidak boleh diawali atau diakhiri dengan garis miring (misalnya, /foo
dan foo/
dilarang) dan tidak boleh 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 file dalam paket lain
Benar — Gunakan `//package-name:filename`
Meskipun menggunakan /
dalam nama target file adalah hal yang umum, hindari penggunaan
/
dalam nama aturan. Apalagi, saat digunakan bentuk singkatan
label, dapat membingungkan pembaca. Label //foo/bar/wiz
selalu merupakan singkatan
untuk //foo/bar/wiz:wiz
, meskipun tidak ada paket foo/bar/wiz
seperti itu; label
tidak pernah merujuk pada //foo:bar/wiz
, meskipun target itu ada.
Namun, ada beberapa situasi yang memungkinkan penggunaan garis miring, atau bahkan terkadang 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
,
sesuai dengan direktori level teratas dari repositori yang memuatnya.
Contoh: my/app
.
Nama paket harus seluruhnya terdiri dari karakter yang diambil dari kumpulan
A
-Z
, a
–z
, 0
–9
, '/
', '-
', '.
', '@
', dan '_
', dan tidak boleh
diawali dengan garis miring.
Untuk bahasa dengan struktur direktori yang signifikan bagi sistem modulnya (misalnya Java), pilih nama direktori yang merupakan ID yang valid dalam bahasa tersebut.
Meskipun Bazel mendukung target dalam paket root ruang kerja (misalnya,
//:foo
), sebaiknya biarkan paket tersebut kosong 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 membuat output. Aturan dapat berupa salah satu dari banyak jenis yang berbeda (terkadang disebut class aturan), yang menghasilkan file dan library terkompilasi yang dapat dieksekusi, pengujian yang dapat dieksekusi, dan output yang didukung lainnya seperti 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 sekumpulan atribut; atribut yang berlaku untuk aturan tertentu, serta signifikansi dan semantik setiap atribut merupakan fungsi dari jenis aturan tersebut. Baca Build Encyclopedia untuk mengetahui daftar aturan dan atributnya yang sesuai. Setiap atribut memiliki nama dan tipe. Beberapa jenis umum yang dapat dimiliki atribut adalah bilangan bulat, label, daftar label, string, daftar string, label output, daftar label output. Tidak semua atribut perlu ditentukan di setiap aturan. Dengan demikian, atribut membentuk kamus dari kunci (nama) hingga nilai opsional yang diketik.
Atribut srcs
yang ada di banyak aturan memiliki jenis "daftar label"; nilainya, jika ada, berupa daftar label, masing-masing menjadi 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 benar pada genrules. Untuk mengetahui informasi selengkapnya, lihat Aturan Umum: genrule.
Dalam kasus lain, namanya signifikan: untuk aturan *_binary
dan *_test
,
misalnya, nama aturan menentukan nama file yang dapat dieksekusi yang dihasilkan oleh
build.
Grafik asiklik terarah di atas target ini disebut grafik target atau grafik dependensi build, dan merupakan domain tempat alat Kueri Bazel beroperasi.
Target | MEMBANGUN file |