用参数包装 py_binary

Wrapping py_binary with arguments

包裹 //foopy_binary:

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

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

现在在一个包中 //bar 我想创建一个 "alias" 用于调用带有特定参数的 foo 二进制文件。

遗憾的是,以下内容不起作用:

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

问题是py_binary 想要当前包中的主src 文件。是否有其他或更好的方法来完成这项工作?

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

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

请注意,这意味着您必须在 foo/BUILD:

中公开 foo.py
exports_files(["foo.py"])

我通过创建 //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",
    ],
)

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