0

tl;dr:当我尝试从一个类执行 shell 命令时, Groovy 找不到程序(phantomjs在我的 上$PATH)——否则它从 Groovy 控制台或 Grails CLI 脚本中找到它就好了。是什么赋予了?

我们有一个 Grails 脚本来在 PhantomJS(“无头 WebKit”)中执行 JavaScript 单元测试。当这些测试在一个独立的脚本(调用它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,那么它工作正常。但是将绝对文件系统路径硬编码到类中并不是解决方案。

那么:为什么phantomjs在这种情况下 Groovy 没有发现呢?

更新:我怀疑这可能与我的 IDE(IntelliJ Idea)有关,因为从命令行运行此错误时似乎没有发生此错误。

4

2 回答 2

1

事实证明,这与尝试从我的 IDE (IntelliJ IDEA) 中运行测试有关,更具体地说,是尝试在 OS X 机器上执行此操作。

解决方案是添加phantomjs到我的PATHusing 中launchd.conf。我...

  1. 创建/etc/launchd.conf
  2. 添加以下行:(注意:我用Homebrew安装了 PhantomJS )

    setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

  3. 重新启动我的机器,以便新launchd配置生效。
  4. 回到我的 IDE 并重新运行测试。

并且所有测试都成功运行。

于 2012-12-13T15:14:43.943 回答
0

您可以尝试使用 groovy 打印您的路径

['sh', '-c', 'echo $PATH' ].execute().text

或者

println System.getenv('PATH')

您可以使用 phantomjs 的绝对路径创建环境变量,并在运行时对其进行验证,并在未正确配置时发出警报。

于 2012-09-04T18:54:19.597 回答