我使用gradle-apt-plugin来配置注释处理。它通过配置JavaCompile(和GroovyCompile)任务来实现。因此,注释处理作为每个编译任务的一部分发生。
由于几个原因,我希望注释处理在单独的任务中发生(每个源集一个),并使编译任务依赖于它们。例如:generateSources
,generateTestSources
,generateApiSources
等
我希望看到生成和编译作为单独的构建阶段的一些好处,主要是为了减少二次编译器错误。即如果构建在注释处理期间提前失败,那么会很好,而不会报告来自常规源的所有其他错误,这些错误依赖于由于错误而未生成的生成类。
例如:经常发生Dagger失败并出现错误,这会导致Immutables不生成类,这会导致一大堆二次错误消失。我希望编译任务永远不会执行因为generateSources失败了。
但我也希望对生成的源进行格式化,以便在处理器出现明显问题(或我使用它)时更容易调试,并在生成的源上应用许可证头。
到目前为止,我已经能够通过将以下代码添加到我的buildscript并传递procOnly属性来生成它而不进行编译:
compileJava.doFirst {
if (project.hasProperty("procOnly")) {
logger.lifecycle("Option procOnly detected - Processing annotations only, without compilation (-proc:only)")
options.compilerArgs << '-proc:only'
}
}
Invoking tasks from another tasks is deprecated,现在我正在考虑复制每个JavaCompile任务,然后配置常规编译任务以使用-proc:none
参数和重复任务(即生成任务) )使用-proc:only
参数。
This answer by Peter Niederwieser显示了如何做到这一点。 properties of JavaCompile
都是可设置的,这是我认为应该起作用的:
task generateSources(type: JavaCompile) {
// ==== Copy properties from corresponding compile task =====
classPath = compileJava.classPath
destinationDir = compileJava.destinationDir
excludes = compileJava.excludes
includes = compileJava.includes
options = compileJava.options
source = compileJava.source
sourceCompatibility = compileJava.sourceCompatibility
targetCompatibility = compileJava.targetCompatibility
toolChain = compileJava.toolChain
// ==== Configure this compile task to process only =====
options.compilerArgs << '-proc:only'
// ==== Configure the main compile task to not process at all =====
compileJava.options.compilerArgs << '-proc:none'
}
project.afterEvaluate {
// ==== Ensure sources are generated before compiling =====
compileJava.dependsOn("generateSources")
}
但是,构建失败:Error:(300, 0) Could not get unknown property 'classPath' for task ':compileJava' of type org.gradle.api.tasks.compile.JavaCompile.
我对Gradle和Groovy的经验在这一点上仍然有限,但像sourceSets.main.output.generatedSourcesDir
这样的东西确实有效。为什么不呢?
这是正确的方法,如果是这样,我该如何复制编译任务?我特别感兴趣的是确保增量构建仍然有效。
如果不是正确的方法,我可以尝试一下吗?