0

tl; dr:クラスからシェルコマンドを実行しようとすると、Groovyはプログラム(phantomjsにあります$PATH)を見つけることができません。それ以外の場合は、GroovyコンソールまたはGrailsCLIスクリプトから問題なく検出されます。何が得られますか?

PhantomJS(「ヘッドレスWebKit」)でJavaScriptユニットテストを実行するためのGrailsスクリプトがあります。これらのテストをスタンドアロンスクリプト(それと呼びます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)と関係があるのではないかと思います。

4

2 に答える 2

1

結局のところ、これは私のIDE(IntelliJ IDEA)内からテストを実行しようとすること、より具体的にはOSXマシンでこれを実行しようとすることと関係がありました。

phantomjs解決策は、私のPATH使用に追加することでした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 に答える