Gradle自定义任务扩展Exec正在抛出错误

Gradle自定义任务扩展Exec正在抛出错误,gradle,groovy,build.gradle,devops,gradlew,Gradle,Groovy,Build.gradle,Devops,Gradlew,我的目的是通过在Gradle中创建自定义任务来运行docker save命令: 下面是我的build.gradle文件: class SaveTask extends Exec { @TaskAction void saveImage() { commandLine "bash","-c","docker save someimage:latest | gzip > someimage.tar.gz"

我的目的是通过在Gradle中创建自定义任务来运行
docker save
命令:

下面是我的
build.gradle
文件:

class SaveTask extends Exec {
    @TaskAction
    void saveImage() {
        commandLine "bash","-c","docker save someimage:latest | gzip > someimage.tar.gz"
    }
}

// Create a task using the task type
task save(type: SaveTask)
当我运行任务时,它会给我以下错误:

Execution failed for task ':save'.
> execCommand == null!

有人能告诉我哪里出了问题吗?

您可能根本不需要创建自定义任务类型,只需为任务使用常规的
Exec
任务类型
save

task save(type: Exec) {
    commandLine "bash", "-c", "docker save someimage:latest | gzip > someimage.tar.gz"
}
方法失败的原因是
Exec
任务类型在内部定义了
@TaskAction
。此
@TaskAction
运行由
命令行定义的命令。在您的
SaveTask
任务类型中,定义了另一个
@TaskAction
,但它将在原始
@TaskAction
之后运行。这就是为什么原始
@TaskAction
命令行仍然为null/空的原因

如果仍要创建自定义任务类型,例如,因为要定义将由多个任务使用的配置界面,请使用
doFirst
闭包来定义
命令行,因为它将在任何任务操作之前执行

class SaveTask extends Exec {
    String image

    SaveTask() {
        doFirst {
            commandLine "bash", "-c", "docker save ${image} | gzip > someimage.tar.gz"
        }
    }
}

task saveImageA(type: SaveTask) {
    image = 'imageA:latest'
}

task saveImageB(type: SaveTask) {
    image = 'imageB:latest'
}

我修改了上面的代码如下,它的工作为我

class SaveTask extends Exec {
     

    SaveTask() {

            commandLine "bash", "-c", "someimage:latest | gzip > someimage.tar.gz"

    }
}

task saveImageA(type: SaveTask)


不走运:(!!得到相同的错误execCommand==nully您使用了第一个还是第二个代码段?第二个。我想在此基础上实现worker api。这就是选择自定义Gradle任务的原因