You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Bazel中指定含$符号的文件名作为输入文件?

在Bazel中指定含$符号的文件名作为输入

完全可以,问题出在你对$符号的转义时机和方式上,正确处理方式如下:

核心要点

  • filegroup的srcs列表无需转义$:直接写原始文件名(比如"ContextFinder$5.class")即可。Bazel解析文件路径时不会把$当成Make变量语法,之前用$$转义导致Bazel去寻找带两个$的文件(如ContextFinder$$1.class),但实际你的文件是单个$的,自然找不到。
  • genrule的cmd属性需通过Bazel变量引用文件:错误提示里的'$1' syntax is not supported是因为在genrule的cmd中直接写带$的文件名时,shell会把$1当成位置参数解析。解决办法是用Bazel提供的$(locations)或$(location)变量获取文件路径,Bazel会自动处理文件名中的特殊字符,无需手动转义。

正确示例

package(<redacted>)

filegroup(
    name = "class_overrides",
    srcs = [
        "ContextFinder$1.class",
        "ContextFinder$2.class",
        "ContextFinder$3.class",
        "ContextFinder$4.class",
        "ContextFinder$5.class",
        "ContextFinder.class"
    ],
)

# 以genrule为例,正确引用带$的文件
genrule(
    name = "process_classes",
    srcs = [":class_overrides"],
    outs = ["processed_output.txt"],
    cmd = "cat $(locations :class_overrides) > $@",
)

补充说明

  • $(locations :target)会展开为该目标下所有文件的完整路径,自动处理特殊字符;如果是单个文件,用$(location :file_target)即可。
  • 不要在srcs里转义$,也不要在cmd里直接写带$的文件名,让Bazel通过变量传递文件路径是最稳妥的方式。

内容的提问来源于stack exchange,提问作者merlin2011

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:20:59