Dependensi bayangan di WORKSPACE
Jika memungkinkan, buat satu kebijakan versi dalam project Anda, yang diperlukan untuk dependensi yang Anda kompilasi dan akan masuk ke biner akhir. 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 = "..."
)
Kedua 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 yang berbeda, gabungkan dependensi tersebut
dalam myproject/WORKSPACE
.
Mengganti repositori dari command line
Untuk mengganti repositori yang dideklarasikan dengan repositori lokal dari command line,
gunakan
flag
--override_repository
. Penggunaan 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 tempat Anda tidak dapat melakukan panggilan jaringan, ganti aturan repositori berbasis jaringan untuk mengarah ke direktori lokal.
Menggunakan proxy
Bazel mengambil alamat proxy dari variabel lingkungan HTTPS_PROXY
dan HTTP_PROXY
serta menggunakannya untuk mendownload file HTTP
dan HTTPS
(jika ditentukan).
Dukungan untuk IPv6
Pada mesin yang hanya mendukung IPv6, Bazel dapat mendownload dependensi tanpa perubahan. Namun,
pada mesin IPv4/IPv6 stack ganda, 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 pengecualian Network
unreachable
dan kegagalan build. Dalam kasus 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
:startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true
Saat menjalankan target build Java yang perlu terhubung ke internet (seperti untuk pengujian integrasi), gunakan flag 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 lingkunganCOURSIER_OPTS
guna menyediakan opsi JVM untuk Coursier.
Build offline
Terkadang Anda mungkin ingin menjalankan build secara offline, seperti saat bepergian dengan
pesawat. Untuk kasus penggunaan sederhana tersebut, 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, saat entity yang berbeda 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 dari file yang diperlukan, Bazel akan mencari file yang cocok
dengan nama dasar URL pertama, lalu menggunakan salinan lokal jika hash cocok.
Bazel sendiri menggunakan teknik ini untuk melakukan bootstrap secara offline dari artefak distribusi.
Hal ini dilakukan dengan mengumpulkan semua dependensi
eksternal yang diperlukan
dalam
distdir_tar
internal.
Bazel mengizinkan 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).