由于Bazel没有提供将标签映射到字符串的方法,我想知道如何通过Skylark解决这个问题。
遵循我的部分可怕"解决方法"。
首先是静态:
_INDEX_COUNT = 50
def _build_label_mapping():
lmap = {}
for i in range(_INDEX_COUNT):
lmap ["map_name%s" % i] = attr.string()
lmap ["map_label%s" % i] = attr.label(allow_files = True)
return lmap
_LABEL_MAPPING = _build_label_mapping()
在实施中:
item_pairs = {}
for i in range(_INDEX_COUNT):
id = getattr(ctx.attr, "map_name%s" % i)
if not id:
continue
mapl = getattr(ctx.attr, "map_label%s" % i)
if len(mapl.files):
item_pairs[id] = list(mapl.files)[0].path
else:
item_pairs[id] = ""
if item_pairs:
arguments += [
"--map", str(item_pairs), # Pass json data
]
然后是规则:
_foo = rule(
implementation = _impl,
attrs = dict({
"srcs": attr.label_list(allow_files = True, mandatory = True),
}.items() + _LABEL_MAPPING.items()),
需要包装的内容如下:
def foo(map={}, **kwargs):
map_args = {}
# TODO: Check whether order of items is defined
for i, item in enumerate(textures.items()):
key, value = item
map_args["map_name%s" % i] = key
map_args["map_label%s" % i] = value
return _foo(
**dict(map_args.items() + kwargs.items())
)
在Skylark有更好的方法吗?
答案 0 :(得分:1)
要重新解释您的问题,您想要创建从字符串到标签的规则属性映射吗?
目前不支持此功能(请参阅list of attributes),但您可以为此提交功能请求。
你认为使用“label_keyed_string_dict”是一个合理的解决方法吗? (如果你有重复的密钥,它将无法工作)