我正在尝试使用gradle执行以下任务的命令:
task stopServer(dependsOn: war, type: Exec) << {
commandLine 'pkill -9 tomcat'
}
当我运行它时,我收到以下错误:
* What went wrong:
Execution failed for task ':stopServer'.
> execCommand == null!
当我的任务是这样的:
task stopServer(dependsOn: war) << {
exec {
commandLine 'pkill -9 tomcat'
}
}
我收到此错误:
* What went wrong:
Execution failed for task ':stopServer'.
> A problem occurred starting process 'command 'pkill -9 tomcat''
你能告诉我在这些方法中我哪里出错吗?
如果上述两种方法都不是正确的执行方式,那么请用一个例子来说明这样做的方法。
我相信你在寻找这个:
task stopServer(dependsOn: war, type: Exec) {
commandLine "pkill", " -9", "tomcat"
}
主要区别非常微妙 - 我刚刚删除了两个字符。 <<
从任务定义中消失了。另一个区别是commandLine
期望可执行文件与其参数分开传递。
我删除了<<
,因为gradle有一个重要的想法:the build lifecycle。有配置和执行阶段(这不是全部,但足以解释这一点)。
<<
就像是在说doLast
- 它会为你完成这个任务的动作(执行阶段)结束。所以这意味着在这里,它将尝试执行命令,就像正常一样(毕竟它是一个Exec
对象),只有这样,一旦它被执行,它将调用你的块 - 块设置commandLine
。因此,当它正在执行时,execCommand
确实为空,并且直到你的块运行。这是你问题的核心。
如果没有<<
(也称为左移),则在配置阶段运行相同的块。因此exec命令在运行之前就会被设置,并且它可以工作。
如果您有一个独立的exec任务要从命令行运行但又不想在Android Studio中作为构建的一部分运行,那么这是另一个适用于同一错误的解决方案。
这将始终运行“myExecTask”的配置,但只有在通过“gradle myExecTask”显式运行时才会执行doMyExecTask
/**
* Actually run exec task in doLast phase
*/
task doMyExecTask << {
def hasProperties = project.hasProperty('SOME_PROPERTY');
if (hasProperties) {
myExecTask.commandLine "echo", "$SOME_PROPERTY"
} else {
println "ERROR: Unable to run task. Missing properties."
}
}
/**
* Configure exec task, this always runs
*/
task myExecTask(type: Exec) {
dependsOn doMyExecTask
workingDir 'path/to/executable'
}