Da Bazel bietet keine Möglichkeit zum Zuordnen von Beschriftungen zu Strings, frage ich mich, wie man dies über Skylark umgehen.Emulieren Zeichenfolge zu Etikett dict
Nach meiner teilweise schrecklichen "Workaround".
Zuerst werden die Statik:
_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()
Und bei der Umsetzung:
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
]
Und dann die Regel:
_foo = rule(
implementation = _impl,
attrs = dict({
"srcs": attr.label_list(allow_files = True, mandatory = True),
}.items() + _LABEL_MAPPING.items()),
, die wie eingewickelt werden muss:
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())
)
Gibt es einen besseren Weg in Skylark?
Gerade bemerkt, dass ich die Anzahl der Elemente an die Regel übergeben konnte, so müssen wir nicht alle generierten Slots überprüfen. – abergmeier
Beachten Sie, dass dies nur für eine bestimmte Anzahl von Schlüsseln funktioniert: Siehe https://github.com/bazelbuild/bazel/issues/3098 – abergmeier