如何为Bazel genrule安装Python依赖twine实现PyPI上传?
解决Bazel中通过构建系统管理的twine上传PyPI包的问题
核心思路
genrule虽无deps参数,但提供了tools参数用于指定构建过程依赖的可执行工具。我们可以将twine包装为Bazel可识别的可执行目标,通过tools引入到genrule中,再在命令中调用该工具的构建路径。
具体实现步骤
确保twine已作为构建依赖引入
假设你使用rules_python的pip_install管理Python依赖,先在requirements.txt中添加twine:twine>=4.0.0然后在BUILD文件中通过
pip_install加载依赖:load("@rules_python//python:pip.bzl", "pip_install") pip_install( name = "pip_deps", requirements = "//:requirements.txt", )定义twine的可执行目标
在BUILD文件中创建py_binary目标包装twine:load("@rules_python//python:defs.bzl", "py_binary") load("@pip_deps//:requirements.bzl", "requirement") py_binary( name = "twine", main = "twine/__main__.py", # twine的官方入口模块 deps = [requirement("twine")], visibility = ["//visibility:public"], )也可以直接使用
pip_install生成的可执行目标(路径通常为@pip_deps//twine:twine),无需手动定义py_binary。修改genrule引入twine工具
更新你的genrule,通过tools参数引入twine目标,并在cmd中使用$(location)获取工具路径:native.genrule( name = name + "_upload", srcs = [":" + short_name + "_wheel"], tools = [":twine"], # 引入twine可执行目标 outs = [short_name + "_twine_upload.log"], # 用$(location :twine)替代直接的twine命令,将输出重定向到日志文件 cmd = "$(location :twine) upload --disable-progress-bar --skip-existing $(SRCS) -u ........ > $@ 2>&1", visibility = ["//visibility:public"], )
原理说明
tools参数会让Bazel先构建指定的目标,并将其路径暴露在构建环境中。$(location :twine)会被Bazel替换为构建后twine可执行文件的绝对路径,确保调用的是构建系统管理的版本,而非系统或虚拟环境中的twine。
内容的提问来源于stack exchange,提问作者Ibolit
相关产品推荐
相关产品推荐

