Mode vendor adalah fitur yang memungkinkan Anda membuat salinan lokal dependensi eksternal. Fitur 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:
# 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.
Menyediakan repositori eksternal tertentu
Anda dapat menggunakan perintah vendor dengan flag --repo untuk menentukan repo mana
yang akan disediakan. Perintah ini menerima nama repo
kanonis dan nama repo
yang terlihat.
Misalnya, menjalankan:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
atau
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
akan membuat `rules_cc` disediakan di
<workspace root>/vendor_src/rules_cc+.
Menyediakan dependensi eksternal untuk target tertentu
Untuk menyediakan 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 menyediakan semua repo yang diperlukan untuk mem-build target //src/main:hello-world dan semua target di bagian //src/test/... dengan konfigurasi saat ini.
Di balik layar, perintah ini menjalankan perintah bazel build --nobuild untuk menganalisis pola target. Oleh karena itu, flag build dapat diterapkan ke perintah ini dan memengaruhi hasilnya.
Mem-build target secara offline
Dengan dependensi eksternal yang disediakan, Anda dapat mem-build 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 disediakan dan mem-build target yang sama secara offline di mesin lain.
Menyediakan semua dependensi eksternal
Untuk menyediakan semua repo dalam grafik dependensi eksternal transitif, Anda dapat menjalankan:
bazel vendor --vendor_dir=vendor_src
Perhatikan bahwa menyediakan semua dependensi memiliki beberapa kerugian:
- 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 untuk menyediakan target tertentu terlebih dahulu.
Alat vendor untuk subperintah Bazel
Beberapa subperintah Bazel (seperti bazel mod tidy) memiliki dependensi alat implisit yang tidak dapat dijangkau dari target build pengguna, sehingga tidak disertakan oleh bazel vendor //.... Untuk menyediakan alat tersebut juga, tambahkan grup file @bazel_tools//tools:tools_for_bazel_subcommands ke pemanggilan vendor Anda:
bazel vendor //... @bazel_tools//tools:tools_for_bazel_subcommands
Hal ini diperlukan jika Anda berencana menjalankan perintah seperti bazel mod tidy di lingkungan offline atau hermetik (misalnya dengan --vendor_dir dan --nofetch).
Mengonfigurasi mode vendor dengan VENDOR.bazel
Anda dapat mengontrol cara repo tertentu ditangani dengan file VENDOR.bazel yang terletak di direktori vendor.
Ada dua perintah yang tersedia, keduanya menerima daftar nama repo kanonis sebagai argumen:
ignore(): untuk mengabaikan repositori sepenuhnya dari mode vendor.pin(): untuk menyematkan repositori ke sumber yang disediakan saat ini seolah-olah ada flag--override_repositoryuntuk repo ini. Bazel TIDAK akan memperbarui sumber yang disediakan untuk repo ini saat menjalankan perintah vendor kecuali jika disematkan. Pengguna dapat mengubah dan mempertahankan sumber yang disediakan untuk repo ini secara manual.
Contoh
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
Dengan konfigurasi ini
- Kedua repo akan dikecualikan dari perintah vendor berikutnya.
- Repo
bazel_skylibakan diganti ke sumber yang terletak di direktori vendor. - Pengguna dapat mengubah sumber
bazel_skylibyang disediakan dengan aman. - Untuk menyediakan ulang
bazel_skylib, pengguna harus menonaktifkan pernyataan pin terlebih dahulu.
Memahami cara kerja mode vendor
Bazel mengambil dependensi eksternal project di bagian $(bazel info
output_base)/external. Menyediakan dependensi eksternal berarti memindahkan file dan direktori yang relevan ke direktori vendor yang diberikan dan menggunakan sumber yang disediakan untuk build berikutnya.
Konten yang disediakan mencakup:
- Direktori repo
- File penanda repo
Selama build, jika file penanda yang disediakan sudah terbaru atau repo disematkan dalam file VENDOR.bazel, Bazel akan menggunakan sumber yang disediakan dengan membuat symlink ke sumber tersebut di bagian $(bazel info output_base)/external, bukan menjalankan aturan repositori. Jika tidak, peringatan akan dicetak dan Bazel akan kembali mengambil versi repo 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 menyediakan semua file registry yang diambil dari
jaringan di bagian direktori <vendor_dir>/_registries.
Symlink vendor
Repositori eksternal mungkin 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 yang disediakan:
- Buat symlink
<vendor_dir>/bazel-externalyang mengarah ke$(bazel info output_base)/external. Symlink ini akan diperbarui secara otomatis oleh setiap perintah Bazel. - Untuk sumber yang disediakan, tulis ulang semua symlink yang awalnya mengarah ke a
jalur di bagian
$(bazel info output_base)/externalke jalur relatif di bagian<vendor_dir>/bazel-external.
Misalnya, jika symlink aslinya adalah
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
Symlink 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 dibuat oleh Bazel secara otomatis, sebaiknya tambahkan ke .gitignore atau yang setara untuk menghindari check-in.
Dengan strategi ini, symlink di sumber yang disediakan akan berfungsi dengan benar meskipun setelah sumber yang disediakan dipindahkan ke lokasi lain atau basis output bazel diubah.