使用Gradle执行命令?

时间:2014-11-23 17:13:19

标签: gradle build.gradle

我正在尝试使用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''

你能告诉我每种方法在哪里出错吗?

如果上述两种方式都不是正确的执行方式,那么请以示例的方式指明实现方式。

2 个答案:

答案 0 :(得分:21)

我相信你正在寻找这个:

task stopServer(dependsOn: war, type: Exec) {
     commandLine "pkill", " -9", "tomcat"
}

主要区别非常微妙 - 我刚刚删除了两个字符。 <<已从任务定义中消失。另一个区别是commandLine期望可执行文件与其参数分开传递。

我删除了<<,因为gradle中有一个重要的想法:the build lifecycle。有配置和执行阶段(这不是全部,但足以解释这一点)。

<<就像在说doLast一样 - 它会将您传递的闭包添加到此任务的操作结束(执行阶段)。所以这意味着在这里尝试执行命令就像普通(毕竟它是一个Exec对象),只有然后,一旦执行,它会调用你的块 - 阻止设置commandLine。因此,当它正在执行时,execCommand确实为空,并且直到您的块运行。这是你问题的核心。

没有<<(也称为左移),同一个块在配置阶段运行。因此exec命令在运行之前就已经设置好了,它可以工作。

答案 1 :(得分:3)

如果您希望从命令行运行但不希望在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'
}
相关问题