Aturan Repositori

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Halaman ini membahas cara menentukan aturan repositori dan memberikan contoh untuk mengetahui detail selengkapnya.

Repositori eksternal adalah hierarki direktori, yang berisi file sumber yang dapat digunakan dalam build Bazel, yang dibuat sesuai permintaan dengan menjalankan aturan repo yang sesuai. Repositori dapat ditentukan dengan berbagai cara, tetapi pada akhirnya, setiap repositori ditentukan dengan memanggil aturan repositori, sama seperti target build ditentukan dengan memanggil aturan build. 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.

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 implementasinya. 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 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 name yang ditentukan secara implisit. Ini adalah atribut string yang berperilaku agak ajaib: saat ditentukan sebagai input ke pemanggilan aturan repo, atribut ini mengambil nama repo yang jelas; tetapi saat dibaca dari fungsi penerapan aturan repo menggunakan repository_ctx.attr.name, atribut ini menampilkan nama repo kanonis.

Fungsi penerapan

Setiap aturan repo memerlukan fungsi implementation. 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 repo 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 dokumen API 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 aturan repo dieksekusi saat Bazel memerlukan target dari repositori tersebut, misalnya saat target lain (di repo lain) bergantung padanya atau jika disebutkan di command line. Fungsi penerapan kemudian diharapkan membuat repo dalam sistem file. Tindakan ini disebut "mengambil" repo.

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:

  • Atribut yang diteruskan ke pemanggilan aturan repo.
  • Kode Starlark yang terdiri dari penerapan aturan repositori.
  • Nilai variabel lingkungan apa pun yang diteruskan ke metode getenv() repository_ctx atau dideklarasikan dengan atribut environ dari repository_rule. Nilai variabel lingkungan ini dapat ditetapkan secara permanen di command line dengan tanda --repo_env.
  • Keberadaan, konten, dan jenis jalur apa pun yang watched dalam fungsi penerapan aturan repo.
    • Metode repository_ctx lainnya dengan parameter watch, seperti read(), execute(), dan extract(), juga dapat menyebabkan jalur dipantau.
    • Demikian pula, repository_ctx.watch_tree dan path.readdir dapat menyebabkan jalur dipantau dengan cara lain.
  • Saat bazel fetch --force dieksekusi.

Ada dua parameter repository_rule yang mengontrol kapan repositori diambil ulang:

  • Jika tanda configure ditetapkan, repositori akan diambil ulang pada bazel fetch --force --configure (repositori non-configure tidak akan diambil ulang).
  • Jika tanda local disetel, selain kasus di atas, repo juga akan diambil ulang saat server Bazel dimulai ulang.

Memaksa pengambilan ulang repositori eksternal

Terkadang, repo eksternal dapat menjadi tidak berlaku tanpa adanya perubahan pada definisi atau dependensinya. Misalnya, sumber pengambilan repo 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 fetch --force --all.

Selain itu, beberapa aturan repo 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, gunakan bazel fetch --force --configure.

Contoh

  • Rantai alat yang dikonfigurasi otomatis C++: 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 bernama @maven secara default yang menghasilkan target build untuk setiap artefak Maven dalam hierarki dependensi transitif.