繁体   English   中英

如何使用注释处理器配置Gradle的增量构建

[英]How to configure Gradle's incremental build with annotation processor

我想使用QueryDSL注释处理器作为构建过程的一部分。 每次更改任何类时,如何摆脱不必要的注释处理器编译和运行? 我希望QueryDSL仅在某些相关类被更改时才生成Q- *类。

这个始终运行的注释处理器对我们的构建过程时间有负面影响,如果注释处理器必须运行,看起来增量构建不起作用。

谢谢。

Gradle无法知道注释处理器使用哪些文件作为输入,因此每次监视目录中的某些内容发生更改(src)时都必须触发完全重新编译。

但是,您可以轻松告诉Gradle哪些文件只应触发注释处理。 更改为其他文件不会触发注释处理器的使用,并且gradle可以使用其所有功能(例如增量构建)。

我还添加了“强制”任务buildWithAP调用注释处理器,而不管提示(启发式)函数结果如何。

我的解决方案

ext.isTask = { name -> return project.gradle.startParameter.taskNames.contains(name) }

/**
 * Heuristic function allowing to build process guess if annotation processor run is necessary
 * Annotation processors will not be called during build task if this function returns FALSE
 */
ext.isApInvalidated = { -> return hasAnyFileRelatedToApChanged() }

dependencies {
  if (isTask("buildWithAP") || isApInvalidated()) {
    println "Going to run annotation processors ..."
    apt "com.querydsl:querydsl-apt:$queryDslVersion:jpa"
  ...
  } else {
    // just add generated classes to the classpath
    // must be in else branch or multiple AP calls will collide!
  sourceSets.main.java.srcDirs += projectDir.absolutePath + "/build/generated/apt"
  } 

}

task buildWithAP (dependsOn: build) {}

您可以使用任何所需的注释处理器,例如您自己的注释处理器,而不仅仅是QueryDSL。

希望我的观点清楚。

AFAIK目前还不可能:请参阅此博客文章 - “使用注释处理器进行增量编译”部分

...使用注释处理器,Gradle不知道它们将生成哪些文件。 它也不知道在哪里以及基于什么条件。 因此,如果正在使用注释处理器,则Grade会禁用Java增量编译器

Gradle的相关问题: 在存在注释处理器的情况下使增量编译有效#1320

博客文章还提到了一种可能的解决方法:

但是,可以将其影响限制为真正使用注释处理器的类集。 简而言之,您可以使用注释处理器声明具有不同编译任务的不同源集,并保留其他编译任务,而无需任何类型的注释处理

然而,这似乎是相当一些工作,所以我还没有使用它。

问题似乎已经解决了! https://issuetracker.google.com/issues/37079915

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM