2012-09-04 65 views
0

tl; dr:當我試圖從一個類執行shell命令時Groovy找不到一個程序(phantomjs,位於我的$PATH) - 否則從Groovy控制檯或從Grails CLI腳本。是什麼賦予了?爲什麼Groovy無法找到這個程序,即使它在我的PATH上?

我們有一個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,那麼它工作正常。但是將絕對文件系統路徑硬編碼到類中並不是解決方案。

所以:Groovy爲什麼在這種情況下找到phantomjs

更新:我懷疑這可能與我的IDE(IntelliJ Idea)有關,因爲從命令行運行此錯誤時不會發生此錯誤。

回答

1

事實證明,這與試圖從我的IDE(IntelliJ IDEA)中運行測試有關,更具體地說,嘗試在OS X機器上執行此操作。

解決方案是使用launchd.confphantomjs添加到我的PATH。我...

  1. 創建/etc/launchd.conf
  2. 添加以下行到它(注:我安裝PhantomJS與Homebrew

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

  3. 重新啓動我的機器,使新launchd配置將生效。
  4. 回到我的IDE並重新運行測試。

並且所有測試都成功運行。

0

你可以嘗試打印與常規

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

println System.getenv('PATH') 

您可以在路徑創建具有絕對路徑的環境變量phantomjs並驗證它在運行時和提醒,如果它是沒有正確配置。

+0

這很有幫助,因爲它告訴我,當該類正在執行時'phantomjs'不在我的'$ PATH'上,但它仍不能解釋爲什麼它在其他上下文中可用。這至少指出了可能的後備計劃。 – founddrama

相關問題