如何物化Bazel构建输出以实现Python库的云端部署
问题:Bazel构建Python库无输出,如何生成可部署到Azure Functions的包?
问题背景
- 项目包含多个Python库(如lib1、lib2),lib2通过
py_library规则定义目标 - 执行
bazel build //lib2后,bazel-bin和bazel-out目录无任何输出,确认原因是py_library仅作为依赖提供者,不会生成物化产物 - 核心需求:生成可直接部署到云端服务(Azure Functions)的文件夹或压缩包
已尝试的无效方案
- 使用
pkg_zip规则:无法正确包含子目录及依赖库文件 - 使用
filegroup目标:执行构建后仍无输出产物
可行解决方案:结合py_binary与自定义copy宏
通过py_binary触发依赖解析与产物生成,配合自定义copy宏整理出符合Azure Functions要求的部署结构,步骤如下:
- 定义
py_binary目标
将lib2及依赖的其他Python库作为deps引入,指定适配Azure Functions的入口文件:
py_binary( name = "lib2_deploy", srcs = glob(["*.py"]), deps = [ "//lib1", ":lib2", ], main = "function_app.py", # 根据Azure Functions的函数入口调整 )
- 编写自定义copy宏
创建宏来复制py_binary生成的所有产物(包括依赖的.egg包、源码文件),同时加入Azure Functions必需的配置文件:
def copy_deploy_files(name, src_target, dest_dir): native.genrule( name = name, srcs = [ src_target, "//config:host.json", "//config:local.settings.json", ], outs = [dest_dir], cmd = """ mkdir -p $(@D)/$(OUTS) # 复制py_binary生成的所有部署文件 cp -R $(location {src})/* $(@D)/$(OUTS)/ # 复制Azure Functions配置文件 cp $(location //config:host.json) $(@D)/$(OUTS)/ cp $(location //config:local.settings.json) $(@D)/$(OUTS)/ """.format(src=src_target), )
- 调用宏生成部署目录
copy_deploy_files( name = "lib2_deployment", src_target = ":lib2_deploy", dest_dir = "lib2_deploy_dir", )
- 执行构建命令
bazel build //lib2:lib2_deployment
构建完成后,bazel-bin/lib2/lib2_deploy_dir目录即为可直接部署到Azure Functions的完整结构。
内容的提问来源于stack exchange,提问作者felixnext
相关产品推荐
相关产品推荐

