2017-08-01 22 views
0

我有一个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/。如何编写一个能够压缩目标的所有运行时依赖关系的规则?我希望这条规则尽可能通用,我的意思是它应该处理压缩任何目标的运行时,即使目标具有复杂的依赖关系。

回答

3

genrulesrcs属性不会为二进制文件构建runfiles树。如果Bazel希望在主机系统上运行该二进制文件作为构建或测试的一部分,它将只构建一个runfiles树。相反,我们可以使用genruletools属性,该属性旨在用作将作为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,它可能无法工作。

+0

这很好,我在一个使用与部署环境相同的体系结构的CI管道中使用它。谢谢。 – Arthelais