如何在Bazel @rules_python的BUILD文件中批量导入requirements.txt依赖到py_library?
使用Bazel @rules_python的依赖导入问题及解答
在使用Bazel的@rules_python时,pip_parse工具可以为requirements.txt中的每个依赖生成库目标,示例代码如下:
load("@rules_python//python:pip.bzl", "pip_parse") pip_parse( name = "pip_deps", requirements_lock = ":requirements.txt", ) load("@pip_deps//:requirements.bzl", "install_deps") install_deps()
但将这些依赖逐个导入py_library时,会重复requirements.txt中的内容,示例:
load("@pip_deps//:requirements.bzl", "requirement") py_library( name = "bar", ... deps = [ "//my/other:dep", requirement("requests"), # 重复声明 requirement("numpy"), # 重复声明 ], )
1. 一步导入所有依赖到py_library的方法
可以直接使用pip_parse生成的requirements.bzl中的all_requirements列表,一次性导入所有依赖,无需逐个声明:
load("@pip_deps//:requirements.bzl", "all_requirements") py_library( name = "bar", ... deps = [ "//my/other:dep", ] + all_requirements, )
all_requirements是一个包含所有依赖对应requirement()目标的列表,直接将其与自定义依赖拼接进deps即可完成批量导入。
2. pip_parse与pip_repositories的区别
构建模式差异:
pip_parse是增量式、锁文件驱动的工具:它基于锁定文件解析依赖,为每个依赖生成独立的Bazel仓库,仅在实际使用该依赖时才会拉取、构建,能有效提升大型项目的构建启动速度。pip_repositories是全量预加载的旧工具:它会一次性拉取并注册所有依赖到Bazel仓库,无论是否用到,在依赖较多的项目中会导致构建启动缓慢。
目标灵活性:
pip_parse生成的requirements.bzl同时提供requirement()(单个依赖导入)和all_requirements(批量导入)两种方式,适配不同场景的依赖引用需求。pip_repositories仅主打all_requirements批量导入,单个依赖的引用方式不够直观,且对锁文件的支持有限。
官方定位:
pip_parse是rules_python官方推荐的现代依赖管理方案,支持多Python版本、增量构建等特性,符合Bazel最新的构建理念。pip_repositories属于遗留工具,官方已不再推荐使用,仅用于兼容旧项目。
内容的提问来源于stack exchange,提问作者manews
相关产品推荐
相关产品推荐

