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。