Label

Semua target hanya dimiliki oleh satu paket. Nama target disebut label. Setiap label mengidentifikasi target secara unik. Label standar dalam bentuk kanonis terlihat seperti ini:

@myrepo//my/app/main:app_binary

Bagian pertama label adalah nama repositori, @myrepo//. Pada kasus umum label merujuk ke repositori yang sama dengan yang digunakan ID tersebut, disingkat ID dapat disingkat //. Jadi, dalam @myrepo label ini biasanya ditulis sebagai

//my/app/main:app_binary

Bagian kedua label adalah nama paket my/app/main yang tidak memenuhi syarat, jalur ke paket yang terkait dengan root repositori. Bersama-sama, nama repositori dan nama paket yang tidak memenuhi syarat membentuk nama paket @myrepo//my/app/main yang sepenuhnya memenuhi syarat . Jika label mengacu pada paket yang sama dengan yang digunakannya, nama paket (dan secara opsional, titik dua) dapat dihilangkan. Jadi, di dalam @myrepo//my/app/main, label ini dapat ditulis dengan salah satu cara berikut:

app_binary
:app_binary

Konvensi adalah titik dua dihilangkan untuk file, tetapi dipertahankan untuk aturan, tetapi tidak signifikan.

Bagian dari label setelah titik dua, app_binary adalah nama target yang tidak memenuhi syarat. Jika cocok dengan komponen terakhir dari jalur paket, titik 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 relatif terhadap root paket (direktori yang berisi file BUILD). Jadi, file ini ada di subdirektori my/app/main/testdata repositori:

//my/app/main:testdata/input.txt

Jangan keliru membedakan label seperti //my/app dengan nama paket. Label selalu dimulai dengan ID repositori (sering disingkat //), tetapi nama paket tidak pernah dilakukan. Dengan demikian, my/app adalah paket yang berisi //my/app/lib (yang juga dapat ditulis sebagai //my/app/lib:lib).

Kesalahpahaman yang umum adalah //my/app merujuk ke sebuah paket, atau semua target dalam satu paket; keduanya tidak benar. Ingat, fungsi ini setara dengan //my/app:app, sehingga memberi nama target app dalam paket my/app repositori saat ini).

Label relatif tidak dapat digunakan untuk merujuk ke target dalam paket lain; 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 file BUILD sendiri), paket terakhir berisi file bernama testdepot.zip. Berikut adalah dua cara (salah satu, satu benar) untuk merujuk ke file ini dalam //my/app:BUILD:

Salahtestdata adalah paket lain, 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 repositori utama, yang akan tetap berfungsi meskipun 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, sementara 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 informasi tentang berbagai cara merujuk ke target, lihat pola target.

Spesifikasi leksikal label

Sintaksis label tidak menyarankan penggunaan karakter meta yang memiliki makna khusus pada shell. Hal ini membantu menghindari masalah kutipan yang tidak disengaja, dan mempermudah pembuatan alat dan skrip yang memanipulasi label, seperti Bahasa Kueri Bazel.

Detail selengkapnya tentang 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 dalam file BUILD; nama file adalah nama jalurnya yang relatif terhadap direktori yang berisi file BUILD.

Nama target harus seluruhnya terdiri dari karakter yang digambar dari kumpulan az, AZ, 09, dan simbol tanda baca !%-@^_"#$&'()*-+,;<=>?[]{|}~/..

Nama file harus merupakan nama jalur relatif dalam bentuk normal, yang berarti nama tersebut tidak boleh diawali 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 umumnya / digunakan atas nama target file, tetapi hindari penggunaan / dalam nama aturan. Apalagi saat format label singkat digunakan, dapat membingungkan pembaca. Label //foo/bar/wiz selalu merupakan penyingkatan untuk //foo/bar/wiz:wiz, meskipun paket tersebut tidak ada foo/bar/wiz; tidak pernah mengacu pada //foo:bar/wiz, meskipun target tersebut ada.

Namun, ada beberapa situasi ketika penggunaan garis miring terasa nyaman, atau bahkan terkadang diperlukan. Misalnya, nama aturan tertentu harus sesuai 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, relatif terhadap direktori level teratas repositori penampungnya. Contoh: my/app.

Nama paket harus seluruhnya terdiri dari karakter yang digambar dari kumpulan A-Z, az, 09, '/', '-', '.', '@', dan '_', dan tidak boleh dimulai dengan garis miring

Untuk bahasa dengan struktur direktori yang signifikan bagi sistem modulnya (misalnya Java), penting untuk memilih nama direktori yang merupakan ID valid dalam bahasa tersebut.

Meskipun Bazel mendukung target di 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, dan langkah-langkah untuk mem-build output. Aturan dapat berupa salah satu dari banyak jenis yang berbeda (terkadang disebut class aturan), yang menghasilkan file executable dan library yang dikompilasi, pengujian yang dapat dieksekusi, dan output lain yang didukung 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 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 jenis. Beberapa jenis umum dari atribut yang dapat dimiliki adalah bilangan bulat, label, daftar label, string, daftar string, label output, daftar label output. Tidak semua atribut harus ditentukan di setiap aturan. Dengan demikian, atribut membentuk kamus dari kunci (nama) ke nilai opsional yang diketik.

Atribut srcs yang ada dalam banyak aturan memiliki jenis "daftar label"; nilainya, jika ada, adalah daftar label, yang masing-masing adalah nama target yang merupakan input untuk aturan ini.

Dalam beberapa kasus, nama jenis aturan agak sewenang-wenang, dan yang lebih menarik adalah nama file yang dihasilkan oleh aturan, dan hal ini berlaku pada genrules. Untuk 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 disebut grafik target atau grafik dependensi build, dan merupakan domain tempat alat Kueri Bazel beroperasi.

Target BUILD file