用参数包装py_binary

时间:2017-04-12 14:04:44

标签: bazel

//foo有一个py_binary

py_binary(
  name = "foo",
  srcs = ["foo.py"],
  visibility = ["//visibility:public"],
)

foo.py接受2个位置命令行参数。

现在在//bar包中,我想创建一个"别名"用于使用某些参数调用foo二进制文件。

以下遗憾无效:

py_binary(
  name = "bar",
  deps = [
    "//foo:foo",
  ],
  args = [
    "$(location first_file)",
    "$(location second_file)",
  ],
  data = [
    ":first_file",
    ":second_file",
  ],
)

问题是py_binary想要当前包中的主src文件。还有其他或更好的方法可以使这项工作吗?

2 个答案:

答案 0 :(得分:1)

我通过创建//foo:bind.bzl

解决了这个问题
def bind_foo(name, **kwargs):
    copy_file(
        name = "%s.py.create" % name,
        src = "//foo:foo.py",
        dst = "%s.py" % name, # Appease local main search
    ) # Why is no copy_file action provided by Skylark???

    py_binary(
        name = name,
        srcs = [
            "%s.py" % name,
        ],
        deps = [
            "//foo:foo",
        ],
        **kwargs
    )

我可以简单地使用//bar中的内容:

load("//foo:bind.bzl", "bind_foo")

bind_foo(
    name = "bar",
    args = [
        "$(location first_file)",
        "$(location second_file)",
    ],
    data = [
        ":first_file",
        ":second_file",
    ],
)

这也使整个事情更具表现力,所以yay:)

答案 1 :(得分:0)

您必须使用main属性,例如:

py_binary(
  name = "bar",
  main = "//foo:foo.py",
  srcs = ["//foo:foo"],
...

请注意,这意味着您必须在foo / BUILD中公开foo.py:

exports_files(["foo.py"])