keywords: product:Bazel,Bzlmod,vendor
title: ‘Vendor Mode’
Vendor mode is a feature that lets you create a local copy of external dependencies. This is useful for offline builds, or when you want to control the source of an external dependency.Enable vendor mode
You can enable vendor mode by specifying--vendor_dir flag.
For example, by adding it to your .bazelrc file:
Vendor a specific external repository
You can use thevendor command with the --repo flag to specify which repo
to vendor, it accepts both canonical repo
name and apparent repo
name.
For example, running:
<workspace root>/vendor_src/rules_cc+.
Vendor external dependencies for given targets
To vendor all external dependencies required for building given target patterns, you can runbazel vendor <target patterns>.
For example
//src/main:hello-world target
and all targets under //src/test/... with the current configuration.
Under the hood, it’s doing a bazel build --nobuild command to analyze the
target patterns, therefore build flags could be applied to this command and
affect the result.
Build the target offline
With the external dependencies vendored, you can build the target offline byVendor all external dependencies
To vendor all repos in your transitive external dependencies graph, you can run:- Fetching all repos, including those introduced transitively, can be time-consuming.
- The vendor directory can become very large.
- Some repos may fail to fetch if they are not compatible with the current platform or environment.
Configure vendor mode with VENDOR.bazel
You can control how given repos are handled with the VENDOR.bazel file located under the vendor directory. There are two directives available, both accepting a list of canonical repo names as arguments:ignore(): to completely ignore a repository from vendor mode.pin(): to pin a repository to its current vendored source as if there is a--override_repositoryflag for this repo. Bazel will NOT update the vendored source for this repo while running the vendor command unless it’s unpinned. The user can modify and maintain the vendored source for this repo manually.
- Both repos will be excluded from subsequent vendor commands.
- Repo
bazel_skylibwill be overridden to the source located under the vendor directory. - The user can safely modify the vendored source of
bazel_skylib. - To re-vendor
bazel_skylib, the user has to disable the pin statement first.
local or
configure set to true are
always excluded from vendoring.
Understand how vendor mode works
Bazel fetches external dependencies of a project under$(bazel info output_base)/external. Vendoring external dependencies means moving out
relevant files and directories to the given vendor directory and use the
vendored source for later builds.
The content being vendored includes:
- The repo directory
- The repo marker file
$(bazel info output_base)/external instead of actually
running the repository rule. Otherwise, a warning is printed and Bazel will
fallback to fetching the latest version of the repo.
Note: Bazel assumes the vendored source is not changed by users unless the repo
is pinned in the VENDOR.bazel file. If a user does change the vendored source
without pinning the repo, the changed vendored source will be used, but it will
be overwritten if its existing marker file is
outdated and the repo is vendored again.
Vendor registry files
Bazel has to perform the Bazel module resolution in order to fetch external dependencies, which may require accessing registry files through internet. To achieve offline build, Bazel vendors all registry files fetched from network under the<vendor_dir>/_registries directory.
Vendor symlinks
External repositories may contain symlinks pointing to other files or directories. To make sure symlinks work correctly, Bazel uses the following strategy to rewrite symlinks in the vendored source:- Create a symlink
<vendor_dir>/bazel-externalthat points to$(bazel info output_base)/external. It is refreshed by every Bazel command automatically. - For the vendored source, rewrite all symlinks that originally point to a
path under
$(bazel info output_base)/externalto a relative path under<vendor_dir>/bazel-external.
<vendor_dir>/bazel-external is generated by Bazel automatically, it’s
recommended to add it to .gitignore or equivalent to avoid checking it in.
With this strategy, symlinks in the vendored source should work correctly even
after the vendored source is moved to another location or the bazel output base
is changed.
Note: symlinks that point to an absolute path outside of $(bazel info
output_base)/external are not rewritten. Therefore, it could still break
cross-machine compatibility.
Note: On Windows, vendoring symlinks only works with
--windows_enable_symlinks
flag enabled.