Mode vendor adalah fitur Bzlmod yang memungkinkan Anda membuat salinan lokal dependensi eksternal. Hal ini berguna untuk build offline, atau saat Anda ingin mengontrol sumber dependensi eksternal.
Mengaktifkan mode vendor
Anda dapat mengaktifkan mode vendor dengan menentukan flag --vendor_dir
.
Misalnya, dengan menambahkannya ke file .bazelrc
Anda:
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
Direktori vendor dapat berupa jalur relatif ke root ruang kerja Anda atau jalur absolut.
Menjual repositori eksternal tertentu
Anda dapat menggunakan perintah vendor
dengan flag --repo
untuk menentukan repo mana
yang akan divendorkan. Perintah ini menerima nama repo
kanonik dan nama repo
yang terlihat.
Misalnya, jalankan:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
atau
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
akan membuat rules_cc divendorkan di bagian
<workspace root>/vendor_src/rules_cc+
.
Dependensi eksternal vendor untuk target tertentu
Untuk membuat semua dependensi eksternal yang diperlukan untuk mem-build pola target tertentu,
Anda dapat menjalankan bazel vendor <target patterns>
.
Contoh:
bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...
akan mem-vendor semua repo yang diperlukan untuk mem-build target //src/main:hello-world
dan semua target di //src/test/...
dengan konfigurasi saat ini.
Di balik layar, terdapat perintah bazel build --nobuild
untuk menganalisis
pola target sehingga flag build dapat diterapkan ke perintah ini dan
memengaruhi hasilnya.
Mem-build target secara offline
Dengan dependensi eksternal yang dikelompokkan, Anda bisa membangun target secara offline dengan
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
Build harus berfungsi di lingkungan build bersih tanpa akses jaringan dan cache repositori.
Oleh karena itu, Anda harus dapat memeriksa sumber yang dibeli dari vendor dan mem-build target yang sama secara offline di komputer lain.
Menjual semua dependensi eksternal
Untuk mem-vendor semua repositori dalam grafik dependensi eksternal transitif, Anda dapat menjalankan:
bazel vendor --vendor_dir=vendor_src
Perhatikan bahwa semua dependensi memiliki beberapa kelemahan:
- Mengambil semua repo, termasuk yang diperkenalkan secara transitif, dapat memakan waktu.
- Direktori vendor dapat menjadi sangat besar.
- Beberapa repo mungkin gagal diambil jika tidak kompatibel dengan platform atau lingkungan saat ini.
Oleh karena itu, pertimbangkan vendor untuk target tertentu terlebih dahulu.
Mengonfigurasi mode vendor dengan VENDOR.bazel
Anda dapat mengontrol cara penanganan repositori tertentu dengan file VENDOR.bazel yang berada pada direktori vendor.
Ada dua perintah yang tersedia, keduanya menerima daftar nama repo kanonis sebagai argumen:
ignore()
: untuk sepenuhnya mengabaikan repositori dari mode vendor.pin()
: untuk menyematkan repositori ke sumber vendor saat ini seolah-olah ada tanda--override_repository
untuk repo ini. Bazel TIDAK akan memperbarui sumber vendor untuk repo ini saat menjalankan perintah vendor kecuali jika dilepas pinnya. Pengguna dapat memodifikasi dan mengelola sumber vendor untuk repo ini secara manual.
Contoh:
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
Dengan konfigurasi ini
- Kedua repo tersebut akan dikecualikan dari perintah vendor berikutnya.
- Repo
bazel_skylib
akan diganti dengan sumber yang terletak di direktori vendor. - Pengguna dapat mengubah sumber
bazel_skylib
yang dibeli dari vendor dengan aman. - Untuk menjual kembali
bazel_skylib
, pengguna harus menonaktifkan pernyataan pin terlebih dahulu.
Memahami cara kerja mode vendor
Bazel mengambil dependensi eksternal project di $(bazel info
output_base)/external
. Menjual dependensi eksternal berarti memindahkan
file dan direktori yang relevan ke direktori vendor yang diberikan dan menggunakan
sumber yang dijual untuk build berikutnya.
Konten yang di-vendor mencakup:
- Direktori repo
- File penanda repo
Selama build, jika file penanda vendor sudah yang terbaru atau repo
disematkan dalam file VENDOR.bazel, Bazel akan menggunakan sumber vendor dengan membuat
symlink ke file tersebut di $(bazel info output_base)/external
, bukan benar-benar
menjalankan aturan repositori. Jika tidak, peringatan akan dicetak dan Bazel akan
kembali mengambil repo versi terbaru.
File registry vendor
Bazel harus melakukan resolusi modul Bazel untuk mengambil dependensi
eksternal, yang mungkin memerlukan akses ke file registry melalui internet. Untuk
mencapai build offline, Bazel mem-vendor semua file registry yang diambil dari
jaringan dalam direktori <vendor_dir>/_registries
.
Symbolic link vendor
Repositori eksternal dapat berisi symlink yang mengarah ke file atau direktori lain. Untuk memastikan symlink berfungsi dengan benar, Bazel menggunakan strategi berikut untuk menulis ulang symlink di sumber vendor:
- Buat
<vendor_dir>/bazel-external
symlink yang mengarah ke$(bazel info output_base)/external
. Halaman ini dimuat ulang oleh setiap perintah Bazel secara otomatis. - Untuk sumber vendor, tulis ulang semua symlink yang awalnya mengarah ke
jalur di
$(bazel info output_base)/external
ke jalur relatif di<vendor_dir>/bazel-external
.
Misalnya, jika symlink asli adalah
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
URL tersebut akan ditulis ulang menjadi
<vendor_dir>/repo_foo+/link => ../../bazel-external/repo_bar+/file
di mana
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
Karena <vendor_dir>/bazel-external
dihasilkan oleh Bazel secara otomatis, sebaiknya
tambahkan ke .gitignore
atau yang setara agar tidak perlu check in.
Dengan strategi ini, symlink di sumber vendor akan berfungsi dengan benar bahkan setelah sumber vendor dipindahkan ke lokasi lain atau basis output bazel berubah.