簡體   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