Halaman ini membahas cara membuat aturan repositori dan memberikan contoh untuk detail lebih lanjut.
Repositori eksternal adalah aturan yang hanya dapat digunakan
dalam file WORKSPACE
dan memungkinkan operasi non-hermetik pada fase pemuatan
Bazel. Setiap aturan repositori eksternal membuat ruang kerjanya sendiri, dengan
file dan artefak BUILD
-nya sendiri. Library ini dapat digunakan untuk bergantung pada library
pihak ketiga (seperti library paket Maven), tetapi juga untuk menghasilkan file BUILD
khusus untuk host yang dijalankan Bazel.
Pembuatan aturan repositori
Dalam file .bzl
, gunakan fungsi repository_rule untuk membuat aturan repositori baru dan menyimpannya dalam variabel global.
Aturan repositori kustom dapat digunakan seperti aturan repositori native. Class ini
memiliki atribut name
wajib dan setiap target yang ada dalam file build-nya
dapat disebut sebagai @<name>//package:target
, jika <name>
adalah nilai
atribut name
.
Aturan ini dimuat saat Anda membangunnya secara eksplisit, atau jika merupakan dependensi
build. Dalam hal ini, Bazel akan menjalankan fungsi implementation
. Fungsi
ini menjelaskan cara membuat repositori, kontennya, dan file BUILD
.
Atribut
Atribut adalah argumen aturan, seperti url
atau sha256
. Anda harus mencantumkan
atribut dan jenisnya saat menentukan aturan repositori.
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
Untuk mengakses atribut, gunakan repository_ctx.attr.<attribute_name>
.
Semua repository_rule
memiliki atribut yang ditentukan secara implisit (seperti aturan build). Dua atribut implisit adalah name
(seperti untuk aturan build) dan
repo_mapping
. Nama aturan repositori dapat diakses dengan
repository_ctx.name
. Makna repo_mapping
sama seperti untuk
aturan repositori native
local_repository
dan
new_local_repository
.
Jika nama atribut diawali dengan _
, atribut tersebut bersifat pribadi dan pengguna tidak dapat menyetelnya.
Fungsi penerapan
Setiap aturan repositori memerlukan fungsi implementation
. Kode ini berisi
logika aturan yang sebenarnya dan dijalankan secara ketat dalam Fase Pemuatan.
Fungsi ini memiliki tepat satu parameter input, repository_ctx
. Fungsi ini
menampilkan None
untuk menunjukkan bahwa aturan dapat direproduksi berdasarkan
parameter yang ditentukan, atau dict dengan kumpulan parameter untuk aturan tersebut
yang akan mengubah aturan tersebut menjadi aturan yang dapat direproduksi yang menghasilkan repositori yang sama. Misalnya,
untuk aturan yang melacak repositori git yang berarti menampilkan
ID commit tertentu, bukan cabang mengambang yang awalnya
ditentukan.
Parameter input repository_ctx
dapat digunakan untuk
mengakses nilai atribut, dan fungsi non-hermetik (menemukan biner,
mengeksekusi biner, membuat file dalam repositori, atau mendownload file
dari Internet). Lihat library untuk mengetahui
konteks selengkapnya. Contoh:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
Kapan fungsi implementasi dieksekusi?
Jika repositori dideklarasikan sebagai local
, perubahan dalam dependensi
dalam grafik dependensi (termasuk file WORKSPACE
itu sendiri) akan
menyebabkan eksekusi fungsi penerapan.
Fungsi implementasi dapat dimulai ulang jika dependensi yang dimintanya tidak ada. Bagian awal fungsi implementasi akan dieksekusi kembali setelah dependensi diselesaikan. Untuk menghindari mulai ulang yang tidak perlu (yang mahal, karena akses jaringan mungkin harus diulang), argumen label akan diambil data sebelumnya, asalkan semua argumen label dapat di-resolve ke file yang sudah ada. Perhatikan bahwa me-resolve jalur dari string atau label yang hanya dibuat selama eksekusi fungsi masih dapat menyebabkan mulai ulang.
Terakhir, untuk repositori non-local
, hanya perubahan pada dependensi
berikut yang dapat menyebabkan mulai ulang:
.bzl
file diperlukan untuk menentukan aturan repositori.- Pernyataan aturan repositori dalam file
WORKSPACE
. - Nilai variabel lingkungan apa pun yang dideklarasikan dengan atribut
environ
dari fungsirepository_rule
. Nilai variabel lingkungan tersebut dapat diterapkan dari command line dengan flag--action_env
(tetapi flag ini akan membatalkan setiap tindakan build). - Konten file yang digunakan dan dirujuk oleh label (misalnya,
//mypkg:label.txt
bukanmypkg/label.txt
).
Memaksa pengambilan kembali repositori eksternal
Terkadang, repositori eksternal bisa menjadi usang tanpa perubahan
pada definisi atau dependensinya. Misalnya, sumber pengambilan repositori mungkin
mengikuti cabang tertentu dari repositori pihak ketiga, dan commit baru
tersedia di cabang tersebut. Dalam hal ini, Anda dapat meminta bazel untuk mengambil kembali semua
repositori eksternal tanpa syarat dengan memanggil bazel sync
.
Selain itu, beberapa aturan memeriksa komputer lokal dan
mungkin ketinggalan zaman jika komputer lokal diupgrade. Di sini Anda dapat meminta bazel untuk
hanya mengambil kembali repositori eksternal tersebut yang
definisi repository_rule
memiliki atribut configure
yang disetel, gunakan bazel sync --configure
.
Contoh
Toolchain C++ yang dikonfigurasi secara otomatis: menggunakan aturan repositori untuk otomatis membuat file konfigurasi C++ untuk Bazel dengan mencari compiler C++ lokal, lingkungan, dan flag yang didukung compiler C++.
Repositori Go menggunakan beberapa
repository_rule
untuk menentukan daftar dependensi yang diperlukan untuk menggunakan aturan Go.rules_jvm_external membuat repositori eksternal bernama
@maven
secara default yang menghasilkan target build untuk setiap artefak Maven dalam hierarki dependensi transitif.