Scala、sbt、playframeworkのversion切り替えツールの使いどころ

さて、以下の様なものがありますが

Scalaのversion切り替えツール
https://github.com/yuroyoro/svm

sbtのversion切り替えツール
https://github.com/paulp/sbt-extras

playframeworkのversion切り替えツール
https://github.com/kaiinkinen/pvm

そもそも、なぜこういったものが必要なんでしょうか?そもそも本当に全員にこういったものが必要なのでしょうか?必要になる人は、どんな人でしょうか?実際どのくらい使うのでしょうか?などの、初心者にはとてもわかりづらいあたりの説明を書いてみます。


書こうと思ったきっかけは、以下のエントリです

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


が、とくにscalaenv、sbtenv、playenvについては触れません。ただ、最終的な結論はだいたい同じことが言えるのではないか?と思います。



まず、Scalaのversion切り替えツールである、svm
そもそもScalaのライブラリやコンパイラ自体結局は単なるjarです。scala-lang.orgからダウンロードするディストリビューション*1には、それらを呼び出すためのシェルスクリプトや、サンプルコードなどいくつかの付属物もついていますが。
以下の様な場合、結局そもそもScala自体のインストールは必ずしも必要ありません

  • sbtを使用
  • IDEを使用
  • playframeworkを使用

上記にあげた3つのすべてにおいて、Scalaのライブラリやコンパイラは、すでにソフトウェア内やzipに含まれているか、ないならばダウンロードしてくる仕組みが備わっていますし、基本それらは(scala-lang.orgからダウンロードしてくるディストリビューションとは別のものとして)独自管理されます。

じゃあいつ必要になるか?というと、たとえば

です。それは、かなり限定された状況です。つまり

  • 初心者は、最新安定版の1つだけを入れておけば大概十分
  • では中上級者になってくると必須か?というとそうでもなく、ほとんどはsbtやIDE経由で複数versionのScalaを扱うことになるはずなので、結局あまり必要ない

という結論になります。そもそも作者のyuroyoroさんも

とか言ってたことあります。しかし、一応自分は今でも使ってます。どんなときかというと「違うversionのREPLを、素早く試したいとき」です。この「素早く」がポイントで、そうでなければsbt経由で試せば事足ります。単に、個人的にはsbtで切り替えるより、svmで切り替えたほうが、REPLの起動に関しては少し便利なだけです。




次にsbt-extrasについて。
sbtに関しては、昔は互換性がなかったので、sbt-extrasは結構重要でした。しかし、現在は(いくつかの例外をのぞいて)あまり必要ありません。*2基本的にはsbt0.13のlauncherのjarで、sbt0.12やそれ以前のものにも対応しています。
ただ、以前から使っていた流れと、「sbtのlauncherに渡す引数が便利に柔軟に設定できる」という点があるので、個人的には今でも使い続けています。





最後にpvmについて。
play1系も使ってる人にとっては有用かもしれません。しかし、playframework2は、結局内部的にsbtをビルドに使っています。なので、sbtと同じ理由で必ずしも必要ありません。
しかも、pvmがダウンロードするzipはかなり大きいですし、それらの中には重複したものが含まれるという欠点もあります。また、独自のivyリポジトリを使っていて、それに起因するバグまで発生したという残念なこともありました。(結局play独自のivyリポジトリは、やめる方向性になったらしい)

なので、基本的はそれほどpvm使ってません。例えば既存の作りかけのplay2のプロジェクトのversionを上げる場合は、project/plugins.sbt(場合によってはproject/build.propertiesも)を少し書き換えるだけで済むからです。また、playコマンドで起動すると、標準のivyのキャッシュディレクトリを使ってくれずに、無駄に同じダウンロードを繰り返したり、ディスク容量を圧迫するのが嫌なので、playのプロジェクトだとしてもplayコマンド使わずにsbt直接起動してました。*3




ただし、"play new"して雛形をつくる機能は、sbtには直接には存在しないので、それらが必要な場合はplayのディストリビューション(pvmがダウンロードしてくるもの)が必要かもしれません。
個人的には、そのためだけにディストリビューションダウンロードしておくのは嫌なのでg8テンプレート
https://github.com/xuwei-k/play.g8
作ったりしてました。





以上色々細かいこと説明してきました。が最終的に言いたかったことは
初心者は
「sbt、Scala、playそれぞれ全部version管理ツールがあるの?それ必ず使わないといけないの?え、めんどくさそう?」
という必要以上にネガティブな印象を受けるのでは?

「どれも、(少なくとも自分の経験上)現在は必ず使う必要もない」


ということです。
ただ、それぞれのツールの使い方がすごく難しいわけでもないですし、(svmやpvmに関しては)ある意味無駄にディスク領域を圧迫する以外は、そこまでデメリットがあるわけでもないので、べつに「使うな」というつもりもありません。
(実際自分はsvmやsbt-extrasは今も使ってるので)結局最終的に、このあたりは個人の好みになるでしょう。



あとは、ここに書いた理由以外で「どうしても切り替えツール必要なんだ!あったほうが便利なんだ!」という人もいるかもしれません?みなさんどうしてるんでしょうね。




自分でも書いてて「わかりにくいなー、うまく説明するの難しいなー」となって、グダグダ感が否めませんが、少しでもだれかの役に立てば幸いです。

*1:svm自体がversion毎にdownloadするもの

*2:このあたりの、launcherのversionに関する、「仕様かバグかよくわからない挙動」はたまにあるので、「sbt-plugin作者で、かつsbt0.12と0.13でクロスビルドしている」という上級者は必要かもしれない

*3:play2のplayコマンドは、シェルスクリプトで少しラップしてあるだけで、実際最終的に起動するのはsbtです