如何在Bazel中访问bazel-bin内的生成文件并封装为kt_jvm_library
Bazel 中封装生成的 Kotlin 文件到 kt_jvm_library 的方案
你直接引用 bazel-bin 路径的配置不生效,核心原因是 Bazel 依赖沙箱构建和严格的依赖追踪机制,不能直接引用输出目录的文件,必须通过构建目标的依赖关系来传递生成的文件,这和 Gradle 用 sourceSets 指定扫描目录的逻辑不一样。
下面是具体的实现步骤:
1. 把生成 Kotlin 文件的逻辑包装成 Bazel 可追踪的构建目标
不管你用的是自定义宏还是脚本,都要把它封装成 Bazel 能识别的规则(比如 genrule 或自定义规则),让 Bazel 管理生成文件的生命周期。
生成单个 Kotlin 文件的示例
genrule( name = "generate-hello-kt", # 替换成你实际的生成命令,$@ 代表输出文件的路径 cmd = "your-generator-macro > $@", # 指定输出的 Kotlin 文件,路径要和生成位置对应 outs = ["src/main/java/com/example/Hello.kt"], )
生成整个目录 Kotlin 文件的示例
genrule( name = "generate-all-kt", # 让生成命令把文件输出到指定目录 cmd = "your-generator-macro --output-dir $(@D)/generated", # 把整个 generated 目录标记为输出 outs = ["generated"], # 允许输出到绑定目录,Bazel 会自动处理路径映射 output_to_bindir = True, )
2. 在 kt_jvm_library 中依赖生成目标
直接把生成规则的标签加到 srcs 里,Bazel 会自动先执行生成步骤,再把生成的文件作为输入传给 kt_jvm_library。
单个文件的引用方式
kt_jvm_library( name = "generated-stuff", # 引用生成目标的标签,而非直接写 bazel-bin 路径 srcs = [":generate-hello-kt"], deps = [ # 你的依赖项 ], )
多文件目录的引用方式
先通过 filegroup 收集所有生成的 Kotlin 文件,再让 kt_jvm_library 依赖这个分组:
filegroup( name = "generated-kt-files", # 匹配 generated 目录下所有 .kt 文件 srcs = glob(["generated/**/*.kt"]), ) kt_jvm_library( name = "generated-stuff", srcs = [":generated-kt-files"], deps = [ # 你的依赖项 ], )
核心逻辑区别
Gradle 的 sourceSets 是让构建工具主动扫描指定目录的源码,而 Bazel 要求所有输入文件必须通过依赖关系明确声明——这种设计能保证构建的可重复性,避免因目录文件意外变化导致的构建不一致问题。
内容的提问来源于stack exchange,提问作者90abyss
相关产品推荐
相关产品推荐

