在Bazel中,attr.label_keyed_string_dict
属性类型是一个字典,其中的键是标签,值是字符串。默认情况下,Bazel会隐式地对attr.label_keyed_string_dict
进行键排序。这意味着键的顺序将在构建过程中保持一致。
以下是一个示例的解决方法:
load("@bazel_skylib//rules:common_attrs.bzl", "attr")
def _impl(ctx):
# 定义一个attr.label_keyed_string_dict属性
my_dict = ctx.attr.my_dict
# 对字典中的键进行排序
sorted_keys = sorted(my_dict.keys())
# 打印排序后的键
for key in sorted_keys:
print(key)
my_rule = rule(
implementation = _impl,
attrs = {
"my_dict": attr.label_keyed_string_dict(),
}
)
在上面的示例中,我们首先导入了attr
模块,然后定义了一个函数_impl
,它接受一个ctx
对象作为参数。在ctx
对象中,我们可以访问attr
属性的值。
我们通过ctx.attr.my_dict
获取attr.label_keyed_string_dict
属性的值,并使用sorted()
函数对字典的键进行排序。最后,我们遍历排序后的键并打印它们。
要使用这个规则,您需要在BUILD文件中声明它,并将my_dict
属性传递给它:
load("//path/to:my_rule.bzl", "my_rule")
my_rule(
name = "my_target",
my_dict = {
":label1": "value1",
":label2": "value2",
":label3": "value3",
},
)
当构建目标时,Bazel将隐式地对my_dict
属性的键进行排序,并按顺序打印它们。
注意:在使用attr.label_keyed_string_dict
属性时,默认情况下是不支持重复的标签键的。如果需要支持重复的标签键,可以使用attr.label_keyed_string_dict(allow_duplicates=True)
。