使用Gradle执行命令?

问题描述 投票:14回答:2

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

你能告诉我在这些方法中我哪里出错吗?

如果上述两种方法都不是正确的执行方式,那么请用一个例子来说明这样做的方法。

gradle build.gradle
2个回答
22
投票

我相信你在寻找这个:

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

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

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

<<就像是在说doLast - 它会为你完成这个任务的动作(执行阶段)结束。所以这意味着在这里,它将尝试执行命令,就像正常一样(毕竟它是一个Exec对象),只有这样,一旦它被执行,它将调用你的块 - 块设置commandLine。因此,当它正在执行时,execCommand确实为空,并且直到你的块运行。这是你问题的核心。

如果没有<<(也称为左移),则在配置阶段运行相同的块。因此exec命令在运行之前就会被设置,并且它可以工作。


3
投票

如果您有一个独立的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'
}
© www.soinside.com 2019 - 2024. All rights reserved.