日々常々

ふつうのプログラマがあたりまえにしたいこと。

SpockをGroovy1.8のGroovyConsoleから使ってみよう

と思って backpaper0さんち を横目で見ながら GroovyConsole 立ち上げてやってみた。

groovy> @Grab('org.spockframework:spock-core:0.5-groovy-1.7') 
groovy> import spock.lang.* 
groovy> class HelloSpec extends Specification { 
groovy> } 
 
Exception thrown
2011/07/21 21:23:59 org.codehaus.groovy.runtime.StackTraceUtils sanitize

警告: Sanitizing stacktrace:

org.spockframework.util.IncompatibleVersionsError: The Spock compiler plugin could not run because Spock 0.5.0-groovy-1.7 is not compatible with Groovy 1.8.0. For more information, see http://versioninfo.spockframework.org
Spock location: file:/C:/Users/irof/.groovy/grapes/org.spockframework/spock-core/jars/spock-core-0.5-groovy-1.7.jar
Groovy location: file:/C:/opt/groovy-1.8.0/lib/groovy-1.8.0.jar

……?


…あー。そりゃそうだよねー。うんうん。
自分 Groovy1.8.0 使ってるのに Grab してるのは 1.7 です。コピペする前に気付け私。深く考えずに 1.7 を 1.8 に変えて、GroovyConsole再起動*1して再度実行。

groovy> @Grab('org.spockframework:spock-core:0.5-groovy-1.8') 
groovy> import spock.lang.* 
groovy> class HelloSpec extends Specification { 
groovy> } 
 
1 compilation error:

Exception thrown
2011/07/21 21:25:54 org.codehaus.groovy.runtime.StackTraceUtils sanitize

警告: Sanitizing stacktrace:

java.lang.RuntimeException: Error grabbing Grapes -- [unresolved dependency: org.codehaus.groovy#groovy-all;1.8.0-beta-3-SNAPSHOT: not found]

……?


……えーと。「Groovy1.8.0-beta-3-SNAPSHOTが無い」ですか。要らないよ…。見たままなんですけど、Spock0.5-groovy-1.8 の依存してる groovy-all が 1.8.0-beta-3-SNAPSHOT で、これがなんか無いらしい。前あったんですかね。よくわかりませんがー、とりあえず jar でも作って自分でクラスパスに追加するとかすれば使えるんでしょうけど、そんな面倒な事はしたくない。

何とか Grab でしたい。


したいならやれば良い。なのでやります。
${HOME}/.groovy/grapes/org.spockframework/spock-core が Grab でダウンロードされてきた spock が入ってるディレクトリ。私の環境*2だとこんな感じになります。この中の ivy-0.5-groovy-1.8.xml が Grab した時に見るやつです。

PS> ls


    ディレクトリ: C:\Users\irof\.groovy\grapes\org.spockframework\spock-core


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/07/21     21:04            jars
-a---        2010/12/11      2:42       5644 ivy-0.5-groovy-1.7.xml
-a---        2010/12/11      2:42       2292 ivy-0.5-groovy-1.7.xml.original
-a---        2010/12/11      2:46       5622 ivy-0.5-groovy-1.8.xml
-a---        2010/12/11      2:46       2292 ivy-0.5-groovy-1.8.xml.original
-a---        2011/07/21     21:23        808 ivydata-0.5-groovy-1.7.properties
-a---        2011/07/21     21:50        808 ivydata-0.5-groovy-1.8.properties


やりたい事だけなら次の一行を消せば達成出来そうなのですが、なんか気持ち悪いなら groovy-1.8.0-beta-3-SNAPSHOT って入ってるの全部(3行)消すとか、消しちゃうのはなんか嫌のなら -beta-3-SNAPSHOT だけ消して 1.8.0 は残しても。

<dependency org="org.codehaus.groovy" name="groovy-all" rev="1.8.0-beta-3-SNAPSHOT" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>

編集して保存して、再度実行。

groovy> @Grab('org.spockframework:spock-core:0.5-groovy-1.8') 
groovy> import spock.lang.* 
groovy> class HelloSpec extends Specification { 
groovy> } 
 
JUnit 4 Runner, Tests: 0, Failures: 0, Time: 94
Result: org.junit.runner.Result@3d949a87

出来た!
これで fumokmmさんち のもいけました。


アプローチが間違ってる気はしないでもないんだけど、気にしません。spockのGitHub 見た感じだと 0.6 なら大丈夫っぽいので、しばし待ちーですかね。

プログラミングGROOVYに書いてましたよ?

@Grab('org.spockframework:spock-core:0.5-groovy-1.8')
@GrabExclude('org.codehaus.groovy:groovy-all')
import spock.lang.* 
class HelloSpec extends Specification { 
}

こんなブログ読んでないで買った方が良いよ!

プログラミングGROOVY

プログラミングGROOVY

*1:spockの 1.7 が入っちゃてるので。メニューのScriptからClearScriptContextでも良いと思う。

*2:Windows7でユーザ名がirof