2012年4月7日土曜日

Eclipse + Scala + sbt + Specs2 な環境を試してみた

水、木とJavaOneに行かれた皆様、どうでしたか?
ええ、私は会社にいましたよ…

http://togetter.com/li/283845 とか見て、とても楽しそうで羨ましい…って指咥えて仕事してました。

まあ指咥えてってのは嘘ですし、仕事し…



というわけで私も唐突にScala触ってみました。

その時のメモ

私の環境
Mac OSX 10.7.3
Eclipse 3.7.2
Scala IDE for Eclipse 2.0.0
sbt 0.11.2

まあ殆どこちらのブログ参考にしたんですけどね
http://blog.weblade.in/archives/1905

まずはEclipseを用意します
http://www.eclipse.org/downloads/

次にScala IDE for Eclipse というプラグインを入れます
http://scala-ide.org/
一応 For 2.9.x の安定版のリンクを選びました

続いてEclipse.iniを編集します。
http://www.assembla.com/wiki/show/scala-ide/Setup とか参考にして適当に
とりあえずヒープサイズだけでっかくしておけばいいと思います。たぶん。

Macの場合
Eclipse.app/Contents/MacOS/eclipse.ini
のはず

sbt(simple build tool)入れます。
homebrewで入れました
$ brew install sbt
多分今なら0.11.2が入ります

brewでインストールしたsbtを見ると
#!/bin/sh
# /usr/local/Cellar/sbt/0.11.2/bin/sbt
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.11.2/libexec/sbt-launch.jar "$@"
とあるので
https://gist.github.com/1139288 を参考にSBT_OPTSを環境変数にでも追加すればいい気がします

export SBT_OPTS="-Dfile.encoding=UTF8 -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m"
特にエンコードは指定しておかないと、macのターミナルでsbt testとか実行した時に日本語表示が化けて悲しい事になりました。


さてここまでやったらあとはbuild.sbtを作成するのですが、eclipseプロジェクトを作っては消し…ってのを結構やるので
とりあえず最低限のプロジェクトが作れるようなshスクリプトでも作ってみました。
本当にいいのかどうかは正直sbtどころかmavenだってマトモに使ったことないのでさっぱりですけど。
内容は件名のようにSpecs2が使えればいいんじゃね?的な最低限のやつです。


※なおgiter8という素晴らしいものがあります。自分でスクリプト書いている場合じゃねえぜ!




上記スクリプト(hogeと仮定)をテキトーに保存して実行権限与えたとしてあとは

$ cd てきとーな場所
$ hoge hello-scala

とかやれば、eclipseのプロジェクトがhello-scala というディレクトリの下に作られます。
追加したいライブラリ等があるのなら、hello-scala/build.sbt の libraryDependencies に追加した後 hello-scala直下で

$ sbt reload update eclipse

でOK


出来上がったプロジェクトをEclipseでImportします。

するとこんな感じ?



さて、肝心のSpecs2ですが選定した理由は、「会社でRailsだしRspecだしなんとなく…」というだけです。
あとで見たらScalaTestでもSpec的なやつあったしw
これでなければならないということもなければ、むしろ組み合わせて使うことも可能なようです。
http://etorreborre.github.com/specs2/guide/org.specs2.guide.SpecStructure.html#ScalaCheck+values

Eclipse上で実行するときの注意点は以下のように対象クラスにJUnitRunnerを付け忘れないことだけみたいです。
http://scala-ide.org/docs/user/testingframeworks.html
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner // 忘れないこと
import org.junit.runner.RunWith // 忘れないこと

@RunWith(classOf[JUnitRunner]) // 忘れないこと
class HelloSpecs2 extends Specification {

あとはフツーに走らせてやれば動きます。

もちろん sbt test で動かしてもテストは動きます。素晴らしい。(当たり前か)


おまけ

build.sbtに以下記述を追加するとSpecs実行結果がJUnit形式のxmlが出力されます
http://etorreborre.github.com/specs2/guide/org.specs2.guide.Runners.html#Simple+build+tool
testOptions in Test += Tests.Argument("junitxml")
// 贅沢にも全部出すのなら
testOptions in Test += Tests.Argument("junitxml", "html", "console")

出力先はxmlは target/test-reports 以下に
htmlは target/specs2-reports 以下 のようです。

なおhtml出力の場合は
"org.pegdown" % "pegdown" % "1.0.2"
みたいな感じでpegdownというものを依存関係に足さないと怒られます。

xmlを出力すればJenkinsさんとかもウマウマできますし便利ですね。


scala ide で設定できるformatterはscalariformというのを使っているようです。
http://mdr.github.com/scalariform/
で、sbtscalariform なんてものがあります。
https://github.com/typesafehub/sbtscalariform

入れるとコンパイル時にフォーマットしてくれるっぽいですね。素敵。
Eclipseを使わなくてもフォーマットはみんな統一できる、というかビルドサーバ(が、あればだけど)が勝手に整形してくれる
みたいなことができるんですよね、きっと。


さて、あとは使う人間のscala力を高めればいいのかな(白目