rubyistならrbenvは1度は使った事があると思います。
rubyの各バージョン環境を簡単に構築する事が出来る便利なツールです。
ただ「同一バージョン環境を複数構築」する事を想定されていないため、ローカル環境で色々なプロジェクトを同一バージョンで各プロジェクト毎に独立した環境を作りたい場合に困った事になってしまいます。
rbenvのお作法
rbenvのお作法として「指定バージョンの環境を作ってもその環境を汚さないようにする」というものがあるようです。
gemでbundlerをinstallして bundle install --path vendor/bundle
とする事で、bundler以外のモジュールは --path
で指定したフォルダに配置するようにして、rbenvの環境を汚さないようにするようです。
ただ、せっかく.rbenvにpathを通して任意選択環境にinstallされているコマンドを利用出来るようにしたのにその恩恵を受けられないですし、 bundle exec
を使ってコマンドを使用しなくては行けないことや bundle exec rails new
をする際に --skip-bundle
をつけないとrbenvの環境に勝手にインストールされるから環境を汚してしまう等のややこしいルールが追加されたりと事前に必要な知識が多く発生してしまいます。
今回の目標
上記のようなちょっと残念な部分を理解した上で、「各rubyやrailsプロジェクトの独立環境を簡単・自由に作れるようにする」方法を記事として書いて行きたいと思います。
ruby-buildでrbenv環境を作成する
今回の目標を実現するための方法をググってみるとすぐに出てきました。rbenvで環境を作らずにrbenv内で呼び出しているruby-buildを使うことで任意のバージョンを指定の環境名で作る事が出来るようです。
# 2.3.1バージョンの環境を作る(通常作成)
$ rbenv install 2.3.1
# 特定バージョンで任意の環境を作る(任意の環境作成)
$ ruby-build 2.3.1 ~/.rbenv/versions/2.3.1-rb_test
# globalの環境を2.3.1に
$ rbenv global 2.3.1
これで、rb_testの環境が作成されました。
~/.rbenv/versions
フォルダの部分はrbenvをインストールした場所によって変わります。
また、ruby-buildはrbenvインストールしたフォルダ内のplugins/ruby-build/bin
に設置するよう公式のドキュメントに書かれています。そのため、そのフォルダにPATHを通しておくのも忘れないようにしましょう。
$ rbenv versions
system
* 2.3.1
2.3.1-rb_test
これで、2.3.1-rb_testの環境を好きなように使う事が出来ます。
まとめ
同一バージョンの環境を複数作る事は可能でした。
ただ、この方法はrbenvの当初の作成された目的がどのようなものなのかによっては、やっては行けない事をやっているのかもしれません。
というのも、もしrbenvの作成目的がもし「rubyの複数バージョンの環境を簡単に作る」だけの目的だった場合、今回の対応は「各rubyやrailsプロジェクトの独立環境を簡単・自由に作れるようにする」という目的と照らし合わせた際、似てはいるが、同一の目的ではないという事です。rbenvは決してrubyやrailsプロジェクトに独立環境を提供するツールではないと言われた場合この方法はただの裏技になってしまい、今後のrbenvの更新によっては使えなくなってしまう可能性もある訳です。
なので、ある意味では始めに書かせて頂いたbundlerを使った方法はrbenvの役割とbundlerの役割をうまく使って、ツール毎の目的にあわせて利用している、正しい例なのかもしれません。(bundlerの方法が正しい方法なのかどうかは調べていないので解りませんが)
なので、もしこの記事を見てこの方法を利用する場合は、そういった背景も理解した上で利用するようにして下さい。
後、もっとしっくり来る方法を知っている方がいらっしゃったら是非コメント頂けると助かります。