Bazel 用参数包装py_二进制文件

Bazel 用参数包装py_二进制文件,bazel,Bazel,包//foo具有py二进制文件: py_binary( name = "foo", srcs = ["foo.py"], visibility = ["//visibility:public"], ) foo.py接受2个位置命令行参数 现在,在一个包//bar中,我想创建一个“别名”,用于调用带有特定参数的foo二进制文件 遗憾的是,以下措施不起作用: py_binary( name = "bar", deps = [ "//foo:foo", ], ar

//foo
具有
py二进制文件

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文件。是否有其他或更好的方法来实现此功能?

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

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",
    ],
)

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

AFAIT
main
忽略所有包信息,只搜索rel目标。如果是这样,我认为这是一个bug。我尝试实现了您的解决方案。然而,bazel抱怨说“//foo:foo.py”不是//栏中可见的目标。我怀疑这取决于复制文件规则的实现。我使用了bazel skylib规则。你使用自定义规则了吗?这已经2年了。py规则已经修改过了。抱歉,目前不使用Bazel+Python。