压缩Bazel生成的文件进行部署
问题描述:
我有一个Bazel项目,其中包含根目录中的python/
文件夹。此文件夹包含两个文件:压缩Bazel生成的文件进行部署
# 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 [email protected] $(locations //python:foo)",
)
但是,生成的ZIP不包括foo.runfiles/
。如何编写一个能够压缩目标的所有运行时依赖关系的规则?我希望这条规则尽可能通用,我的意思是它应该处理压缩任何目标的运行时,即使目标具有复杂的依赖关系。
答
genrule
的srcs
属性不会为二进制文件构建runfiles树。如果Bazel希望在主机系统上运行该二进制文件作为构建或测试的一部分,它将只构建一个runfiles树。相反,我们可以使用genrule
的tools
属性,该属性旨在用作将作为genrule一部分运行的二进制文件。以下genrule
将压缩python二进制文件及其运行文件树。
genrule(
name = "zip_foo",
tools = ["//python:foo"],
outs = ["foo.zip"],
cmd = "zip -r [email protected] $(location //python:foo)*",
)
免责声明:这将建立在 “主机配置” //python:foo
。这意味着任何本地代码都将为您正在运行的机器的体系结构构建。因此,如果您在Linux上构建foo.zip
并将其复制到Mac,它可能无法工作。
这很好,我在一个使用与部署环境相同的体系结构的CI管道中使用它。谢谢。 – Arthelais