Mode Vendor

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Mode vendor adalah fitur {i>Bzlmod<i} yang memungkinkan Anda membuat salinan lokal dari dependensi eksternal. 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 absolut.

Vendor repositori eksternal tertentu

Anda dapat menggunakan perintah vendor dengan flag --repo untuk menentukan repo ke vendor, vendor tersebut menerima kedua repo kanonis name dan repo jelas nama.

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 <workspace root>/vendor_src/rules_cc~.

Dependensi eksternal vendor untuk target tertentu

Untuk 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/...

akankah semua repositori diperlukan untuk membangun target //src/main:hello-world dan semua target di bawah //src/test/... dengan konfigurasi saat ini.

Di balik layar, terdapat perintah bazel build --nobuild untuk menganalisis target pola, oleh karena itu penanda {i>build<i} dapat diterapkan pada perintah ini dan mempengaruhi 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 di sumber vendor dan membangun menyasar secara {i>offline<i} pada komputer lain.

Vendor semua dependensi eksternal

Untuk memasok semua repositori dalam grafik dependensi eksternal transitif, Anda dapat jalankan:

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 di bawah direktori vendor.

Ada dua direktif yang tersedia, keduanya menerima daftar nama repo kanonis sebagai argumen:

  • ignore(): untuk sepenuhnya mengabaikan repositori dari mode vendor.
  • pin(): untuk menyematkan repositori ke sumber vendornya saat ini seolah-olah ada --override_repository untuk repo ini. Bazel TIDAK akan mengupdate vendor untuk repo ini saat menjalankan perintah vendor kecuali pin dilepas. 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 di bagian 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 meninggalkan file dan direktori yang relevan ke direktori vendor yang ditentukan dan menggunakan sumber vendor untuk build selanjutnya.

Konten yang vendor mencakup:

  • Direktori repo
  • File penanda repo

Selama build, jika file penanda yang dimiliki vendor adalah yang terbaru atau repo-nya disematkan di file VENDOR.bazel, lalu Bazel menggunakan sumber vendor dengan membuat symlink ke kode tersebut di bawah $(bazel info output_base)/external, bukan menjalankan aturan repositori. Jika tidak, peringatan akan dicetak dan Bazel akan kembali ke pengambilan repo versi terbaru.

File registry vendor

Bazel harus melakukan resolusi modul Bazel untuk mengambil dependensi, yang mungkin memerlukan akses file {i>registry<i} melalui internet. Kepada mencapai build offline, vendor Bazel semua file registry yang diambil pada direktori <vendor_dir>/_registries.

Repositori eksternal mungkin berisi symlink yang mengarah ke file lain atau direktori. Untuk memastikan symlink berfungsi dengan benar, Bazel menggunakan untuk menulis ulang symlink di sumber vendor:

  • Buat <vendor_dir>/bazel-external symlink yang mengarah ke $(bazel info output_base)/external. Ini dimuat ulang oleh setiap perintah Bazel secara otomatis.
  • Untuk sumber vendor, tulis ulang semua symlink yang awalnya mengarah ke jalur di bawah $(bazel info output_base)/external ke jalur relatif di bawah <vendor_dir>/bazel-external.

Misalnya, jika symlink asli adalah

<vendor_dir>/repo_foo~/link  =>  $(bazel info output_base)/external/repo_bar~/file

Ini 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, maka sebaiknya tambahkan ke .gitignore atau yang setara agar tidak perlu check in.

Dengan strategi ini, {i>symlink<i} di dalam sumber vendor harus bekerja dengan benar bahkan setelah sumber vendor dipindahkan ke lokasi lain atau basis output bazel diubah.