Published using Google Docs
[rails,ruby] Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで)
Updated automatically every 5 minutes

今さらですが、Mac環境でrbenvを使って、Ruby・Rails環境を構築するための記事をまとめてみました。

bundlerでgemをRailsプロジェクト内にローカルインストールすることで、ruby環境を汚さずにRailsプロジェクトを生成できることを目的とします。

Rails自体もローカルインストールすることで、その都度好きなバージョンのRailsプロジェクトを生成することができます(←ここ重要。古い書籍のRailsコードを試す時とか便利です)。

■前提環境

・OSはMacを前提とする。(OSX Mountain Lionで動作確認)

・Rubyのビルドに必要なパッケージの導入にはMacPortsを使う(Gemに関してはもちろんBundler)。

Macを前提としているが、パッケージ管理ソフト以外の部分に関しては、Linux等でも使えるノウハウである。

Homebrewを使っている人でも、殆どの部分は使えるノウハウである(CONFIGURE_OPTS環境変数に指定するパスだけ気をつけてください)。

■本マニュアルが目指すこと

・Ruby環境は、rbenvを使って、複数のバージョンを切り替えられるようにして導入する。

・rbenv環境下のRuby環境に追加インストールするGemはbundlerのみ。

・ほとんどのGemは、Railsプロジェクト内に閉じた形でインストール・管理する(つまり、Railsプロジェクトのvender/bundlerディレクトリ内にGemをインストールする)

・構築したRuby環境は、MacPortsに依存しない。

■rbenv、Rubyのインストール

rbenvとそのプラグインruby-buildをインストールする。

$git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

$mkdir -p ~/.rbenv/plugins
$git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenv用の以下の設定を.bash_profileに設定する。

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"

書き換えた.bash_profileの設定を読み込む。

$ source ~/.bash_profile

MacPortsをインストールする。そしてportを最新の状態にする。

$sudo port selfupdate

$sudo port sync

(なぜ、今流行のHomebrewでなく、MacPortsを使うのか。以下の利点があるからである。

・Homebrewによって、/usr/localディレクトリをいじられるのが嫌な人にとっては、/optに全てをインストールするMacPortsは安心感がある。

・環境を再構築したくなったら、/optディレクトリを消すだけで良い。消すのではなく、リネームして、後で戻すことも可能。

・複数台のMacで共通の環境を作りたい場合は、/optディレクトリをrsyncするだけで実現できる。

・昔のMacPortsはソースからビルドしていたので遅かったが、最近のバージョンではバイナリからインストールしてくれるため、すでに「MacPortsは遅い」という定評は過去の物となった。

)

OpenSSLをインストールしないとrbenv環境でのbundle installが失敗するらしいので、MacPortsでOpenSSLをインストールする。(参照:pygo様:http://d.hatena.ne.jp/CortYuming/20120618/p1

$sudo port install openssl

readlineとiconvがないと動かないgemがあるらしいので、MacPortsでこの二つをインストール。

(参照:tech.portalshit.net様:http://tech.portalshit.net/2011/11/15/i-am-new-with-rbenv/

$sudo port install readline

$sudo port install libiconv

インストール可能なRubyのバージョンを調べる。

$sudo rbenv install -l

MacPort で インストールした openssl、readline、iconv のパスを教えて、rbenv でRubyをインストール。

$CONFIGURE_OPTS="--with-openssl-dir=/opt/local --with-readline-dir=/opt/local --with-iconv-dir=/opt/local" rbenv install 1.9.3-p327 ←バージョン番号は読み替えてね

$rbenv rehash

以下のコマンドで、インストールしたRubyのバージョンのリストを確認できる

$rbenv versions

インストールしたRubyを有効にする

$rbenv global 1.9.3-p327

■Bundlerのインストール

Railsで利用するGemは各プロジェクト毎にbundlerで管理するようにしたいので

・GEMでrubyにbundlerのみをインストール

・bundlerを使って一時的にrailsをローカルにインストール
(Railsプロジェクトを作成するためだけに使用。railsすらローカルディレクトリにインストールする)

・ローカルのrailsでプロジェクト(今回の例では”example”)を作成

・railsをローカルインストールするために使ったbundlerの環境を削除

・example内で必要なライブラリをインストール

という手順を踏む。

GEMでrubyにbundlerのみをインストール。

$rbenv exec gem install bundler

$rbenv rehash

ちなみに現在有効なrubyにインストールされたgemの確認は以下のコマンドで行う。

$rbenv exec gem list

インストールしたgemパッケージの保存場所を調べるには以下のコマンドを使う。

$rbenv exec gem which bundler

■RailsのインストールとRailsプロジェクトの作成
(新規Railsプロジェクトを作る時は、常にこのステップから行う)

bundlerを使って一時的にrailsをローカルにインストール。(Railsプロジェクトを作成するためだけに使用。railsすらローカルディレクトリにインストールする)

まず、Railsプロジェクトを作りたいディレクトリに移動して、そこでGemfileを作る。

$cat << EOS > Gemfile

source "http://rubygems.org"

gem "rails", "3.2.11" # ←ローカルインストールしたいRailsのバージョンを指定。指定しなければ最新版が入る。

EOS

railsをvender/bundleディレクトリ以下にインストールする。

$bundle install --path vendor/bundle

(このように、bundle installする際に--path vendor/bundleすることで、本来rubyディレクトリに入るGemが、vendor/bundle下にインストールされる)

インストールしたgemを確認したい場合は、以下を実行。

$bundle list

railsでプロジェクト(今回の例では”example”)を作成。

$bundle exec rails new example --skip-bundle

(vendor/bundleに入ったgemを使ってコマンドを実行したい場合は上記のようにbundle exec 〜のようにすればよい)

(--skip-bundleの指定を忘れないように!そうでないとbundle installが発動し、ruby環境にgemがインストールされてしまう!)

railsをインストールするために使ったbundlerの環境とrailsを削除

$rm -f Gemfile

$rm -f Gemfile.lock

$rm -rf .bundle

$rm -rf vendor/bundle

■Railsプロジェクトの環境セットアップ

後はexample内でGemのインストールを行う際も--path vendor/bundleオプションをつけてbundle installすることでプロジェクト内に閉じた状態でGemをインストールすることができる

$cd example
$bundle install --path vendor/bundle

(このbundle installで、再びrails(及び関連Gem)が今度はRailsプロジェクトのvender/bundleディレクトリ以下にインストールされる)

毎回 --path vendor/bundlerと打つのが面倒な場合は……。

Gemfileの先頭に以下を記述する。 ←試してみたが、うまくいかなかった

path 'vendor/bundler'

(ただし、事前にvendor/bundlerディレクトリを作成しておくこと)

Gitの管理対象からvendor/bundleディレクトリを外す。

echo '/vendor/bundle' >> .gitignore

■Railsプロジェクトの起動
$bundle exec rails server

■間違えてrubyの方にいろんなGemが入ってしまった場合

以下で全てアンインストールする。その後、bundlerだけ入れ直すこと。

$rbenv exec gem list | awk '{print "rbenv exec gem uninstall " $1}' | sh -xv

あるいは、以下の方法でruby環境ごと削除して、rubyを導入しなおしても良い。

不要になったバージョンのruby環境を削除したい場合

1.不要になったバージョンに相当するディレクトリを削除

$ rm -fr ~/.rbenv/versions/1.9.3-p327

2.~/.rbenv/versionファイルをエディタで開き、削除したいバージョンの記述を削除する。

■rbenvを最新版にしたい場合

$ cd ~/.rbenv/

$ git pull

$ cd ~/.rbenv/plugins/ruby-build/

$ git pul

■rbenvで、1.9.3-p125より古いrubyをビルド・インストールする場合

1.9.3-p125 より前のバージョンのrubyはllvm-gccではなくGCCでコンパイルされていたようです。よって、Xcode4.2以降がインストールされている場合、GCCがないので(/usr/bin/gccはllvm-gccへのシンボリックリンクとなっている)、ビルドに失敗します。

以下のような感じで失敗します。

$CONFIGURE_OPTS="--with-openssl-dir=/opt/local --with-readline-dir=/opt/local --with-iconv-dir=/opt/local" rbenv install 1.8.7-p370

ERROR: This package must be compiled with GCC, but ruby-build couldn't

find a suitable `gcc` executable on your system. Please install GCC

and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode

as of version 4.2. Instead, the `gcc` executable is a symlink to

`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,

versions of Ruby older than 1.9.3-p125 are incompatible with

`llvm-gcc`. To build older versions of Ruby you must have the official

GCC compiler installed on your system.

TO FIX THE PROBLEM: Install the official GCC compiler using these

packages: https://github.com/kennethreitz/osx-gcc-installer/downloads

You will need to install the official GCC compiler to build older

versions of Ruby even if you have installed Apple's Command Line Tools

for Xcode package. The Command Line Tools for Xcode package only

includes `llvm-gcc`.

BUILD FAILED

この対策としては、MacPortsでapple-gcc42をインストールすることです(Homebrewでも同じものがあるようです)。

$ sudo port install apple-gcc42

すると、/opt/local/bin/gcc-apple-4.2

ができるので、同階層にgcc-apple-4.2へのシンボリックリンクをgccという名前で作ります。

そうして、rubyをもう一度ビルドしてみましょう。今回、ビルドを通すため、さらにいくつかのオプションを追加しています。

$CONFIGURE_OPTS="--with-arch=x86_64 --with-openssl-dir=/opt/local --with-readline-dir=/opt/local --with-iconv-dir=/opt/local --without-tk" CFLAGS="-arch x86_64" LDFLAGS="-arch x86_64" rbenv install 1.8.7-p370

■謝辞

以下のサイト様の情報をかなり使わせていただきました。ていうかかなりの部分をコp(ry

吾輩のメモである(clmind

以下のサイト様からも情報をいただきました。

pygo(CortYuming様)

tech.portalshit.net