用参数包装 py_binary
Wrapping py_binary with arguments
包裹 //foo
有 py_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",
],
)
这也使整个事情更具表现力,所以耶:)
包裹 //foo
有 py_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.pyexports_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",
],
)
这也使整个事情更具表现力,所以耶:)