比方说,我有一个规则:如何将当前工作空间名称包含在规则的默认参数值中?
blah = rule(
attrs = {
"foo": attr.string(default = "@[email protected]"),
},
)
我想要的foo
的默认值包含调用规则的工作区的名称。我怎样才能做到这一点? (注意:一个可接受的方法是在值中留下一个占位符,并在规则使用该属性时将其替换,但我无法弄清楚如何获取当前工作空间。最接近的我可以找到的是ctx.label.workspace_root
,但对于“主”工作空间是空的,例如external/foo
用于其他事情。)
ctx.workspace_name
不能给出正确的答案。例如,如果我print("'%s' -> '%s'", (ctx.label.workspace_root, ctx.workspace_name))
,我得到如下结果:
'externals/foo' -> 'main'
'externals/bar' -> 'main'
......这是错误的;那些应该是'foo'和'bar',而不是'main'('main'是我的主/根工作区)。请注意,来自这些上下文的标签例如是'@foo //:foo',所以Bazel显然知道正确的工作区名称。
不,这会在主工作区以外给出错误答案。 (查看更新后的问题。) – Matthew
哦,好点。它实际上应该在将来给出正确的结果(一旦https://github.com/bazelbuild/bazel/issues/1262在),但在那之前你会被卡住的黑客脚本(抱歉)。 – kristina