如何使用注释处理器配置 Gradle 的增量构建
How to configure Gradle's incremental build with annotation processor
我想在构建过程中使用 QueryDSL 注释处理器。每次我更改任何 class 时,如何 摆脱不必要的注释处理器编译&运行? 我希望 QueryDSL 仅生成 Q-* classes如果更改了一些相关的 classes。
这总是 运行ning 注释处理器对我们的构建过程时间有负面影响,如果注释处理器必须 运行。
看起来增量构建不起作用
谢谢。
据我所知,目前这是不可能的:请参阅此 blog post - 部分 "Incremental compile with annotation processors":
...with annotation processors, Gradle does not know which files they are going to generate. Neither does it know where and based on what conditions. Therefore Grade disables the Java incremental compiler if annotation processors are in use
Gradle 的相关问题:Make incremental compile efficient in the presence of Annotation Processors #1320
博客 post 还提到了一个可能的解决方法:
It is however possible to limit the impact of this to the set of classes that really use annotation processors. In short, you can declare a different source set, with a different compile task, that will use the annotation processor, and leave the other compile tasks without any kind of annotation processing
但是,这似乎有点工作,所以我还没有使用它。
Gradle 无法知道注解处理器使用哪些文件 作为输入 因此每次监视目录中的某些内容发生更改 (src) 时,它都必须触发完全重新编译。
但是您可以轻松地告诉 Gradle 哪些文件应该只触发注释处理。更改为其他文件 不会触发注释处理器的使用 并且 gradle 可以使用其所有功能(例如增量构建)。
我还添加了 "force" 任务 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。
希望我的观点很清楚。
我想在构建过程中使用 QueryDSL 注释处理器。每次我更改任何 class 时,如何 摆脱不必要的注释处理器编译&运行? 我希望 QueryDSL 仅生成 Q-* classes如果更改了一些相关的 classes。
这总是 运行ning 注释处理器对我们的构建过程时间有负面影响,如果注释处理器必须 运行。
看起来增量构建不起作用谢谢。
据我所知,目前这是不可能的:请参阅此 blog post - 部分 "Incremental compile with annotation processors":
...with annotation processors, Gradle does not know which files they are going to generate. Neither does it know where and based on what conditions. Therefore Grade disables the Java incremental compiler if annotation processors are in use
Gradle 的相关问题:Make incremental compile efficient in the presence of Annotation Processors #1320
博客 post 还提到了一个可能的解决方法:
It is however possible to limit the impact of this to the set of classes that really use annotation processors. In short, you can declare a different source set, with a different compile task, that will use the annotation processor, and leave the other compile tasks without any kind of annotation processing
但是,这似乎有点工作,所以我还没有使用它。
Gradle 无法知道注解处理器使用哪些文件 作为输入 因此每次监视目录中的某些内容发生更改 (src) 时,它都必须触发完全重新编译。
但是您可以轻松地告诉 Gradle 哪些文件应该只触发注释处理。更改为其他文件 不会触发注释处理器的使用 并且 gradle 可以使用其所有功能(例如增量构建)。
我还添加了 "force" 任务 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。
希望我的观点很清楚。