问题描述
我的目的是通过在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
运行由commandLine
定义的命令。在您的SaveTask
任务类型中,定义了另一个@TaskAction
,但它将在原始@TaskAction
之后之后运行。这就是为什么commandLine
对于原始@TaskAction
仍然为空/空的原因。
如果您仍想创建自定义任务类型,例如因为您要定义一个将由多个任务使用的配置接口,所以请使用doFirst
闭包来定义commandLine
,因为它将在任何任务操作之前执行:
class SaveTask extends Exec {
String image
SaveTask() {
doFirst {
commandLine "bash","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","someimage:latest | gzip > someimage.tar.gz"
}
}
task saveImageA(type: SaveTask)