繁体   English   中英

Groovy为什么即使在我的PATH上也找不到该程序?

[英]Why can't Groovy find this program even though it's on my PATH?

tl; dr:当我尝试从一个类执行shell命令时,Groovy找不到程序( phantomjs ,位于我的$PATH ),否则它会从Groovy Console或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 Console中尝试了它,然后从那里开始就可以了。

现在,如果我从phantomjs切换到/absolute/path/to/phantomjs ,那么它可以正常工作。 但是,将绝对文件系统路径硬编码到类中并不是解决方案。

那么:为什么Groovy在这种情况下不能找到phantomjs

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

事实证明,这与尝试从我的IDE(IntelliJ IDEA)内运行测试,尤其是尝试在OS X机器上运行测试有关。

解决方案是使用launchd.confphantomjs添加到我的PATH中。 一世...

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

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

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

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

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

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

要么

println System.getenv('PATH')

您可以创建一个具有phantomjs绝对路径的环境变量,并在运行时对其进行验证,并在未正确配置的情况下发出警报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM