Rails で用いる Ruby のバージョンを手軽に変更する
rbenv を用いて Ruby のバージョンを自由に変更して Rails の環境を構築する方法です*1。対象としているのは Ubuntu 16.04 LTS ですが、他の場合でもだいたい一緒だと思います。単にrbenv
を導入するだけの説明にもなっています。
流れ
大まか流れは以下のとおりです。途中でエラーが出た場合はこの記事の下の部分にある「注意点」も参照してみて下さい。
rbenv
を手動でインストールする- シェルで
rbenv
にパスを通す ruby-build
を手動でインストールする- 任意のバージョンの Ruby をインストールする
- 用いる Ruby のバージョンを
rbenv
で任意のものに変更する - 上記のバージョンの Ruby を用いて Rails そのものの gem を一時的にインストールする
- 上記の gem を用いて
rails new
する
環境構築
ではやっていきましょう。
1. rbenv
を手動でインストールする
git clone
でよいです。~/.rbenv
に入れます。
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
なお、パッケージマネージャでも入るようです*2。
2. シェルでrbenv
にパスを通す
.bashrc
に以下の二行を追加してパスを通しましょう。異なるシェルを使っている場合は適宜読み替えて書き換えて下さい。
export PATH=$HOME/.rbenv/bin:$PATH eval "$(rbenv init -)"
追加した設定を反映させることを忘れずに。場合によってはログインし直しです。
$ source ~/.bashrc
3. ruby-build
を手動でインストールする
ruby-build
をインストールします。これは Ruby を落としてきてインストール(コンパイル)する際に必要になります。所定の場所(~/.rbenv/plugins/ruby-build
)にgit clone
すればいいだけです。パッケージマネージャを用いて入れることはできますが、手動で入れます。
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
4. 任意のバージョンの Ruby をインストールする
任意のバージョンの Ruby をインストールするために、まず、インストールが可能な Ruby のバージョン一覧をrbenv
コマンドを用いて表示させます。もしここでrbenv: no such command 'install'
と出た場合はruby-build
が正しくインストールされていません。
$ rbenv install -l
2017年4月18日現在だと以下のあたりがでてきました。
2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.4.0-dev 2.4.0-preview1 2.4.0-preview2 2.4.0-preview3 2.4.0-rc1 2.4.0 2.4.1 2.5.0-dev
私は2.4.1
を入れたいので、rbenv install
を使って入れます。ソースをダウンロードしコンパイルをするため、けっこうな時間がかかりますのでのんびり待ちましょう。パッケージが足りない場合は入れるように促すエラーメッセージが出ますので、それにしたがってパッケージを入れてから改めてrbenv install
をします。libssl-dev libreadline-dev
あたりは入っていないことが多いかもしれません。
$ rbenv install 2.4.1 Downloading ruby-2.4.1.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2 Installing ruby-2.4.1... Installed ruby-2.4.1 to /home/foobar/.rbenv/versions/2.4.1
5. Ruby のバージョンを rbenv で任意のものに変更する
ここまで進んできても、ruby -v
したら以下のようにグローバルのバージョンが表示されます。
$ ruby -v ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
これは当然なわけで、まだバージョンを変更する操作をしていないからです。rbenv
を使ってバージョンを変更しましょう。
rbenv
のコマンドを実行する際のオプションにはglobal
とlocal
があります。前者はシステム全体の Ruby のバージョンを変更するもので、後者は実行したディレクトリ配下のみ、Ruby のバージョンを変更するものです。
ここではlocal
オプションを用いて、Rails の開発環境だけを2.4.1
にしてみましょう。まずは Rails の開発用のディレクトリ~/rails_app
を作りその中に入ります。
$ mkdir ~/rails_app $ cd ~/rails_app
そしてこの中でrbenv local
を以下のように実行して、このディレクトリの配下のみで2.4.1
を適用させましょう*3。
$ rbenv local 2.4.1
これでこのディレクトリに.ruby-version
というファイルが生成され、このディレクトリ配下で実行される Ruby のバージョンが以下のように2.4.1
となりました*4。
なお、システム全体の Ruby とは完全に独立した形で存在することになります、gem をグローバルインストールした(ように見える)場合でも、そのユーザのみが gem のインストールの対象になります。本来の意味でのグローバルインストールをしたい場合は「2.」でパスを通している部分を削除します。このあたりは$ which ruby
や$ which gem
などで分かるかと思います。
$ ruby -v ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
rbenv
を導入することが目的の場合はここまでで完了になります。
6. 上記のバージョンの Ruby を用いて Rails そのものの gem を一時的にインストールする
ここまではrbenv
の説明でした。いよいよ Rails の環境を作ります。
まずは何はともあれbundler
を入れます。ただしここで注意してください。以下のようにrbenv exec
を先頭に付与してコマンドを実行し、「現在適用されている Ruby のバージョンにおけるインストール」であることを明確にして下さい。そうでないとグローバル環境にインストールすることになります。
$ cd ~/rails_app $ rbenv exec gem install bundler Fetching: bundler-1.14.6.gem (100%) Successfully installed bundler-1.14.6 Parsing documentation for bundler-1.14.6 Installing ri documentation for bundler-1.14.6 Done installing documentation for bundler after 4 seconds 1 gem installed
さて、Rails をインストールしていきます。まず基礎となるGemfile
を手っ取り早く作るためにbundle init
をしましょう。
$ cd ~/rails_app $ bundle init Writing new Gemfile to /home/foobar/rails_app/Gemfile
生成されたGemfile
は以下のようになっているはずです。
# frozen_string_literal: true source "https://rubygems.org" # gem "rails"
これを以下のようにgem "rails"
が有効になるように書き換え(コメントアウト)ましょう。
source "https://rubygems.org" gem "rails"
これでbundle
すれば Rails の gem が入ります。ここでインストールする gem は一時的なものなので、インストール先のディレクトリ名は適当なもので構いません*5。少々時間がかかります。なお、ここでのbundle
コマンドではrbenv exec
は無くても構いません*6。
$ cd ~/rails_app $ rbenv exec bundle install --path ./tmp Fetching gem metadata from https://rubygems.org/.......... Fetching version metadata from https://rubygems.org/.. Fetching dependency metadata from https://rubygems.org/. Resolving dependencies... Installing rake 12.0.0 ... Bundle complete! 1 Gemfile dependency, 38 gems now installed. Bundled gems are installed into ./tmp.
ようやく準備ができました。
7. 上記の gem を用いてrails new
する
あとはrails new
するだけです!
$ cd ~/rails_app $ rails new myapp create create README.md create Rakefile create config.ru create .gitignore create Gemfile ... * bin/rake: spring inserted * bin/rails: spring inserted
無事 Rails の環境構築が完了しました!ではサーバを起ち上げてみましょう。
$ cd ~/rails_app/myapp $ rails server -b 0.0.0.0 -p 3000 => Booting Puma => Rails 5.0.2 application starting in development on http://0.0.0.0:3000 => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop
そしてさっそくローカルの 3000番ポート にアクセスしてみましょう。Yay! You’re on Rails!
注意点
rbenv
やgem
の運用方針により違いがある
とにかくグローバル環境を汚したくない場合や、一時ファイルが要らない場合などは手順が異なってきます。rbenv exec
やbundle exec
、bundle install --path
を上手く使い分けましょう。
予めインストールしておくべきもの
Vagrant などでまっさらな環境にインストールする場合は以下がインストールされていないといろんなところでコケます*7。
- gcc
- build-essential
- libssl-dev
- libreadline-dev
- zlib1g-dev
- libsqlite3-dev
- nodejs
Ruby のバージョン一覧表示
rbenv
でインストールされている Ruby のバージョン一覧を確認したい場合はrbenv versions
で確認できます。*
が付いているバージョンが、現在のディレクトリで適用されているバージョンです。
$ rbenv versions system * 2.4.1 (set by /home/foobar/rails_app/.ruby-version)
rbenv rehash
について
少し昔の時期に書かれた解説ページに記載されているrbenv rehash
コマンドは現時点では不要になっているようです……と言いたいところですが、状況によっては必要です*8。
一時ファイルの削除
「6.」の一番最後にrbenv exec bundle install --path ./tmp
で作成したtmp
ディレクトリは、今後使う見込みながければ削除して構いません*9。
Rails で用いられる Ruby のバージョンがおかしい
大抵、$ rbenv exec
のつけ忘れが原因でしょう。
参考ページ
感謝感謝感謝です。 http://qiita.com/shunsuke227ono/items/dbc7c3428bc0ac01e9ac