Gradle + apt:在编译

时间:2017-11-16 20:01:21

标签: java intellij-idea gradle groovy build.gradle

我使用gradle-apt-plugin来配置注释处理。它通过配置JavaCompile(和GroovyCompile)任务来实现。因此,注释处理作为每个编译任务的一部分发生。

由于几个原因,我希望注释处理在单独的任务中发生(每个源集一个),并使编译任务依赖于它们。例如:generateSourcesgenerateTestSourcesgenerateApiSources

原理

我希望看到生成和编译作为单独的构建阶段的一些好处,主要是为了减少二次编译器错误。即如果构建在注释处理期间提前失败,那么会很好,而不会报告来自常规源的所有其他错误,这些错误依赖于由于错误而未生成的生成类。

例如:经常发生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这样的东西确实有效。为什么不呢?

问题

这是正确的方法,如果是这样,我该如何复制编译任务?我特别感兴趣的是确保增量构建仍然有效。

如果不是正确的方法,我可以尝试一下吗?

0 个答案:

没有答案