Halaman ini membahas cara menentukan aturan repositori dan memberikan contoh untuk detail selengkapnya.
Repositori eksternal adalah hierarki direktori,
yang berisi file sumber yang dapat digunakan dalam build Bazel, yang dihasilkan berdasarkan permintaan dengan
menjalankan aturan repo yang sesuai. Repos dapat ditentukan dengan berbagai
cara, tetapi pada akhirnya, setiap repo ditentukan dengan memanggil aturan repo, sama seperti
target build ditentukan dengan memanggil aturan build. Library ini dapat digunakan untuk bergantung pada
library pihak ketiga (seperti library yang dikemas Maven), tetapi juga untuk membuat
file BUILD
khusus untuk host tempat Bazel berjalan.
Definisi aturan repositori
Dalam file .bzl
, gunakan fungsi repository_rule untuk menentukan aturan repo baru dan menyimpannya dalam variabel global. Setelah aturan repo ditentukan,
aturan tersebut dapat dipanggil sebagai fungsi untuk menentukan repo. Pemanggilan ini biasanya
dilakukan dari dalam fungsi
implementasi ekstensi modul.
Dua komponen utama definisi aturan repo adalah skema atribut dan fungsi penerapannya. Skema atribut menentukan nama dan jenis atribut yang diteruskan ke pemanggilan aturan repo, dan fungsi implementasi dijalankan saat repo perlu diambil.
Atribut
Atribut adalah argumen yang diteruskan ke pemanggilan aturan repo. Skema
atribut yang diterima oleh aturan repo ditentukan menggunakan argumen attrs
saat
aturan repo ditentukan dengan panggilan ke repository_rule
. Contoh yang menentukan
atribut url
dan sha256
sebagai string:
http_archive = repository_rule(
implementation=_impl,
attrs={
"url": attr.string(mandatory=True),
"sha256": attr.string(mandatory=True),
}
)
Untuk mengakses atribut dalam fungsi implementasi, gunakan
repository_ctx.attr.<attribute_name>
:
def _impl(repository_ctx):
url = repository_ctx.attr.url
checksum = repository_ctx.attr.sha256
Semua repository_rule
memiliki atribut name
yang ditentukan secara implisit. Ini adalah
atribut string yang berperilaku agak ajaib: saat ditentukan sebagai input untuk
pemanggilan aturan repo, atribut ini menggunakan nama repo yang jelas; tetapi saat dibaca dari
fungsi implementasi aturan repo menggunakan repository_ctx.attr.name
, atribut ini akan menampilkan
nama repo kanonis.
Fungsi penerapan
Setiap aturan repo memerlukan fungsi implementation
. Bagian 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 dengan
parameter yang ditentukan, atau dict dengan kumpulan parameter untuk aturan tersebut yang
akan mengubah aturan tersebut menjadi aturan yang dapat direproduksi yang menghasilkan repo yang sama. Misalnya,
untuk aturan yang melacak repositori git, hal ini berarti menampilkan
ID commit tertentu, bukan cabang mengambang yang awalnya
ditentukan.
Parameter input repository_ctx
dapat digunakan untuk mengakses nilai atribut, dan fungsi non-hermetis (menemukan biner, mengeksekusi biner, membuat file di repositori, atau mendownload file dari Internet). Lihat dokumen
API untuk konteks selengkapnya. Contoh:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
Kapan fungsi penerapan dieksekusi?
Fungsi implementasi aturan repo dijalankan saat Bazel memerlukan target dari repositori tersebut, misalnya saat target lain (di repo lain) bergantung pada target tersebut atau jika disebutkan di command line. Fungsi implementasi kemudian diharapkan akan membuat repo dalam sistem file. Tindakan ini disebut "mengambil" repo.
Berbeda dengan target reguler, repo tidak perlu diambil ulang saat terjadi perubahan yang akan menyebabkan repo menjadi berbeda. Hal ini karena ada hal-hal yang tidak dapat dideteksi perubahannya oleh Bazel atau akan menyebabkan terlalu banyak overhead pada setiap build (misalnya, hal-hal yang diambil dari jaringan). Oleh karena itu, repo hanya diambil ulang jika salah satu hal berikut berubah:
- Atribut yang diteruskan ke pemanggilan aturan repo.
- Kode Starlark yang terdiri dari penerapan aturan repo.
- Nilai variabel lingkungan apa pun yang diteruskan ke metode
getenv()
repository_ctx
atau dideklarasikan dengan atributenviron
darirepository_rule
. Nilai variabel lingkungan ini dapat di-hardwire di command line dengan flag--repo_env
. - Keberadaan, konten, dan jenis jalur apa pun yang
watch
dalam fungsi penerapan aturan repo.- Metode
repository_ctx
tertentu lainnya dengan parameterwatch
, sepertiread()
,execute()
, danextract()
, juga dapat menyebabkan jalur dipantau. - Demikian pula,
repository_ctx.watch_tree
danpath.readdir
dapat menyebabkan jalur dilihat dengan cara lain.
- Metode
- Saat
bazel fetch --force
dieksekusi.
Ada dua parameter repository_rule
yang mengontrol kapan repositori
diambil ulang:
- Jika tanda
configure
ditetapkan, repositori akan diambil ulang dibazel fetch --force --configure
(repositori non-configure
tidak diambil ulang). - Jika tanda
local
ditetapkan, selain kasus di atas, repo juga diambil kembali saat server Bazel dimulai ulang.
Memaksa pengambilan ulang repo eksternal
Terkadang, repo eksternal dapat menjadi usang tanpa perubahan pada
definisi atau dependensinya. Misalnya, repo yang mengambil sumber mungkin mengikuti
cabang tertentu dari repositori pihak ketiga, dan commit baru tersedia di
cabang tersebut. Dalam hal ini, Anda dapat meminta bazel untuk mengambil ulang semua repo eksternal
tanpa syarat dengan memanggil bazel fetch --force --all
.
Selain itu, beberapa aturan repo memeriksa komputer lokal dan mungkin menjadi usang jika
komputer lokal diupgrade. Di sini, Anda dapat meminta Bazel untuk hanya mengambil ulang repositori
eksternal tersebut jika definisi repository_rule
memiliki atribut configure
yang ditetapkan, gunakan bazel fetch --force
--configure
.
Contoh
Toolchain C++ yang dikonfigurasi secara otomatis: menggunakan aturan repo untuk membuat file konfigurasi C++ secara otomatis 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 yang disebut
@maven
secara default yang menghasilkan target build untuk setiap artefak Maven dalam hierarki dependensi transitif.