Halaman ini membahas cara membuat aturan repositori dan memberikan contoh untuk mengetahui detail selengkapnya.
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. File 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.
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 bawaan. Memiliki atribut name
wajib dan setiap target yang ada dalam file build-nya dapat dirujuk sebagai @<name>//package:target
dengan <name>
adalah nilai atribut name
.
Aturan dimuat saat Anda membangunnya secara eksplisit, atau jika merupakan dependensi build. Dalam hal ini, Bazel akan menjalankan fungsi implementation
-nya. Fungsi ini menjelaskan cara membuat repositori, kontennya, dan file BUILD
.
Atribut
Atribut adalah argumen aturan yang diteruskan sebagai dict ke argumen aturan attrs
.
Atribut dan jenisnya ditentukan dan dicantumkan saat Anda menentukan aturan
repositori. Contoh yang menentukan atribut url
dan sha256
sebagai string:
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={
"url": attr.string(mandatory=True)
"sha256": attr.string(mandatory=True)
}
)
Untuk mengakses atribut dalam fungsi penerapan, 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 yang ditentukan secara implisit (seperti aturan
build). Dua atribut implisit adalah name
(sama seperti untuk aturan pembuatan) dan
repo_mapping
. Nama aturan repositori dapat diakses dengan
repository_ctx.name
. Arti repo_mapping
sama dengan arti 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
. Bagian ini berisi
logika sebenarnya dari aturan dan dijalankan secara ketat dalam Fase Pemuatan.
Fungsi ini memiliki tepat satu parameter input, repository_ctx
. Fungsi
menampilkan None
untuk menandakan bahwa aturan dapat direproduksi dengan
parameter yang ditentukan, atau dict dengan serangkaian 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, hal itu 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 di 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 penerapan dieksekusi?
Fungsi penerapan repositori dieksekusi saat Bazel memerlukan target dari repositori tersebut, misalnya saat target lain (di repositori lain) bergantung padanya atau jika disebutkan di command line. Fungsi implementasi kemudian diharapkan membuat repositori dalam sistem file. Tindakan ini disebut "mengambil" repositori.
Berbeda dengan target reguler, repositori tidak perlu diambil ulang saat sesuatu berubah yang akan menyebabkan repositori menjadi berbeda. Hal ini karena ada hal-hal yang perubahannya tidak dapat dideteksi oleh Bazel atau akan menyebabkan terlalu banyak overhead pada setiap build (misalnya, hal-hal yang diambil dari jaringan). Oleh karena itu, repositori hanya diambil ulang jika salah satu hal berikut berubah:
- Parameter yang diteruskan ke deklarasi repositori dalam
file
WORKSPACE
. - Kode Starlark yang terdiri dari penerapan repositori.
- Nilai variabel lingkungan apa pun yang dideklarasikan dengan atribut
environ
darirepository_rule
. Nilai variabel lingkungan ini dapat di-hardcode di command line dengan tanda--action_env
(tetapi tanda ini akan membatalkan setiap tindakan build). - Konten file apa pun yang diteruskan ke
read()
,execute()
, dan metoderepository_ctx
serupa yang dirujuk oleh label (misalnya,//mypkg:label.txt
, tetapi bukanmypkg/label.txt
) - Saat
bazel sync
dieksekusi.
Ada dua parameter repository_rule
yang mengontrol kapan repositori diambil ulang:
- Jika tanda
configure
disetel, repositori hanya diambil ulang dibazel sync
saat parameter--configure
diteruskan ke repositori tersebut (jika atribut tidak disetel, perintah ini tidak akan menyebabkan pengambilan ulang) Jika tanda
local
disetel, selain kasus di atas, repositori juga akan diambil ulang saat server Bazel dimulai ulang atau saat file apa pun yang memengaruhi deklarasi repositori berubah (misalnya, fileWORKSPACE
atau file yang dimuatnya), terlepas dari apakah perubahan tersebut mengakibatkan perubahan pada deklarasi repositori atau kodenya.Repositori non-lokal tidak diambil ulang dalam kasus ini. Hal ini karena repositori ini diasumsikan berkomunikasi dengan jaringan atau mahal.
Memulai ulang fungsi penerapan
Fungsi penerapan dapat dimulai ulang saat repositori sedang diambil jika dependensi yang dimintanya tidak ada. Dalam hal ini, eksekusi fungsi penerapan akan berhenti, dependensi yang hilang akan diselesaikan, dan fungsi akan dieksekusi ulang setelah dependensi diselesaikan. Untuk menghindari mulai ulang yang tidak perlu (yang mahal, karena akses jaringan mungkin harus diulang), argumen label akan di-prefetch, asalkan semua argumen label dapat diselesaikan ke file yang ada. Perhatikan bahwa menyelesaikan jalur dari string atau label yang dibuat hanya selama eksekusi fungsi masih dapat menyebabkan mulai ulang.
Memaksa pengambilan ulang repositori eksternal
Terkadang, repositori eksternal dapat menjadi tidak berlaku tanpa ada perubahan pada definisi atau dependensinya. Misalnya, repositori 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 repositori eksternal tanpa syarat dengan memanggil bazel sync
.
Selain itu, beberapa aturan memeriksa komputer lokal dan mungkin menjadi tidak berlaku jika komputer lokal diupgrade. Di sini Anda dapat meminta bazel untuk
hanya mengambil ulang repositori eksternal yang
definisi repository_rule
-nya memiliki set atribut configure
, menggunakan bazel sync --configure
.
Contoh
Toolchain yang dikonfigurasi otomatis C++: menggunakan aturan repositori 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 bernama
@maven
secara default yang menghasilkan target build untuk setiap artefak Maven dalam hierarki dependensi transitif.