如何在Bazel BUILD文件中使用已安装的Python依赖包?
解决Bazel Python依赖引用的仓库解析错误
问题场景
使用Bazel 7.0.1构建Python项目,通过MODULE.bazel的pip.parse加载requirements.txt中的tink==1.9.0依赖,但在BUILD文件中通过requirement("tink")引用时,出现仓库解析错误:
no such package '@@[unknown repo 'pip_39_protobuf' requested from @@rules_python~0.31.0~pip~pip_39_tink]//': The repository '@@[unknown repo 'pip_39_protobuf' requested from @@rules_python~0.31.0~pip~pip_39_tink]' could not be resolved: No repository visible as '@pip_39_protobuf' from repository '@@rules_python~0.31.0~pip~pip_39_tink'
当前配置细节:
- WORKSPACE文件保留旧版rules_python的
http_archive配置(版本0.30.0) - MODULE.bazel中使用rules_python 0.31.0,通过
pip.parse导入依赖 - Python版本3.9.6
问题原因
- 版本冲突:WORKSPACE和MODULE.bazel中rules_python版本不一致,导致依赖解析逻辑冲突
- 子仓库未导入:tink依赖protobuf,
pip.parse会为每个依赖生成独立仓库(如pip_39_protobuf),但仅用use_repo(pip, "pip")未导入这些子仓库,导致依赖链断裂
解决步骤
1. 清理WORKSPACE文件
Bazel 7+采用MODULE.bazel管理依赖,移除WORKSPACE中所有rules_python相关配置,修改后内容如下:
# 仅保留非rules_python的必要配置,若无则留空
2. 更新MODULE.bazel导入所有pip依赖仓库
修改use_repo语句,自动导入pip.parse生成的所有依赖仓库:
module(name = "my_module", version = "1.0") bazel_dep(name = "rules_python", version = "0.31.0") pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( configure_coverage_tool = True, python_version = "3.9", ) pip.parse( hub_name = "pip", python_version = "3.9", requirements_lock = "//:requirements.txt", ) # 导入pip主仓库及所有自动生成的依赖子仓库 use_repo(pip, "pip", *pip.repos)
3. 生成完整依赖锁文件(可选)
若仅用requirements.txt未包含间接依赖,执行以下命令生成锁文件:
bazel run @rules_python//python/tools/pip_compile -- requirements.txt > requirements_lock.txt
之后将MODULE.bazel中的requirements_lock改为//:requirements_lock.txt
4. 验证BUILD文件的依赖引用
在目标BUILD文件中正确加载并使用依赖:
load("@pip//:requirements.bzl", "requirement") py_library( name = "my_lib", srcs = ["my_lib.py"], deps = [ requirement("tink"), ], )
5. 重新构建项目
清理缓存并重新构建,确认错误消失:
bazel clean --expunge bazel build //path/to:my_lib
内容的提问来源于stack exchange,提问作者Nisha Tiwari
相关产品推荐
相关产品推荐

