Label

Laporkan masalah Lihat sumber {/18/}{/1/}

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

@myrepo//my/app/main:app_binary

Bagian pertama label adalah nama repositori, @myrepo//. Pada umumnya, label mengacu ke repositori yang sama tempatnya 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, yaitu jalur ke paket yang terkait dengan root repositori. Bersama-sama, nama repositori dan nama paket yang tidak memenuhi syarat membentuk nama paket yang sepenuhnya memenuhi syarat @myrepo//my/app/main. Jika label mengacu ke paket yang sama dengan yang digunakan, nama paket (dan jika perlu, titik dua) dapat dihilangkan. Jadi, di dalam @myrepo//my/app/main, label ini dapat ditulis dengan salah satu cara berikut:

app_binary
:app_binary

Sudah menjadi kebiasaan umum bahwa titik dua dihilangkan untuk file, tetapi dipertahankan untuk aturan, tetapi tidak signifikan.

Bagian label setelah 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 terkait dengan root paket (direktori yang berisi file BUILD). Jadi, file ini berada dalam 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 penggunaannya: jika Bazel mengharapkan label, arti tersebut berarti //my/app:app dan @some_repo//my/app:app. Namun, jika 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. Namun, tidak demikian. Ingat, kode ini setara dengan //my/app:app, sehingga nama ini menamai target app dalam paket my/app repositori saat ini.

Namun, penggunaan //my/app untuk merujuk ke paket disarankan dalam spesifikasi package_group atau dalam file .bzl, karena dengan jelas mengomunikasikan bahwa nama paket bersifat absolut dan di-root di direktori tingkat atas 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 (masing-masing dari dua direktori ini memiliki file BUILD sendiri), paket yang terakhir berisi file bernama testdepot.zip. Berikut dua cara (satu salah, satu benar) untuk merujuk ke file ini dalam //my/app:BUILD:

Salahtestdata 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 repositori utama, yang masih akan berfungsi bahkan dari repositori eksternal. Oleh karena itu, @//a/b/c berbeda dengan //a/b/c jika direferensikan dari repositori eksternal. Yang pertama merujuk kembali ke repositori utama, sedangkan repositori yang kedua mencari //a/b/c di repositori eksternal itu sendiri. Hal ini sangat relevan saat menulis aturan di repositori utama yang merujuk pada target di repositori utama, dan akan digunakan dari repositori eksternal.

Untuk mengetahui informasi tentang berbagai cara merujuk target, lihat pola target.

Spesifikasi leksik label

Sintaksis label tidak menyarankan penggunaan karakter meta yang memiliki arti khusus bagi shell. Hal ini membantu menghindari masalah kutipan yang tidak disengaja, dan mempermudah pembuatan 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 file BUILD; nama file adalah nama jalurnya yang terkait dengan direktori yang berisi file BUILD.

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

Nama file harus berupa nama jalur relatif dalam bentuk normal, yang berarti nama file 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 naik level (..) dan referensi direktori saat ini (./) juga dilarang.

Salah — Jangan gunakan `..` untuk merujuk ke file dalam paket lain

Benar — Gunakan `//package-name:filename`

Meskipun umum menggunakan / dalam nama target file, hindari penggunaan / dalam nama aturan. Apalagi jika bentuk singkatan dari label digunakan, hal ini dapat membingungkan pembaca. Label //foo/bar/wiz selalu merupakan singkatan untuk //foo/bar/wiz:wiz, meskipun tidak ada paket foo/bar/wiz; label tidak pernah merujuk ke //foo:bar/wiz, meskipun target tersebut ada.

Namun, ada beberapa situasi ketika penggunaan garis miring itu praktis, atau terkadang bahkan diperlukan. Misalnya, nama aturan tertentu harus cocok dengan file sumber utamanya, yang mungkin berada dalam subdirektori paket.

Nama paket — //package-name:target-name

Nama paket adalah nama direktori yang berisi file BUILD, sesuai dengan direktori tingkat atas dari repositori yang memuatnya. Contoh: my/app.

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

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

Meskipun Bazel mendukung target di 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, dan langkah-langkah untuk membuat output. Aturan dapat berupa salah satu dari banyak jenis berbeda (terkadang disebut class aturan), yang menghasilkan eksekusi dan library yang dikompilasi, file yang dapat dieksekusi pengujian, dan output yang didukung lainnya seperti yang dijelaskan dalam Build Encyclopedia.

File BUILD mendeklarasikan target dengan memanggil aturan.

Pada contoh di bawah, kita melihat deklarasi target my_app 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 dari setiap atribut adalah fungsi jenis aturan; lihat Membuat Ensiklopedia untuk mengetahui daftar aturan dan atributnya yang sesuai. Setiap atribut memiliki nama dan jenis. Beberapa jenis umum yang dapat dimiliki atribut adalah bilangan bulat, label, daftar label, string, daftar string, label output, daftar label output. Tidak semua atribut harus ditentukan dalam setiap aturan. Dengan demikian, atribut membentuk kamus dari kunci (nama) ke nilai opsional yang diketik.

Atribut srcs yang ada di banyak aturan memiliki jenis "daftar label"; nilainya, jika ada, adalah daftar label, masing-masing adalah 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 tentang genrules. Untuk mengetahui informasi selengkapnya, lihat Aturan Umum: genrule.

Pada 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 pada target ini disebut grafik target atau grafik dependensi build, dan merupakan domain tempat alat Kueri Bazel beroperasi.

Target BANGUN file