Menyembunyikan dependensi di WORKSPACE
Jika memungkinkan, gunakan kebijakan satu versi dalam project Anda, yang diperlukan untuk dependensi yang Anda kompilasi dan berakhir di biner akhir. Untuk kasus lain, Anda dapat menyembunyikan dependensi:
myproject/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/WORKSPACE
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 memberi mereka 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
tanda. Menggunakan tanda ini akan mengubah konten repositori eksternal tanpa mengubah kode sumber Anda.
Misalnya, untuk mengganti @foo ke direktori lokal /path/to/local/foo,
teruskan tanda --override_repository=foo=/path/to/local/foo.
Kasus penggunaan mencakup:
- Masalah proses debug. Misalnya, untuk mengganti repositori
http_archiveke direktori lokal tempat Anda dapat melakukan perubahan dengan lebih mudah. - Vendor. Jika Anda berada di lingkungan tempat Anda tidak dapat melakukan panggilan jaringan, ganti aturan repositori berbasis jaringan untuk mengarah ke direktori lokal.
Menggunakan proxy
Bazel mengambil alamat proxy dari HTTPS_PROXY dan HTTP_PROXY
variabel lingkungan, lalu menggunakannya untuk mendownload HTTP dan HTTPS file (jika
ditentukan).
Dukungan untuk IPv6
Di mesin khusus IPv6, Bazel dapat mendownload dependensi tanpa perubahan. Namun, di mesin IPv4/IPv6 dual-stack, Bazel mengikuti konvensi yang sama dengan Java, yang lebih memilih IPv4 jika diaktifkan. Dalam beberapa situasi, misalnya saat jaringan IPv4
tidak dapat me-resolve/menjangkau alamat eksternal, hal ini dapat menyebabkan Network
unreachable pengecualian dan kegagalan build. Dalam kasus ini, Anda dapat mengganti perilaku Bazel untuk lebih memilih IPv6 dengan menggunakan properti sistem.java.net.preferIPv6Addresses=true
Khususnya:
Gunakan
--host_jvm_args=-Djava.net.preferIPv6Addresses=trueopsi startup, misalnya dengan menambahkan baris berikut dalam file.bazelrc:startup --host_jvm_args=-Djava.net.preferIPv6Addresses=trueSaat menjalankan target build Java yang perlu terhubung ke internet (seperti untuk pengujian integrasi), gunakan
--jvmopt=-Djava.net.preferIPv6Addresses=truetanda alat. Misalnya, sertakan dalam.bazelrcfile:build --jvmopt=-Djava.net.preferIPv6AddressesJika Anda menggunakan
rules_jvm_externaluntuk resolusi versi dependensi, tambahkan juga-Djava.net.preferIPv6Addresses=truekeCOURSIER_OPTSlingkungan variabel untuk memberikan opsi JVM untuk Coursier.
Build offline
Terkadang, Anda mungkin ingin menjalankan build secara offline, seperti saat bepergian dengan pesawat. Untuk kasus penggunaan sederhana seperti itu, ambil 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, tempat entitas yang berbeda menyediakan semua file yang diperlukan, Bazel mendukung opsi --distdir. Tanda 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 akan mencari file yang cocok dengan nama dasar URL pertama, dan menggunakan salinan lokal jika hash cocok.
Bazel sendiri menggunakan teknik ini untuk mem-bootstrap offline dari artefak distribusi
.
Hal ini dilakukan dengan mengumpulkan semua dependensi eksternal yang diperlukan
dalam
internaldistdir_tar.
Bazel memungkinkan eksekusi perintah arbitrer dalam aturan repositori tanpa mengetahui apakah perintah tersebut memanggil jaringan, sehingga tidak dapat menerapkan build yang sepenuhnya offline. Untuk menguji apakah build berfungsi dengan benar secara offline, blokir jaringan secara manual (seperti yang dilakukan Bazel dalam pengujian bootstrap-nya).