rbenvがすばらしすぎるので #Scala, #sbt, #PlayFramework 版をつくってみた。

最近Scala+sbt+Play Frameworkという環境で仕事をしているのですが、社内外の各種プロジェクトによってScalaもsbtもPlay Frameworkも必要なバージョンが違っていて、Ruby on RailsでもPlayでもその辺は変わらないんだなーと生暖かい気持ちになったりします。 Rubyにはrbenvがあって本当に素晴らしいですね! 「ないなら作ればいいじゃない!」ということでrbenvを写経しながらScalasbtPlay Frameworkのバージョンを切り替えるツールを作ってみました。

各ツールへのリンク

scalaenv
Scalaの各種バージョンを切り替えます。
sbtenv
sbtの各種バージョンを切り替え(ry
playenv
Play Frameworkの(ry

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さんたちが翻訳してくださってる日本語サイトもあるので、日本語ねいてぃぶな私はありがたく参照させていただいてます。

f:id:mazgi:20141210072623p:plain

ざざっとこんな感じです。 Have fun!