Gradle Incremental Builds - 可以忽略最新检查中的清单?

时间:2014-01-09 21:16:58

标签: java jar gradle build.gradle

主题几乎都在问这个问题,但更详细的说明,我在build.gradle中有以下内容:

jar {
    manifest {
        attributes("Built-By": "Gradle")
        attributes("Build-Version": version)
        attributes("Main-Class": "somePackage.SomeClass")
    }
}

构建时,由于清单是自动生成的,因此它始终认为jar任务已过期,即使代码中没有任何更改。

理想情况,我希望能够检查版本是否与上一次构建相同。如果是,并且以前的任务依赖(compileJava等)都是UP-TO-DATE,我也希望jar任务报告UP-TO-DATE

如果不这样做,如果我能让jar任务完全忽略清单文件,我会非常高兴。

对于单个jar任务,这不是什么大问题,但只要一个jar报告它不是UP-TO-DATE,那么所有依赖它的任务就必须重新开始-compile,re-jar等等,这使得构建比实际需要的时间更长。并且由于我的依赖路径中的第一个jar任务报告由于明显问题它不是最新的,这意味着整个事情被迫重新编译/重新jar /重新战争/重新每隔一次耳朵/等等,我们在这里谈论几十万行代码。

无论如何,如果有人知道如何解决这个小烦恼,我会感激不尽

修改

我还有一个依赖于jar任务的zip任务:

task zip(type:Zip, dependsOn:jar) {
    from jar
    include jar.archiveName
    from '.'
    include 'run.bat'
}

运行此命令:

gradlew :myProject:zip -Pversion=1.0

我每次都会得到以下输出,即使我连续两次运行它而没有任何变化:

:myProject:compileJava UP-TO-DATE
:myProject:processResources UP-TO-DATE
:myProject:classes UP-TO-DATE
:myProject:jar
:myProject:zip

1 个答案:

答案 0 :(得分:3)

鉴于上述声明,并假设代码未更改,jar任务应该只有在version发生更改时才会过时。 (使用--info运行将告诉您哪些文件已更改。)最佳解决方案是防止这种情况,至少在开发时。 (例如,不要将version设置为new Date()。)

另请注意,过时的不是级联。只有当输入或输出发生变化时,才会重新运行下游任务。他们不关心上游任务是否是最新的。