BazelCon 2022 akan hadir pada 16-17 November ke New York dan online.
Daftar sekarang.

Aturan Repositori

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

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 kerja sendiri, dengan file dan artefak BUILD-nya sendiri. Library ini dapat digunakan untuk bergantung pada library pihak ketiga (seperti library paket Maven) tetapi juga dapat 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 secara eksplisit mem-build-nya, atau jika dependensi tersebut adalah 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, seperti url atau sha256. Anda harus mencantumkan atribut dan jenisnya saat Anda 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 implisitnya adalah name (sama seperti aturan build) dan repo_mapping. Nama aturan repositori dapat diakses dengan repository_ctx.name. Arti repo_mapping sama dengan aturan repositori native local_repository dan new_local_repository.

Jika nama atribut diawali dengan _, nama atribut akan bersifat pribadi dan pengguna tidak dapat menyetelnya.

Fungsi implementasi

Setiap aturan repositori memerlukan fungsi implementation. Project ini berisi logika sebenarnya dari aturan tersebut dan dieksekusi secara ketat dalam Phase Loading.

Fungsi ini memiliki tepat satu parameter input, repository_ctx. Fungsi tersebut menampilkan None untuk menandakan bahwa aturan dapat direproduksi dengan mempertimbangkan parameter yang ditentukan, atau dict dengan kumpulan parameter untuk aturan tersebut yang akan mengubah aturan tersebut menjadi parameter 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 ditetapkan.

Parameter input repository_ctx dapat digunakan untuk mengakses nilai atribut, dan fungsi non-hermetik (menemukan biner, menjalankan biner, membuat file dalam repositori, atau mendownload file dari Internet). Lihat library untuk 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 maka perubahan dependensi dalam grafik dependensi (termasuk file WORKSPACE itu sendiri) akan menyebabkan eksekusi fungsi implementasi.

Fungsi penerapan dapat dimulai ulang jika dependensi yang diminta tidak ada. 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 di-prefetch, asalkan semua argumen label dapat diselesaikan ke file yang ada. Perhatikan bahwa penyelesaian jalur dari string atau label yang hanya dibuat selama eksekusi fungsi masih dapat menyebabkan mulai ulang.

Terakhir, untuk repositori non-local, hanya perubahan dalam dependensi berikut yang dapat menyebabkan mulai ulang:

  • File .bzl diperlukan untuk menentukan aturan repositori.
  • Deklarasi aturan repositori dalam file WORKSPACE.
  • Nilai variabel lingkungan yang dideklarasikan dengan atribut environ dari fungsi repository_rule. Nilai variabel lingkungan tersebut dapat diberlakukan dari command line dengan flag --action_env (tetapi flag ini akan membatalkan setiap tindakan build).
  • Konten file apa pun yang digunakan dan dirujuk oleh label (misalnya, //mypkg:label.txt, bukan mypkg/label.txt).

Memaksa pengambilan ulang repositori eksternal

Terkadang, repositori eksternal dapat habis masa berlakunya tanpa ada 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 mesin lokal dan mungkin menjadi lebih usang jika komputer lokal diupgrade. Di sini, Anda dapat meminta bazel untuk mengambil kembali repositori eksternal tersebut jika definisi repository_rule telah menetapkan atribut configure, gunakan bazel sync --configure.

Contoh

  • Toolchain yang dikonfigurasi otomatis C++: menggunakan aturan repositori untuk otomatis membuat file konfigurasi C++ bagi Bazel dengan mencari compiler C++ lokal, lingkungan, dan tanda 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.