这是一个奇怪的问题,但它不是理论上的......
我想制作一个使用
buildSrc
并在其中包含 java 项目的 Gradle 项目。该java项目定义了构建过程中使用的一些类。令人讨厌的技巧是,Gradle 项目会生成一堆输出,其中包括属于 buildSrc
本身的 Java 项目的
modified类。
有没有办法用Gradle来表达这个?
我现在想到的唯一解决方案是:连续运行整个构建脚本两次。有什么办法可以避免这种情况吗?例如,通过生成
buildSrc
的修改代码,重新编译 buildSrc
,然后生成主 Gradle 项目的附加输出?
好吧,基于 Michael Easter 的精彩示例,我可以让主级构建在其自己的任务之一上调用
GradleBuild
:
task generateNewCode() << {
println("tracer top build")
// BuildTool is a Java class defined in `buildSrc`
// ... and it has a cyclic dependency on its own
// output (eek -- but that's what I'm dealing with!)
BuildTool.generateNewCode();
}
task generateDocs(type: GradleBuild) {
buildFile='build.gradle'
tasks = ['generateDocs_Real']
}
task generateDocs_Real << {
BuildTool.outputDocumentation();
}
generateDocs.dependsOn generateNewCode
然后我可以调用
gradle generateDocs
来执行:
buildSrc
buildSrc
buidSrc
我相信Gradle文档的第59.4节可以帮助你。
使用 Gradle 1.8,我尝试“从构建运行另一个 Gradle 构建”,其中另一个 Gradle 构建是 buildSrc。
这不涉及代码生成,但可能足以提供帮助。
为了复制,我在 buildSrc 中有一个简单的 Java 项目,其 build.gradle 如下所示:
apply plugin: 'java'
build << {
println "TRACER: hello from buildSrc java build"
}
task compile2() << {
println "TRACER: hello from buildSrc compile2"
}
“build”任务通过 buildSrc 机制自动调用。目标是从根调用“compile2”。从根本上来说,build.gradle 看起来像这样:
task build1() << {
println "TRACER: top-level build1"
}
task build2(type: GradleBuild) {
buildFile = 'buildSrc/build.gradle'
tasks = ['compile2']
}
build2.dependsOn build1
在根级别,输出如下:
$ gradle build2
:buildSrc:compileJava etc etc
TRACER: hello from buildSrc java build
TRACER: top-level build1
TRACER: hello from buildSrc compile2
这表明:
类路径和代码生成很糟糕,但可能很简单。