压缩 Bazel 生成的文件以进行部署
Zipping Bazel-generated files for deployment
我有一个 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 只会构建一个 运行 文件树,如果它希望 运行 主机系统上的二进制文件作为构建或测试的一部分。相反,我们可以使用 genrule
的 tools
属性,它适用于将 运行 作为 genrule 一部分的二进制文件。以下 genrule
将压缩 python 二进制文件及其 运行 文件树。
genrule(
name = "zip_foo",
tools = ["//python:foo"],
outs = ["foo.zip"],
cmd = "zip -r $@ $(location //python:foo)*",
)
免责声明: 这将在 "host configuration" 中构建 //python:foo
。这意味着任何本机代码都将为您 运行 正在运行的机器的体系结构构建。因此,如果您在 Linux 上构建 foo.zip
并将其复制到 Mac,它可能无法工作。
我有一个 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 只会构建一个 运行 文件树,如果它希望 运行 主机系统上的二进制文件作为构建或测试的一部分。相反,我们可以使用 genrule
的 tools
属性,它适用于将 运行 作为 genrule 一部分的二进制文件。以下 genrule
将压缩 python 二进制文件及其 运行 文件树。
genrule(
name = "zip_foo",
tools = ["//python:foo"],
outs = ["foo.zip"],
cmd = "zip -r $@ $(location //python:foo)*",
)
免责声明: 这将在 "host configuration" 中构建 //python:foo
。这意味着任何本机代码都将为您 运行 正在运行的机器的体系结构构建。因此,如果您在 Linux 上构建 foo.zip
并将其复制到 Mac,它可能无法工作。