3

我在让 gradle 运行 grunt 时遇到了一些麻烦。我正在使用 Windows 和 cygwin,而 grunt 显然在路径中:

depressio@depressio /cygdrive/c/dev/project
$ which grunt
/cygdrive/c/Users/depressio/AppData/Roaming/npm/grunt

所以,我做了这个 gradle 任务:

task execGrunt(type: Exec) {
    workingDir './ui'
    commandLine 'grunt'
}

很简单。但是,当我运行它时,我得到了这个异常:

Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'grunt''
    at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:195)
    at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:325)
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:90)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
Caused by: java.io.IOException: Cannot run program "grunt" (in directory "C:\dev\project\ui"): CreateProcess error=2, The system cannot find the file specified
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:71)
    ... 1 more
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    ... 2 more

这是为什么?当我自己去时./ui,我可以很好地运行 grunt(那里有一个 grunt.js)。

我发现的一些建议让我将 as 定义commandLine'cmd', '/c', 'grunt',但只是在编辑器中打开 grunt.js。此外,这在 UNIX 上不起作用,只要 PATH 设置正确,我希望此任务在 Windows (cygwin) 和 UNIX 上都有效。

显然,我错过了一些东西。

更新:

虽然这不适用于 UNIX,但我尝试使用'grunt.cmd'而不是简单地使用'grunt'. 这也不起作用,但给出了不同的堆栈跟踪:

Caused by: org.gradle.process.internal.ExecException: Process 'command 'grunt.cmd'' finished with non-zero exit value 3
    at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:363)
    at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:39)
    at org.gradle.api.tasks.Exec.exec(Exec.java:66)

(还有一堆,但这是最低的“由”引起的)

它似乎至少执行了 grunt,但是,我的咖啡脚本被编译成 js 并且出现了这一行这一事实证明了这一点:Running "clean:0" (clean) task

4

3 回答 3

2

grunt在 Windows 中使用,当我应该使用grunt.cmd. 一旦我这样做了,并找出了咖啡失败的原因(为什么 grunt 失败了),它似乎工作正常。

但是,grunt.cmd仅适用于 Windows。我确实找到了这个问题和答案,它提供了一种检测操作系统的方法。

于 2013-01-22T22:04:40.173 回答
1

编辑:这篇文章非常及时,比使用下面的旧答案要好得多。

Gradle 开发人员可能会因此而讨厌我,但我不使用该Exec任务,而是这样做:

task execGrunt {
    doLast {
        println "grunt".execute().text
    }
}

有关更多信息,请参阅外部流程的 Groovy 文档。顺便说一句,你最近失败的原因是 Grunt 返回了一个退出代码,说它失败了(非零)。

于 2013-01-22T23:49:15.743 回答
0

你可以使用这个 gradle 插件: https ://plugins.gradle.org/plugin/com.moowork.grunt

于 2014-10-12T17:25:41.340 回答