Mode vendor adalah fitur Bzlmod yang memungkinkan Anda membuat salinan lokal dependensi eksternal. Hal ini berguna untuk build offline, atau jika Anda ingin mengontrol sumber dependensi eksternal.
Aktifkan mode vendor
Anda dapat mengaktifkan mode vendor dengan menentukan tanda --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.
Vendor repositori eksternal tertentu
Anda dapat menggunakan perintah vendor
dengan tanda --repo
untuk menentukan vendor repo
mana yang 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~
keduanya akan mendapatkan rules_cc untuk vendor di
<workspace root>/vendor_src/rules_cc~
.
Dependensi eksternal vendor untuk target tertentu
Untuk mem-vendor semua dependensi eksternal yang diperlukan untuk membangun 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 repositori yang diperlukan untuk membangun target //src/main:hello-world
dan semua target pada //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.
Membuat 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 yang bersih tanpa akses jaringan dan cache repositori.
Oleh karena itu, Anda harus dapat memeriksa sumber vendor dan mem-build target yang sama secara offline di komputer lain.
Vendor semua dependensi eksternal
Untuk mem-vendor semua repositori dalam grafik dependensi eksternal transitif, Anda dapat menjalankan:
bazel vendor --vendor_dir=vendor_src
Perhatikan bahwa memasok semua dependensi memiliki beberapa kelemahan:
- Mengambil semua repositori, termasuk yang diperkenalkan secara transitif, dapat memakan waktu.
- Direktori vendor bisa menjadi sangat besar.
- Beberapa repositori 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 terletak pada direktori vendor.
Ada dua perintah yang tersedia, keduanya menerima daftar nama repositori kanonis sebagai argumen:
ignore()
: untuk sepenuhnya mengabaikan repositori dari mode vendor.pin()
: untuk menyematkan repositori ke sumber vendornya saat ini seolah-olah ada flag--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 repositori akan dikecualikan dari perintah vendor berikutnya.
- Repo
bazel_skylib
akan diganti ke sumber yang berada dalam direktori vendor. - Pengguna dapat dengan aman mengubah sumber vendor
bazel_skylib
. - Untuk melakukan vendor ulang
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
. Memasarkan dependensi eksternal berarti memindahkan
file dan direktori yang relevan ke direktori vendor tertentu dan menggunakan sumber
yang vendor untuk build berikutnya.
Konten yang vendor mencakup:
- Direktori repo
- File penanda repo
Selama proses build, jika file penanda vendor sudah diperbarui 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 menjalankan aturan repositori. Jika tidak, peringatan akan dicetak dan Bazel akan
kembali ke pengambilan repo versi terbaru.