Help us understand the problem. What is going on with this article?

#scalaenv, #sbtenv, #playenv でScala, sbt, PlayFrameworkのバージョンを管理する

More than 3 years have passed since last update.

2017.06 追記

案外使っていただけているようなのでorgを作ってtransferしました。

homebrewとanyenvにはPRも出しました。
(transferなので旧リポジトリを参照しても勝手にリダイレクトされると思いますが)


「Scalaってrbenvみたいにバージョンを切り替えて管理できるツールないの??」と思ったところでrbenvパク参考にすればいいことに気づきつくってみました
しょぼいながらもautocompletionとインストール機能まで実装できたので開発メモを兼ねて現状を書いてみます。


インストール

それぞれREADMEに従ってください。
といってもgit cloneしてPATHを通すだけです。

  • Scalaバージョン管理ツール: scalaenv
  • sbtバージョン管理ツール: sbtenv
  • Play Frameworkバージョン管理ツール: playenv

使い方

使い方はscalaenv, sbtenv, playenv全部一緒なのでここではscalaenvを例にとります。

インストールされているバージョンの一覧表示

[mazgi@BRUICHLADDICH] $ scalaenv versions
* scala-2.10.1
* scala-2.10.2
* scala-2.10.3
* scala-2.11.0-M2
* scala-2.11.0-M3
* scala-2.11.0-M4
* scala-2.11.0-M5
* scala-2.11.0-M7
* scala-2.11.0-M8
* scala-2.9.0.1
* scala-2.9.0.final
* scala-2.9.1-1
* scala-2.9.1.final
* scala-2.9.2
* scala-2.9.3

特定のバージョンをインストールする

インストール可能バージョンの一覧表示

scalaenv install-lオプション付きで実行するとインストール可能なバージョン一覧が表示されます。
というかscalaenv installのあとに指定された文字列をインストール対象バージョンと見なせなかったらインストール可能バージョン一覧を表示するだけだったりします。

[mazgi@BRUICHLADDICH] $ scalaenv install -l
All available versions:
scala-2.10.1
scala-2.10.2
scala-2.10.3
scala-2.11.0-M2
scala-2.11.0-M3
scala-2.11.0-M4
scala-2.11.0-M5
scala-2.11.0-M7
scala-2.11.0-M8
scala-2.9.0.1
scala-2.9.0.final
scala-2.9.1-1
scala-2.9.1.final
scala-2.9.2
scala-2.9.3

インストールといっても$SCALAENV_ROOT/versions内に展開してるだけなのでtarballを展開すればどんなバージョンでもインストールできます。

インストールする

例えばscala-2.11.0-M8をインストールする場合、scalaenv install scala-2.11.0-M8と実行するとインストールできます。
今のところインストール済みバージョンを指定すると上書きインストールします。
あとアンインストール機能はありません。$SCALAENV_ROOT/versionsの下から手動で消してください。

単にcurlでダウンロードして展開してるだけです。SHA1SUMが提供されているバージョンであれば一応チェックサム確認します。
(Scala|sbt|PlayFramework)さん、なんでバージョンによってダウンロードURL変わったりSHA1SUMあったりなかったりするの・・・

[mazgi@BRUICHLADDICH] $ scalaenv install scala-2.11.0-M8
Installing scala-2.11.0-M8:
Downloading scala-2.11.0-M8 archives...
######################################################################## 100.0%
Extracting files...
scala-2.11.0-M8 installed.

例外処理ほとんど書いてないので途中でなんかあると簡単にコケると思います。

バージョン切り替え方法

ユーザースコープ(global)のScalaバージョンを切り替える

ログインユーザー全体のScalaバージョンを切り替えるにはscalaenv globalにバージョン文字列を続けます。
globalというサブコマンド名ですが、有効なのは同じログインユーザーのシェルのみで、他のユーザーには影響を与えません。

scalaenv global scala-2.10.1と実行するとScalaのバージョンが2.10.1になります。

[mazgi@BRUICHLADDICH] $ scalaenv global scala-2.10.1
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.1 -- Copyright 2002-2013, LAMP/EPFL

scalaenv global scala-2.10.2と実行するとScalaのバージョンが2.10.2に切り替わります。

[mazgi@BRUICHLADDICH] $ scalaenv global scala-2.10.2
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL

特定のディレクトリ以下(local)のScalaバージョンを切り替える

特定のディレクトリとそのサブディレクトリのScalaバージョンを切り替えるには、対象のディレクトリ上でscalaenv localにバージョン文字列を続けます。
例えばこんなディレクトリツリーがあるとします。

[mazgi@BRUICHLADDICH] $ tree
.
├── 2.10.3
│   └── subdir
│       └── 2.11.0-M2
└── 2.11.0-M8
    └── subdir

ディレクトリ2.10.3/に移ってscalaenv local scala-2.10.3を実行するとScalaのバージョンが2.10.3になります。

[mazgi@BRUICHLADDICH] $ cd 2.10.3
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL
[mazgi@BRUICHLADDICH] $ scalaenv local scala-2.10.3
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL

サブディレクトリでも有効です。

[mazgi@BRUICHLADDICH] $ cd subdir
[mazgi@BRUICHLADDICH] $ pwd
/tmp/scalaenv_testdrive/2.10.3/subdir
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL

さらにサブディレクトリに移って違うバージョンを指定するとそちらのScalaバージョンになります。

[mazgi@BRUICHLADDICH] $ cd 2.11.0-M2
[mazgi@BRUICHLADDICH] $ pwd
/tmp/scalaenv_testdrive/2.10.3/subdir/2.11.0-M2
[mazgi@BRUICHLADDICH] $ scalaenv local scala-2.11.0-M2
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.11.0-M2 -- Copyright 2002-2013, LAMP/EPFL

しかし親ディレクトリに戻ると元のバージョンに戻ります。

[mazgi@BRUICHLADDICH] $ cd ..
[mazgi@BRUICHLADDICH] $ pwd
/tmp/scalaenv_testdrive/2.10.3/subdir
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL

シェルセッション(shell)のScalaバージョンを切り替える

カレントシェルセッションのScalaバージョンを切り替えるには、scalaenv shellにバージョン文字列を続けます。

例えばscalaenv shell scala-2.11.0-M7が実行されたシェルセッション上でのScalaバージョンは2.11.0-M7ですが、そのシェルセッションを抜けるとscalaenv localで指定されていたバージョンに切り替わります。

[mazgi@BRUICHLADDICH] $ pwd
/tmp/scalaenv_testdrive/2.11.0-M8
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.11.0-M8 -- Copyright 2002-2013, LAMP/EPFL
[mazgi@BRUICHLADDICH] $ zsh
[mazgi@BRUICHLADDICH] $ scalaenv shell scala-2.11.0-M7
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.11.0-M7 -- Copyright 2002-2013, LAMP/EPFL
[mazgi@BRUICHLADDICH] $ exit
[mazgi@BRUICHLADDICH] $ scala -version
Scala code runner version 2.11.0-M8 -- Copyright 2002-2013, LAMP/EPFL

感想

bashって奥深いですね

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away