Mode Vendor

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Mode vendor adalah fitur 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 atau jalur absolut.

Menyediakan repositori eksternal tertentu

Anda dapat menggunakan perintah vendor dengan flag --repo untuk menentukan repo mana yang akan di-vendor, 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 mendapatkan rules_cc yang di-vendor di bagian <workspace root>/vendor_src/rules_cc+.

Vendor dependensi eksternal untuk target tertentu

Untuk memaketkan 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 di //src/test/... dengan konfigurasi saat ini.

Di balik layar, perintah ini menjalankan perintah bazel build --nobuild untuk menganalisis pola target, sehingga tanda build dapat diterapkan ke perintah ini dan memengaruhi hasilnya.

Membangun target secara offline

Dengan dependensi eksternal yang disediakan, Anda dapat 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 di-vendor dan membuat target yang sama secara offline di komputer lain.

Vendor semua dependensi eksternal

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

bazel vendor --vendor_dir=vendor_src

Perhatikan bahwa menyertakan semua dependensi memiliki beberapa kekurangan:

  • 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 menggunakan vendor untuk target tertentu terlebih dahulu.

Mengonfigurasi mode vendor dengan VENDOR.bazel

Anda dapat mengontrol cara penanganan repos tertentu dengan file VENDOR.bazel yang berada di direktori vendor.

Ada dua direktif 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 tanda --override_repository untuk repositori ini. Bazel TIDAK akan memperbarui sumber yang di-vendor untuk repo ini saat menjalankan perintah vendor kecuali jika tidak 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 repositori akan dikecualikan dari perintah vendor berikutnya.
  • Repo bazel_skylib akan diganti dengan sumber yang berada di bagian direktori vendor.
  • Pengguna dapat mengubah sumber yang disediakan bazel_skylib dengan aman.
  • Untuk mengganti vendor bazel_skylib, pengguna harus menonaktifkan pernyataan penyematan terlebih dahulu.

Memahami cara kerja mode vendor

Bazel mengambil dependensi eksternal project di $(bazel info output_base)/external. Menyediakan dependensi eksternal berarti memindahkan file dan direktori yang relevan ke direktori vendor yang ditentukan dan menggunakan sumber yang disediakan untuk build selanjutnya.

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 link simbolis ke sumber tersebut di $(bazel info output_base)/external, bukan menjalankan aturan repositori. Jika tidak, peringatan akan dicetak dan Bazel akan melakukan penggantian ke pengambilan versi terbaru repo.

File pendaftaran vendor

Bazel harus melakukan resolusi modul Bazel untuk mengambil dependensi eksternal, yang mungkin memerlukan akses ke file registri melalui internet. Untuk mencapai build offline, Bazel menyediakan semua file registry yang diambil dari jaringan di bawah 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 yang di-vendor:

  • Buat symlink <vendor_dir>/bazel-external yang mengarah ke $(bazel info output_base)/external. File ini diperbarui secara otomatis oleh setiap perintah Bazel.
  • Untuk sumber yang di-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 aslinya adalah

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

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 di-vendor harus berfungsi dengan benar meskipun setelah sumber yang di-vendor dipindahkan ke lokasi lain atau dasar output bazel diubah.