Допустим, у меня есть правило:
blah = rule(
attrs = {
"foo": attr.string(default = "@HELP@"),
},
)
Я хочу, чтобы значение по умолчанию 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, по-видимому, знает правильное имя рабочей области.