Topik lanjutan tentang dependensi eksternal

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

Membayangi dependensi di WORKSPACE

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

project saya/Ruang Kerja

workspace(name = "myproject")

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

A/Ruang Kerja

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 dalam 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 yang berbeda, gabungkan dependensi tersebut di myproject/WORKSPACE.

Mengganti repositori dari command line

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

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

Kasus penggunaan mencakup:

  • Masalah proses debug. Misalnya, untuk mengganti repositori http_archive ke direktori lokal di mana Anda dapat membuat perubahan dengan lebih mudah.
  • Vendor. Jika Anda berada di lingkungan di mana Anda tidak dapat melakukan panggilan jaringan, mengganti aturan repositori berbasis jaringan untuk mengarah ke direktori lokal sebagai gantinya.

Menggunakan proxy

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

Dukungan untuk IPv6

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

  • Gunakan --host_jvm_args=-Djava.net.preferIPv6Addresses=true startup , 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 (seperti untuk pengujian integrasi), gunakan --jvmopt=-Djava.net.preferIPv6Addresses=true alat flag. Misalnya, sertakan dalam .bazelrc file:

    build --jvmopt=-Djava.net.preferIPv6Addresses

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

Build offline

Terkadang Anda mungkin ingin menjalankan build secara offline, seperti saat bepergian dengan pesawat terbang. 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 yang sebenarnya, di mana entitas yang berbeda menyediakan semua file yang diperlukan, Bazel mendukung opsi --distdir. Bendera ini memberi tahu Bazel untuk melihat terlebih dahulu direktori yang ditentukan oleh opsi itu ketika aturan repositori meminta Bazel untuk mengambil file dengan ctx.download atau ctx.download_and_extract. Menurut menyediakan jumlah {i>hash <i}dari file yang dibutuhkan, Bazel mencari file yang cocok dengan nama dasar dari URL pertama, dan menggunakan {i> copy<i} (teks) lokal jika {i>hash<i} cocok.

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

Bazel memungkinkan eksekusi perintah arbitrer dalam aturan repositori tanpa mengetahui jika mereka terhubung ke jaringan, sehingga tidak dapat menerapkan build yang sepenuhnya offline. Kepada uji apakah build berfungsi dengan benar saat offline, blokir jaringan secara manual (seperti Bazel melakukannya dalam bootstrap uji).