python - 压缩 Bazel 生成的文件以进行部署

标签 python c++ build bazel

我有一个 Bazel 项目,根目录中包含一个 python/ 文件夹。该文件夹包含两个文件:

# BUILD
py_binary(
    name = "foo",
    srcs = ["foo.py"],
    deps = ["//cc:bar"],
)

# foo.py
import cc.bar as bar

# This is a SWIG-wrapped C++ function that prints "hello world"
print(bar.hello_world())

同样位于根目录中的 cc/ 文件夹包含(除其他外)以下规则:

# Expose the shared object library to Python.
py_library(
    name = "bar",
    srcs = [":bar_swig.py"], # Generated by SWIG.
    data = [":_bar.so"], # Generated by SWIG.
    visibility = ["//python:__pkg__"],
)

运行bazel build//python:foo生成bazel-bin/python/foo.runfiles/bazel-bin/python/foo >。我想在 Bazel 中编写一条规则来收集此目录和二进制文件并将它们压缩到 foo.zip 中。

这是我想到的:

genrule(
    name = "zip_foo",
    srcs = ["//python:foo"],
    outs = ["foo.zip"],
    cmd = "zip $@ $(locations //python:foo)",
)

但是,生成的 zip 不包含 foo.runfiles/。如何编写压缩目标的所有运行时依赖项的规则?我希望这个规则尽可能通用,我的意思是它应该处理压缩任何目标的运行时,即使目标具有复杂的依赖关系。

最佳答案

genrule 的 srcs 属性不会为二进制文件构建运行文件树。 Bazel 仅当希望在主机系统上运行该二进制文件作为构建或测试的一部分时,才会构建运行文件树。相反,我们可以使用 genruletools 属性,该属性适用于将作为 genrule 的一部分运行的二进制文件。以下 genrule 将压缩 python 二进制文件及其运行文件树。

genrule(
    name = "zip_foo",
    tools = ["//python:foo"],
    outs = ["foo.zip"],
    cmd = "zip -r $@ $(location //python:foo)*",
)

免责声明:这将在“主机配置”中构建 //python:foo。这意味着任何 native 代码都将针对您运行 bazel 的机器的体系结构构建。因此,如果您在 Linux 上构建 foo.zip 并将其复制到 Mac 上,它可能无法工作。

关于python - 压缩 Bazel 生成的文件以进行部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45438225/

相关文章:

c++ - FBString 的小字符串优化是否依赖未定义行为?

c++ - 在类中为拥有的数组创建 get 函数

cocoa - 我可以在发布版本中保留日志记录吗?

testing - 在 Jenkins 项目中显示自定义页面/选项卡

python - 在Supervisord中通过sh脚本启动程序

python - Python学习过程图

c++ - 为什么 ostringstream 比 ofstream 快

Go 服务的部署策略?

python - 如何在多核机器上加速 python 单元测试?

python - 使用 Opennoise 在 Pymunk 中创建地形(形状)