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

标签 gradle groovy build.gradle devops gradlew

我的意图是运行 docker save通过在 Gradle 中创建自定义任务来命令:
以下是我的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运行 commandLine 定义的命令.在您的 SaveTask任务类型,另一个 @TaskAction已定义,但它将运行 之后 原创 @TaskAction .这就是 commandLine 的原因。原始 @TaskAction 仍然为空/空.
如果您仍想创建自定义任务类型,例如因为你想定义一个供多个任务使用的配置接口(interface),所以使用 doFirst闭包来定义 commandLine , 因为它将被执行 之前 任何任务 Action :
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'
}

关于Gradle 自定义任务扩展 Exec 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63631120/

相关文章:

android-studio - 新的字符串(字节)在gradle中不起作用

validation - Groovy/Grails : How are constraints implemented?

gradle - 在 Gradle 构建中确定 JVM 供应商

android - "Program type already present"是什么意思?

Android studio gradle 重复类错误

groovy - 允许在 Jenkins/Hudson 处于关闭模式时运行一些作业

grails - 在GSP中导入和使用Groovy代码

android - 所有库必须使用相同的版本

java - Android库模块中的依赖

gradle - 无法实例化接口(interface) 'ElasticsearchClient'