Bazel 中的 $location 扩展

$location expansion in Bazel

我想为 jvm_flags 属性向 rules_scala 添加 $(location) 扩展,我在 data 属性中设置了依赖关系,但失败了:
label '//src/java/com/google/devtools/build/lib:worker' in $(location) expression is not a declared prerequisite of this rule.
我在我的目标中定义了对 data 属性中该标签的依赖关系,如下所示:

scala_specs2_junit_test(
    ...
    data = ["//src/java/com/google/devtools/build/lib:worker"],
    jvm_flags = ["-XX:HeapDumpPath=/some/custom/path", "-Dlocation.expanded=$(location //src/java/com/google/devtools/build/lib:worker)"],
)

我看到当我将 ctx.attr.data 添加到 expand_location 调用扩展时有效,但我不确定为什么这不是 hack。 data真的是特例吗?

    location_expanded_jvm_flags = []
    for jvm_flag in jvm_flags:
        location_expanded_jvm_flags.append(ctx.expand_location(jvm_flag, ctx.attr.data))

也尝试查看 java_* 规则源以了解其工作原理(因为 $(location) 扩展那里支持 data 属性)但找不到相关位置。

完整目标:

scala_specs2_junit_test(
    name = "Specs2Tests",
    srcs = ["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"],
    deps = [":JUnitCompileTimeDep"],
    size = "small",
    suffixes = ["Test"],
    data = ["//src/java/com/google/devtools/build/lib:worker"],
    jvm_flags = ["-XX:HeapDumpPath=/some/custom/path", "-Dlocation.expanded=$(location //src/java/com/google/devtools/build/lib:worker)"],
)

你做得对。

我查看了源代码,你是对的:srcsdepstools(如果在规则中定义)被添加到标签集expand_locations 明白了。 data 仅当 LocationExpander 是使用 allowDataAttributeEntriesInLabel=true 创建时才添加,但事实并非如此。这就是为什么你必须将它添加到 expand_locations(targets).