Module Dependencies
This guide explains how to manage dependencies in modern Bazel using Bzlmod.
Understanding Module Dependencies
In modern Bazel, dependencies are declared in your MODULE.bazel file using bazel_dep. Each dependency is a module that provides rules, libraries, or binaries for your project.
The Bazel Central Registry
The Bazel Central Registry is the official registry for Bazel modules. It provides:
- Verified and tested modules
- Version compatibility information
- Security through checksums
- Standardized module metadata
Types of Dependencies
Direct Dependencies
These are modules your project directly depends on:
bazel_dep(name = "rules_python", version = "0.27.1")
bazel_dep(name = "rules_go", version = "0.42.0")Development Dependencies
Tools and libraries only needed during development:
dev_dependency(name = "buildifier", version = "6.3.3")Multiple-Version Dependencies
Bazel's Multiple Version Compatibility (MVC) system handles multiple versions:
bazel_dep(name = "protobuf", version = "3.19.0")
single_version_override(
module_name = "protobuf",
version = "3.19.0",
patches = ["//patches:protobuf.patch"],
)Module Extensions
Module extensions are the Bzlmod way to configure dependencies, replacing repository rules:
# Root module extension
root_module_extension = use_extension("//tools:my_extension.bzl", "root_ext")
root_module_extension.configure(param = "value")
# Regular module extension
my_ext = use_extension("@other_module//tools:ext.bzl", "ext")
use_repo(my_ext, "generated_repo")Common Patterns
Python Dependencies
bazel_dep(name = "rules_python", version = "0.27.1")
python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
python_version = "3.11",
)
pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
hub_name = "pip",
python_version = "3.11",
requirements_lock = "//third_party:requirements_lock.txt",
)
use_repo(pip, "pip")Go Dependencies
bazel_dep(name = "rules_go", version = "0.42.0")
go_deps = use_extension("@rules_go//go:extensions.bzl", "go_deps")
go_deps.module(
path = "github.com/google/uuid",
version = "v1.3.0",
)
use_repo(go_deps, "uuid")Version Resolution
Bazel's version resolution follows these rules:
- Direct dependencies take precedence
single_version_overridetakes highest priority- Compatible version selection using semver
- Explicit version ranges are respected
- Registry metadata is consulted for compatibility
Best Practices
Version Management
- Use exact versions from the Bazel Central Registry
- Document version override reasons
- Keep dependencies up to date
Module Organization
- Use module extensions over repository rules
- Keep third-party dependencies separate
- Document module configurations
Security
- Use the Bazel Central Registry when possible
- Verify checksums for external dependencies
- Review patch files regularly
Common Issues and Solutions
Version Conflicts
When encountering version conflicts:
- Check the dependency graph (
bazel mod graph) - Use
single_version_overrideif needed - Update to compatible versions
- Consider module extension configuration
Missing Dependencies
For missing dependencies:
- Verify the module name in the registry
- Check version availability
- Ensure registry access
- Look for alternative modules
