在我的基于Java的Bazel项目中,我使用了用Java编写的代码生成器。生成器是根项目的一部分,也用于子项目。
我想要实现的是包含根项目的输出(.jar文件)作为子项目中代码生成的依赖项,以授予代码生成器对根项目的所有编译文件的访问权限(通过classpath)。 Bazel有可能吗?
我看到的是,子项目中密钥生成的类路径只包含代码生成器二进制文件的依赖项(//父代:下面脚本中的SettingsGenerator)。
在我的自定义规则中,我基本上像这样调用代码生成器:
def _generate_settings(ctx):
...
ctx.actions.run(
inputs = [ctx.file._src] + [ctx.files.deps],
outputs = [keys, settings, loader],
mnemonic = "GenKeysAndSettings",
arguments = [args],
executable = ctx.executable._tool,
)
return [DefaultInfo(
files=depset([keys, settings, loader]),
runfiles=ctx.runfiles(files=ctx.files.deps)
)]
gen_settings = rule(
implementation = _generate_settings,
attrs = {
"lang": attr.string(),
"deps": attr.label_list(
allow_files = True
),
"_tool": attr.label(
cfg = "host",
executable = True,
default = Label("//parent:SettingsGenerator"),
),
"_src": attr.label(
single_file = True,
default = Label("//parent:Name")
),
}
)
父项目BUILD:
load("//parent:settings.bzl", "gen_settings")
gen_settings(
name = "GenerateSettings",
lang = ""
)
java_library(
name = "parent",
srcs = glob(["src/main/java/**/*.java"]) + [
":GenerateSettings",
],
...
)
java_binary(
name = "SettingsGenerator",
srcs = glob(["src/main/java/**/SettingsGenerator.java"]),
main_class = "my.company.SettingsGenerator",
...
)
儿童项目BUILD:
gen_settings(
name = "GenerateSettings",
lang = "Java",
deps = ["//parent"]
)
...
我的解决方法是将.jar文件作为输入包含在内,并在生成器中使用自定义类加载器。但是如果我可以直接从Bazel控制类路径那就太好了。
任何帮助将不胜感激。谢谢。