gradle zip 任务仅在配置阶段创建 zip

gradle zip task only creates zip in configuration phase

当我尝试在 Zip 类型的 gradle 任务的执行阶段创建 zip 文件时,没有创建 zip 文件。 如果我在配置阶段执行相同的操作(省略 doLast 语句),则可以毫无问题地创建 zip 文件。 由于输出日志中显示了 println 语句,因此调用了 doLast 块。

之所以需要在执行阶段生成zip,是因为需要压缩的文件是编译执行后的结果。 我也尝试用 jar 任务解决这个问题,但这给了我类似的问题。

代码如下:

    task createClassPathJar(type: Zip) {
  dependsOn("createManifest")

    from("${projectRoot}") {
        include "MANIFEST.MF"
    }
    archiveName = "dummy.jar"

    doLast {

    destinationDir(file("${projectRoot}"))

    archiveName = "zipfile.jar"

    println "executing phase createClassPathJar. archiveName: " + archiveName
  }
}

有人可以帮我吗?我正在使用 Gradle v6.4.1.

尝试使用 doFirst 而不是 doLast:

task createClassPathJar(type: Zip) {
  dependsOn("createManifest")
  from("${projectRoot}") {
    include "MANIFEST.MF"
  }
  archiveName = "dummy.jar"
  doFirst {
    destinationDir(file("${projectRoot}"))
    archiveName = "zipfile.jar"
    println "executing phase createClassPathJar. archiveName: " + archiveName
  }
}

我不知道你的情况,但我通过在 doFirst 块中将存档名称更改为当前时间来尝试自己,并且存档名称有效地匹配执行时间而不是配置时间.

您不能使用 doLast 配置任务的操作,因为它将在 特定操作(在本例中为压缩)之后执行 运行。使用 doFirst 闭包或以不依赖于其他配置的方式设置任务配置:

例如,根据您的任务 createManifest 定义其输出的正确程度,您可以直接使用它来使用“from createManifest”定义 Zip 任务内容。

我猜您使用 doLast 闭包的原因是基于变量对 destinationDir 的调用。相反,您可以只使用一个延迟计算变量的闭包:

task createManifest {
   outputs.file('path/to/MANIFEST.MF')
}

task createClassPathJar(type: Zip) {
    from createManifest
    archiveName = 'zipfile.jar'
    destinationDir = file({ "${projectRoot}" }) // or just file({ projectRoot })
}