我在让gradle跑咕噜的时候遇到了一些麻烦。我正在使用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.js)。
我发现的一些建议让我将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)
(还有一堆,但这是最低的“由”引起的)
它确实似乎至少执行了咕噜声,但是,我的coffeescript被编译成js并且出现了这一行:Running "clean:0" (clean) task
答案 0 :(得分:2)
我在Windows中使用grunt
,我应该使用grunt.cmd
。一旦我这样做,并弄清楚为什么咖啡失败(为什么咕噜声失败),它似乎工作正常。
但是,grunt.cmd
仅适用于Windows。我确实找到了this question and answer,它提供了一种检测操作系统的方法。
答案 1 :(得分:1)
编辑:This article非常及时,并且比使用下面的旧答案要好得多。
Gradle开发人员可能会因此而讨厌我,但我不使用Exec
任务,而是执行此操作:
task execGrunt {
doLast {
println "grunt".execute().text
}
}
有关详情,请参阅Groovy docs for external processes。顺便说一句,你最近失败的原因是Grunt返回了退出代码,说它失败了(非零)。
答案 2 :(得分:0)
您可以使用此gradle插件: https://plugins.gradle.org/plugin/com.moowork.grunt