Bazel生成Python部署文件

我们已经知道,对于「Java/Scala/Groovy」在Bazel中可以使用target_name_deploy.jar来生成部署文件。对于「C++/D/Rust/Go」在Bazel中可以生成静态的二进制文件。

那么对于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

转载需保留链接来源:VCBeta.CN » Bazel生成Python部署文件

赞 (0)