Mode Vendor

Laporkan masalah Lihat sumber Nightly · 7.4 .

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 atau jalur absolut.

Vendor repositori eksternal tertentu

Anda dapat menggunakan perintah vendor dengan flag --repo untuk menentukan vendor repo mana yang menerima nama repo kanonis 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 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.

Menjual semua dependensi eksternal

Untuk membuat vendor semua repo dalam grafik dependensi eksternal transitif, Anda dapat menjalankan:

bazel vendor --vendor_dir=vendor_src

Perhatikan bahwa membuat semua dependensi menjadi vendor memiliki beberapa kelemahan:

  • Mengambil semua repositori, termasuk yang diperkenalkan secara transitif, dapat memakan waktu.
  • Direktori vendor dapat 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 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 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 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. 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 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 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, vendor Bazel akan mengambil semua file registry dari jaringan di direktori <vendor_dir>/_registries.

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 symlink <vendor_dir>/bazel-external yang mengarah ke $(bazel info output_base)/external. File ini diperbarui oleh setiap perintah Bazel secara otomatis.
  • Untuk sumber vendor, tulis ulang semua symlink yang awalnya mengarah ke jalur pada $(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 untuk menghindari 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.