Shadowing dependencies in WORKSPACE
Whenever possible, have a single version policy in your project, which is required for dependencies that you compile against and end up in your final binary. For other cases, you can shadow dependencies:
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 = "..."
)
Both dependencies A and B depend on different versions of testrunner.
Include both in myproject without conflict by giving them distinct names in
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"}
)
You can also use this mechanism to join diamonds. For example, if A and B
have the same dependency but call it by different names, join those dependencies
in myproject/WORKSPACE.
Overriding repositories from the command line
To override a declared repository with a local repository from the command line,
use the
--override_repository
flag. Using this flag changes the contents of external repositories without
changing your source code.
For example, to override @foo to the local directory /path/to/local/foo,
pass the --override_repository=foo=/path/to/local/foo flag.
Use cases include:
- Debugging issues. For example, to override an
http_archiverepository to a local directory where you can make changes more easily. - Vendoring. If you are in an environment where you cannot make network calls, override the network-based repository rules to point to local directories instead.
Using proxies
Bazel picks up proxy addresses from the HTTPS_PROXY and HTTP_PROXY
environment variables and uses these to download HTTP and HTTPS files (if
specified).
Support for IPv6
On IPv6-only machines, Bazel can download dependencies with no changes. However,
on dual-stack IPv4/IPv6 machines Bazel follows the same convention as Java,
preferring IPv4 if enabled. In some situations, for example when the IPv4
network cannot resolve/reach external addresses, this can cause Network
unreachable exceptions and build failures. In these cases, you can override
Bazel's behavior to prefer IPv6 by using the
java.net.preferIPv6Addresses=true system
property.
Specifically:
Use
--host_jvm_args=-Djava.net.preferIPv6Addresses=truestartup option, for example by adding the following line in your.bazelrcfile:startup --host_jvm_args=-Djava.net.preferIPv6Addresses=trueWhen running Java build targets that need to connect to the internet (such as for integration tests), use the
--jvmopt=-Djava.net.preferIPv6Addresses=truetool flag. For example, include in your.bazelrcfile:build --jvmopt=-Djava.net.preferIPv6AddressesIf you are using
rules_jvm_externalfor dependency version resolution, also add-Djava.net.preferIPv6Addresses=trueto theCOURSIER_OPTSenvironment variable to provide JVM options for Coursier.
Offline builds
Sometimes you may wish to run a build offline, such as when traveling on an
airplane. For such simple use cases, prefetch the needed repositories with
bazel fetch or bazel sync. To disable fetching further repositories during
the build, use the option --nofetch.
For true offline builds, where a different entity supplies all needed files,
Bazel supports the option --distdir. This flag tells Bazel to look first into
the directories specified by that option when a repository rule asks Bazel to
fetch a file with ctx.download or
ctx.download_and_extract. By
providing a hash sum of the file needed, Bazel looks for a file matching the
basename of the first URL, and uses the local copy if the hash matches.
Bazel itself uses this technique to bootstrap offline from the distribution
artifact.
It does so by collecting all the needed external
dependencies
in an internal
distdir_tar.
Bazel allows execution of arbitrary commands in repository rules without knowing if they call out to the network, and so cannot enforce fully offline builds. To test if a build works correctly offline, manually block off the network (as Bazel does in its bootstrap test).