最近Scala+sbt+Play Frameworkという環境で仕事をしているのですが、社内外の各種プロジェクトによってScalaもsbtもPlay Frameworkも必要なバージョンが違っていて、Ruby on RailsでもPlayでもその辺は変わらないんだなーと生暖かい気持ちになったりします。 Rubyにはrbenvがあって本当に素晴らしいですね! 「ないなら作ればいいじゃない!」ということでrbenvを写経しながらScalaとsbtとPlay Frameworkのバージョンを切り替えるツールを作ってみました。
各ツールへのリンク
Twitterで@xuwei_kさんと@yuroyoroさんに教えていただくまで知らなかったんですが、Scalaにはsvm, sbtにはsbt-extras, Play Frameworkにはpvmというバージョン切り替えツールがあるそうです。 せっかく教えていただいたので用途によって色々使ってみようと思ってます。
svmについては作者の@yuroyoroさんがblogで解説しておられますが、私も Scala の各バージョンを展開して使いたいバージョンに current という名前でsymlinkを張り、
[mazgi@Ardbeg] $ tree -d -L 1 ~/Applications/Scala /Users/mazgi/Applications/Scala ├── current -> scala-2.10.3 ├── scala-2.10.2 └── scala-2.10.3
~/.zshrc でこういう風にPATHを通していたのでなじみ深い感じがします。
if [ -d "${HOME}/Applications/Scala/current" ]; then export SCALA_HOME="${HOME}/Applications/Scala/current" export PATH="${SCALA_HOME}/bin:${PATH}" fi
しかしsvmいいわー。切り替えたいバージョンが入ってなかったら自動ダウンロードとか気が利いてるわー。存在知ってたらわざわざscalaenvとか作らなかったわー。。
つかいかた
インストール手順はREADMEに書いてある通りで、使い方はrbenvと同じです。 rbenvにあまりなじみがない方向けにざっと動作させてみるとこんな感じになります。
まず、ログインユーザーの Scala バージョンを 2.10.3 に設定してみます。 ログインユーザーの使用バージョンを設定するには global サブコマンドを使います。
[mazgi@Ardbeg] $ scalaenv global scala-2.10.3 [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL
なお、選択できるバージョンは versions サブコマンドで確認できます。
[mazgi@Ardbeg] $ scalaenv versions * system * scala-2.10.2 * scala-2.10.3 (set by /Users/mazgi/.scalaenv/version)
次に、なんとなくプロジェクトっぽいディレクトリを作って移動します。
[mazgi@Ardbeg] $ mkdir -p ~/Creations/ANewScalableProject [mazgi@Ardbeg] $ cd ~/Creations/ANewScalableProject
このプロジェクトではScala 2.10.2を使うことにします。 ディレクトリ毎の使用バージョンは local サブコマンドで設定します。
[mazgi@Ardbeg] $ scalaenv local scala-2.10.2 [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL
各ディレクトリで使われるバージョンは、それぞれ .scala-version, .sbt-version, .play-version というファイルに書き込まれます。
[mazgi@Ardbeg] $ cat .scala-version scala-2.10.2
.scala-version(, .sbt-version, .play-version) が存在するディレクトリとそのサブディレクトリでは、 local サブコマンドで設定されたバージョンの Scala(, sbt, Play Framework) が起動します。 その他のディレクトリでは global サブコマンドで設定された Scala(, sbt, Play Framework) が起動します。
[mazgi@Ardbeg] $ cd ~/Creations/ANewScalableProject [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL [mazgi@Ardbeg] $ cd /tmp [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL [mazgi@Ardbeg] $ cd ~/Creations/ANewScalableProject/tools [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL
また、 shell サブコマンドにより現在のshellで特定のバージョンを使うこともできます。
[mazgi@Ardbeg] $ zsh [mazgi@Ardbeg] $ export PS1="(stacked)${PS1}" (stacked)[mazgi@Ardbeg] $ scalaenv shell scala-2.11.0-M8 (stacked)[mazgi@Ardbeg] $ scala -version Scala code runner version 2.11.0-M8 -- Copyright 2002-2013, LAMP/EPFL (stacked)[mazgi@Ardbeg] $ exit [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL
local サブコマンド、 shell サブコマンドでのバージョン設定を取り消すには --unset オプションを指定します。
[mazgi@Ardbeg] $ scalaenv local scala-2.10.2 [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL [mazgi@Ardbeg] $ scalaenv local --unset [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL
[mazgi@Ardbeg] $ scalaenv shell scala-2.11.0-M8 [mazgi@Ardbeg] $ scala -version Scala code runner version 2.11.0-M8 -- Copyright 2002-2013, LAMP/EPFL [mazgi@Ardbeg] $ scalaenv shell --unset [mazgi@Ardbeg] $ scala -version Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL
つづいて sbt のバージョンを切り替えます。 ここでは sbt 0.12.2 を使うことにします。
[mazgi@Ardbeg] $ sbtenv local sbt-0.12.2 [mazgi@Ardbeg] $ sbt --version sbt launcher version 0.12.2
最後はPlay Frameworkのバージョンを指定して、新しいPlayアプリケーションを作ってみます。 play 2.2.0 を使うことにします。
[mazgi@Ardbeg] $ playenv shell play-2.2.0 [mazgi@Ardbeg] $ play new APlayApp
ちなみにPlay Frameworkには@garbagetownさんたちが翻訳してくださってる日本語サイトもあるので、日本語ねいてぃぶな私はありがたく参照させていただいてます。
ざざっとこんな感じです。 Have fun!