tl; dr:当我尝试从类中执行shell命令时,Groovy无法找到程序(phantomjs
,这是我的$PATH
) - 它是否则从Groovy控制台或Grails CLI脚本中找到它就好了。是什么给了什么?
我们有一个Grails脚本来在PhantomJS中执行JavaScript单元测试(“无头WebKit”)。当这些测试在一个独立的脚本中执行时(称之为grails test-js
),一切正常。 Grails / Gant脚本中的相关行是:
// where 'jsTests' is a List with the paths to each test
def failures = 0
jsTests.each {
Process p = "phantomjs lib/phantom-jasmine/lib/run_jasmine_test.coffee file://${it}".execute()
failures += p.exitValue()
}
但是,由于我们希望将其作为常规grails test-app
周期的一部分运行,因此我们创建了org.codehaus.groovy.grails.test.GrailsTestType
的实现。当我们到达我们需要执行测试的实现中的部分时,相同的代码(如上所述)不起作用,并且Groovy / Grails抱怨:
java.io.IOException: Cannot run program "phantomjs": error=2, No such file or directory
我的第一个想法是phantomjs
不在$PATH
上 - 但我知道它是,并且再次:它从Grails / Gant脚本运行时起作用。所以我在Groovy控制台中尝试了它,从那里工作正常。
现在,如果我从phantomjs
切换到/absolute/path/to/phantomjs
,那么它可以正常工作。但是将绝对文件系统路径硬编码到类中并不是解决方案。
那么:为什么Groovy在这种情况下找不到phantomjs
?
更新:我怀疑这可能与我的IDE(IntelliJ Idea)有关,因为从命令行运行此错误时似乎没有发生此错误。
答案 0 :(得分:1)
事实证明,这与尝试从我的IDE(IntelliJ IDEA)中运行测试有关,更具体地说,尝试在OS X机器上执行此操作。
解决方案是使用phantomjs
将PATH
添加到launchd.conf
。我...
/etc/launchd.conf
在其中添加了以下行:(注意:我使用Homebrew安装了PhantomJS)
setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
launchd
配置生效。所有测试都成功运行。
答案 1 :(得分:0)
您可以尝试使用groovy打印路径
['sh', '-c', 'echo $PATH' ].execute().text
或
println System.getenv('PATH')
您可以使用phantomjs的绝对路径创建环境变量,并在运行时对其进行验证,并在未正确配置时发出警报。