Bazel生成Python的部署文件

https://groups.google.com/forum/#!topic/bazel-discuss/42QRn8qU0eo
我们已经知道,对于:

  •  Java/Scala/Groovy
在Bazel中可以使用target_name_deploy.jar来生成部署文件
  • C++/D/Rust/Go

在Bazel中可以生成静态的二进制文件

  • Python
那么对于Python语言,bazel可以使用下面这个工程来支持生成par文件(see github.com/google/subpar)

Subpar

这个是用来在Bazel中协助生成python可执行文件的一个项目。不过并不是Google的一个官方产品。

由于这个项目也是由Bazel来维护的,所以可以直接使用git_repository()来添加到本地WORKSPACE中索引使用:

git_repository(
    name = "subpar",
    remote = "https://github.com/google/subpar",
    tag = "1.0.0",
)

然后可以在BUILD文件中添加load()以及调用par_binary()来完成target的定义:

load("@subpar//:subpar.bzl", "par_binary")
par_binary(
    name = 'foo',
    srcs = ['foo.py', 'bar.py'],
    deps = ['//baz:some_py_lib'],
    data = ['quux.dat'],
)

不过如果在已有的BUILD中已有,py_binary()而且不想注释掉的话。需要做如下修改:

py_binary(
    name = 'foo',  # 已有py_binary()的定义和命名
    srcs = ['foo.py', 'bar.py'],
    deps = ['//baz:some_py_lib'],
    data = ['quux.dat'],
)
par_binary(
    name = 'foo_deploy',  # 不能与已有的命名重复
    srcs = ['foo.py', 'bar.py'],
  main = 'foo.py',  # 默认会使用name.py作为主入口,因为之前以及加了_deploy后缀,所以需要在main里指示下
deps = ['//baz:some_py_lib'], data = ['quux.dat'], )

这样就添加完毕了。
使用的时候可以通过命令:
bazel build //package:foo.par
生成的输出在:
bazel-bin/
    package/
        foo
        foo.par
        foo.runfiles/
            ...
生成的.par文件是一个可执行的二进制文件,可以直接运行:
$ scp bazel-bin/package/foo.par my-other-machine:foo.par
$ ssh my-other-machine ./foo.par
不过这里还是不满足提交到spark上的需求(要么是带class的jar,要么是python脚本),还是要自己动手打包,不能使用这个utility



评论

此博客中的热门博文

Bazel WORKSPACE文件编写

Bazel BUILD文件的编写

Bazel的概念和技术