Label

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Semua target 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 bahwa label mengacu pada repositori yang sama dengan tempat label 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 ke root repositori. Secara bersamaan, 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 digunakan di dalamnya, 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

Sesuai aturan, biasanya titik dua dihilangkan untuk file, tetapi dipertahankan untuk aturan, tetapi tidak signifikan untuk file.

Bagian dari label setelah titik dua, app_binary adalah nama target yang tidak memenuhi syarat. Jika cocok dengan komponen terakhir dari jalur paket, jalur 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 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 penggunaannya: saat Bazel mengharapkan label, masing-masing berarti //my/app:app dan @some_repo//my/app:app. Namun, saat Bazel mengharapkan paket (misalnya dalam spesifikasi package_group), mereka 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 --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 file package_group atau .bzl, karena secara jelas menyampaikan 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 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 akan berisi file bernama testdepot.zip. Berikut dua cara (salah satu, 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 akan tetap berfungsi meskipun dari repositori eksternal. Oleh karena itu, @//a/b/c berbeda dengan //a/b/c jika direferensikan dari repositori eksternal. Class yang pertama merujuk kembali ke repositori utama, sedangkan yang lain mencari //a/b/c di repositori eksternal itu sendiri. Hal ini sangat relevan saat menulis aturan dalam 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 terhadap shell. Hal ini membantu menghindari masalah kutipan yang tidak disengaja, dan memudahkan pembuatan alat serta skrip yang memanipulasi label, seperti Bahasa Kueri Bazel.

Detail selengkapnya tentang 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 dalam file BUILD; nama file adalah jalurnya 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 berupa nama jalur relatif dalam bentuk normal yang berarti keduanya 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 penggunaan / atas nama target file adalah hal yang umum, hindari penggunaan / dalam nama aturan. Apalagi saat digunakan dalam format singkatan, label mungkin akan membingungkan pembaca. Label //foo/bar/wiz selalu merupakan singkatan untuk //foo/bar/wiz:wiz, meskipun tidak ada paket foo/bar/wiz seperti itu; label tersebut tidak pernah merujuk ke //foo:bar/wiz, meskipun target tersebut ada.

Namun, ada beberapa situasi saat penggunaan garis miring terasa nyaman, atau terkadang 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 miliknya, yang relatif terhadap direktori tingkat atas repositori yang memuatnya. Misalnya: my/app.

Nama paket harus seluruhnya terdiri dari karakter yang digambar dari kumpulan A-Z, az, 09, '/', '-', '.', '@', dan '_', serta 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 yang valid dalam bahasa tersebut.

Meskipun Bazel mendukung target dalam paket root ruang kerja (misalnya, //:foo), sebaiknya kosongkan paket tersebut sehingga 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 jenisnya (terkadang disebut class aturan), yang menghasilkan file executable dan library yang dikompilasi, menguji file 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 serangkaian atribut; atribut yang berlaku untuk aturan tertentu, serta signifikansi dan semantik setiap atribut adalah fungsi dari jenis aturan tersebut; lihat Build Encyclopedia 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 perlu ditentukan di setiap aturan. Oleh karena itu, atribut membentuk kamus dari kunci (nama) menjadi nilai opsional yang diketik.

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

Dalam beberapa kasus, nama jenis aturan agak acak, dan nama yang lebih menarik adalah nama file yang dihasilkan oleh aturan, dan hal ini benar untuk genrules. Untuk mengetahui informasi selengkapnya, baca Aturan Umum: genrule.

Dalam kasus lain, nama tersebut signifikan: untuk aturan *_binary dan *_test, misalnya, nama aturan menentukan nama file yang dapat dieksekusi yang dihasilkan oleh build.

Grafik asiklik terarah atas target ini disebut grafik target atau grafik dependensi build, dan merupakan domain tempat alat Kueri Bazel beroperasi.

Target BANGUN file