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

标签 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。

最佳答案

您无法使用doLast来配置任务的操作,因为在执行特定操作(在本例中为zipping)之后,将在之后执行来执行该任务。使用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 })
}

关于gradle - gradle zip任务仅在配置阶段创建zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61894117/

相关文章:

android - 从build.gradle读取元数据

android - 即使我选择调试,buildType 也总是会发布

python - 使用 os.walk 压缩文件夹

python - 如何删除或替换 zip 存档中的文件?

asp.net - HostingEnvironment 类和 HttpRuntime 类有什么区别?

gradle - JFrog Artifactory不显示依赖项声明

gradle - 分类器的gradle依赖

c# - “IBM437”不是 ZipFile 读取方法支持的编码名称

ios - 如何在设备屏幕因不活动而关闭时/之前立即执行方法?

php - 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值