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

时间:2020-05-19 14:55:17

标签: gradle zip lifecycle execution

当我尝试在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。

2 个答案:

答案 0 :(得分:0)

尝试使用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块中将存档名称更改为当前时间来尝试自己,存档名称实际上与执行时间匹配,而不与配置时间匹配。 / p>

答案 1 :(得分:0)

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

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

我想您使用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 })
}
相关问题