Gradle 能否以不会不必要地触及输出文件的方式生成 POM?

Can Gradle generate a POM in such a way that it doesn't unnecessarily touch the output file?

我们正在创建一个 POM 文件,如下所示:

task createPom {
   doLast {
      pom {
         project {
            groupId project.group
            artifactId project.name
            version project.ext.pomVersion
         }
      }.writeTo("${buildDir}/pom.xml")
   }
}

这个 writeTo 即使没有发生任何变化也会急切地写入文件,这会导致 jar 发生变化,因此以后构建中的昂贵任务(索引、签名、构建安装程序)都必须 运行 还有。

我想过写入一个临时文件并以某种方式区分这两个文件,但似乎我必须为此编写很多样板文件,所以我想知道是否有合适的方法去做吧。

您需要做的是配置任务的inputs and outputs,用于确定您的任务是否是最新的。在这里,应该如何做:

apply plugin: 'maven'

ext {
  pomVersion = '3.1.4.5'
}

group = 'lolgroup'

task createPom {
  outputs.file "${buildDir}/pom.xml"
  inputs.property('group', project.group)
  inputs.property('name', project.name)
  inputs.property('pomVersion', project.ext.pomVersion)

  doLast {
    pom {
      project {
        groupId inputs.properties['group']
        artifactId inputs.properties['name']
        version inputs.properties['pomVersion']
      }
    }.writeTo("${buildDir}/pom.xml")
  }
}

Here 你可以找到一个演示。