由於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中有更好的方法嗎?
只要注意到我可以將項目的數量傳遞給規則,所以我們不需要檢查所有生成的插槽。 – abergmeier
請注意,這隻適用於一定數量的鍵:請參閱https://github.com/bazelbuild/bazel/issues/3098 – abergmeier