Gradle 防止仅在清单更改时执行jar任务

Gradle 防止仅在清单更改时执行jar任务,gradle,Gradle,我用的是Gradle2.12。在我的构建文件中,我配置每个模块应该在清单中放置额外的信息。我是这样做的: tasks.withType(Jar) { manifest { attributes( 'Build-By': buildBy, 'Build-JDK': buildJdk, 'Build-Time-ISO-8601': buildTime_ISO_8601,

我用的是Gradle2.12。在我的构建文件中,我配置每个模块应该在清单中放置额外的信息。我是这样做的:

tasks.withType(Jar) {
    manifest {
        attributes(
                'Build-By': buildBy,
                'Build-JDK': buildJdk,
                'Build-Time-ISO-8601': buildTime_ISO_8601,
                'Build-SCM-Info': buildScmInfo
        )
    }
tasks.withType(Jar) {  
  doFirst {
     manifest {
      attributes \
        'Build-By': buildBy,
        'Build-JDK': buildJdk,
        'Build-Time-ISO-8601': buildTime_ISO_8601,
        'Build-SCM-Info': buildScmInfo
     }
  }
}
变量在构建开始时初始化一次

这很好,但有一个缺点:它会导致jar任务始终被调用,因为它发现其“输入”已更改,并且依赖于jar的所有模块都被重新编译,这是不必要的。例如,对于项目结构:

A、 B取决于A,C取决于A

当第二次执行构建时,没有任何代码更改,不会编译A,但会生成一个新的jar,因此,B和C需要在其依赖关系更改时重新编译


如何解决这一问题?

您可以尝试将清单规范移出配置阶段(通过在
doFirst
闭包中声明),以便在默认清单文件中查找更改,该文件尚未更改。像这样的事情:

tasks.withType(Jar) {
    manifest {
        attributes(
                'Build-By': buildBy,
                'Build-JDK': buildJdk,
                'Build-Time-ISO-8601': buildTime_ISO_8601,
                'Build-SCM-Info': buildScmInfo
        )
    }
tasks.withType(Jar) {  
  doFirst {
     manifest {
      attributes \
        'Build-By': buildBy,
        'Build-JDK': buildJdk,
        'Build-Time-ISO-8601': buildTime_ISO_8601,
        'Build-SCM-Info': buildScmInfo
     }
  }
}
在这种情况下,只有在执行jar任务时才应该更改清单内容