Topik lanjutan tentang dependensi eksternal

Laporkan masalah Lihat sumber

Membayangi dependensi di WORKSPACE

Jika memungkinkan, miliki satu kebijakan versi dalam project Anda, yang diperlukan untuk dependensi yang Anda kompilasi dan berakhir di biner akhir Anda. Untuk kasus lainnya, Anda dapat membayangi dependensi:

projectsaya/WORKSPACE

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

A/WORKSPACE

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/Ruang Kerja

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

Dependensi A dan B bergantung pada versi testrunner yang berbeda. Sertakan keduanya di myproject tanpa konflik dengan memberinya nama yang berbeda di myproject/WORKSPACE:

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

Anda juga dapat menggunakan mekanisme ini untuk menggabungkan berlian. Misalnya, jika A dan B memiliki dependensi yang sama, tetapi memanggilnya dengan nama berbeda, gabungkan dependensi tersebut di myproject/WORKSPACE.

Mengganti repositori dari command line

Untuk mengganti repositori yang dideklarasikan dengan repositori lokal dari command line, gunakan tanda --override_repository. Menggunakan flag ini akan mengubah konten repositori eksternal tanpa mengubah kode sumber Anda.

Misalnya, untuk mengganti @foo ke direktori lokal /path/to/local/foo, teruskan flag --override_repository=foo=/path/to/local/foo.

Kasus penggunaan mencakup:

  • Men-debug masalah. Misalnya, untuk mengganti repositori http_archive ke direktori lokal tempat Anda dapat membuat perubahan dengan lebih mudah.
  • Vendor. Jika Anda berada di lingkungan yang tidak dapat melakukan panggilan jaringan, ganti aturan repositori berbasis jaringan agar mengarah ke direktori lokal.
.

Menggunakan proxy

Bazel mengambil alamat proxy dari variabel lingkungan HTTPS_PROXY dan HTTP_PROXY, lalu menggunakannya untuk mendownload file HTTP dan HTTPS (jika ditentukan).

Dukungan untuk IPv6

Pada komputer khusus IPv6, Bazel dapat mendownload dependensi tanpa perlu mengubah apa pun. Namun, pada mesin IPv4/IPv6 dual-stack, Bazel mengikuti konvensi yang sama dengan Java, yang lebih memprioritaskan IPv4 jika diaktifkan. Dalam beberapa situasi, misalnya jika jaringan IPv4 tidak dapat menyelesaikan/menjangkau alamat eksternal, hal ini dapat menyebabkan pengecualian Network unreachable dan kegagalan build. Dalam hal ini, Anda dapat mengganti perilaku Bazel untuk memilih IPv6 menggunakan properti sistem java.net.preferIPv6Addresses=true. Khususnya:

  • Gunakan opsi startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true, misalnya dengan menambahkan baris berikut di file .bazelrc Anda:

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • Saat menjalankan target build Java yang perlu terhubung ke internet (misalnya untuk pengujian integrasi), gunakan tanda alat --jvmopt=-Djava.net.preferIPv6Addresses=true. Misalnya, sertakan dalam file .bazelrc Anda:

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • Jika Anda menggunakan rules_jvm_external untuk resolusi versi dependensi, tambahkan juga -Djava.net.preferIPv6Addresses=true ke variabel lingkungan COURSIER_OPTS untuk memberikan opsi JVM bagi Coursier.

Build offline

Terkadang, Anda mungkin ingin menjalankan build secara offline, seperti saat bepergian dengan pesawat. Untuk kasus penggunaan sederhana seperti itu, ambil data repositori yang diperlukan dengan bazel fetch atau bazel sync. Untuk menonaktifkan pengambilan repositori lebih lanjut selama build, gunakan opsi --nofetch.

Untuk build offline sebenarnya, dengan entity lain menyediakan semua file yang diperlukan, Bazel mendukung opsi --distdir. Flag ini memberi tahu Bazel untuk melihat terlebih dahulu direktori yang ditentukan oleh opsi tersebut saat aturan repositori meminta Bazel untuk mengambil file dengan ctx.download atau ctx.download_and_extract. Dengan memberikan jumlah hash file yang diperlukan, Bazel mencari file yang cocok dengan nama dasar URL pertama, lalu menggunakan salinan lokal jika hash-nya cocok.

Bazel sendiri menggunakan teknik ini untuk melakukan bootstrap offline dari artefak distribusi. Hal ini dilakukan dengan mengumpulkan semua dependensi eksternal yang diperlukan dalam distdir_tar internal.

Bazel memungkinkan eksekusi perintah arbitrer dalam aturan repositori tanpa mengetahui apakah perintah tersebut memanggil jaringan, sehingga tidak dapat menerapkan build offline sepenuhnya. Untuk menguji apakah build berfungsi dengan benar secara offline, blokir jaringan secara manual (seperti yang dilakukan Bazel dalam pengujian bootstrap).