rbenv を使って Ruby のバージョンを変えて Rails の環境を構築する方法(Ubuntu 16.04 LTS)

Rails で用いる Ruby のバージョンを手軽に変更する

rbenv を用いて Ruby のバージョンを自由に変更して Rails の環境を構築する方法です*1。対象としているのは Ubuntu 16.04 LTS ですが、他の場合でもだいたい一緒だと思います。単にrbenvを導入するだけの説明にもなっています。

流れ

大まか流れは以下のとおりです。途中でエラーが出た場合はこの記事の下の部分にある「注意点」も参照してみて下さい。

  1. rbenvを手動でインストールする
  2. シェルでrbenvにパスを通す
  3. ruby-buildを手動でインストールする
  4. 任意のバージョンの Ruby をインストールする
  5. 用いる Ruby のバージョンをrbenvで任意のものに変更する
  6. 上記のバージョンの Ruby を用いて Rails そのものの gem を一時的にインストールする
  7. 上記の 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のコマンドを実行する際のオプションにはgloballocalがあります。前者はシステム全体の 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!

f:id:gregminster:20170418185814p:plain

注意点

rbenvgemの運用方針により違いがある

とにかくグローバル環境を汚したくない場合や、一時ファイルが要らない場合などは手順が異なってきます。rbenv execbundle execbundle 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

*1:特に Rails の環境構築に限った話ではないですが

*2:ただしバージョンが古いようです

*3:ここのディレクトリ配下以外ではグローバルでインストールされている 2.3.1 が実行されます

*4:私の場合は一回ログアウトしないと変わりませんでした

*5:ただし必ず明示的に指定しましょう

*6:あっても構わない

*7:コケました

*8:かなりまれですが

*9:もっとも、削除するのならば始めっから rails new . によりカレントディレクトリに対して rails new をした方がいいとは思いますが

Powered by はてなブログ