Rails4やるのでrbenvでrubyのバージョン上げたりbundler整備したりの手順

頑なにRailsやらずにPadrinoとかでやってきたけど、何となく気が向いたのでRailsやるかなってことで、まず「Ruby on Rails チュートリアル:実例を使って Rails を学ぼう」読んだ。

で、ついでに1.9ベースだった環境も2.1ベースにしようかなってことで作業したのでメモ。

方針

  • rubyとgemとbundler周りだけrbenv配下。
  • 他のgemはrails含めてプロジェクトフォルダのvendor/bundle配下にインストールする。
  • 「bundle exec」は毎回書かなくて済むようにする。

前提

  • rbenv導入済み。

手順

まず「rails new」するときに「Test::Unitを除外(代わりにrspec)」「bundle installしない」をデフォルトにする。
今回は「--skip-bundle」なくても手順的には問題ないのだけれど、うっかり「rails new」ってやってrbenvの共通のところにワーってgem群が入ると悲しいので入れておく。

echo "-T --skip-bundle" >> ~/.railsrc

次にrbenvを最新にする。

cd ~/.rbenv
git pull
cd ~/.rbenv/plugins/ruby-build
git pull

「bundle exec」とかも毎回やりたくないので、勝手にbinstubsの中を見てくれるようにrbenv-binstubsを導入(Rails4以降はプロジェクトフォルダ直下のbinフォルダをrails自体が使うのでbundle時にそこを上書きしないよう後でbinstubsのオプションをつける必要がある)。

cd ~/.rbenv/plugins
git clone git://github.com/ianheggie/rbenv-binstubs.git

rbenvが新しくなると以下のコマンドで表示されるインストール可能なrubyバージョンも新しくなる。

rbenv install -l

今回は2.1.1とか入れてみる。さすがにちょっと時間掛かる。
インストールされてるバージョンは「rbenv versions」で参照。デフォルトのバージョンは「rbenv global」で指定。「ruby -v」で2.1.1が出ればOK。

rbenv install 2.1.1
rbenv versions
rbenv global 2.1.1
ruby -v

bundlerは単独で導入する。ここで使うgemコマンドも2.1.1についてきたものが使われる。
rbenv管理下の実行ファイルが増えた場合は「rbenv rehash」で更新する必要がある(「~/.rbenv/shims」参照)。

gem install bundler
rbenv rehash

下ごしらえは上記で完了だが、railsプロジェクト作成時にコツがあるのでそれも記載。
通常は「rails new 【プロジェクト名】」でさっくり作ってしまうが、まずこれを実行するのにrails本体がないといけない。で、そのために普通に「gem install rails」とするとrbenv配下にワーってrailsが依存するgem群もろともインストールされてしまう。
だからそれがいやなんだってばよ。

と、いうことで手でプロジェクトフォルダを作り、Gemfileも自分で書いてから「--path」と「--binstubs」を明示してrailsも含めて「bundle install」する。なお、一度オプションをつけて実行すれば「/.bundle」内に設定が残るので次からは同じプロジェクトフォルダ内ではオプションを省略して実行できる。
Gemfileは「bundle init」でも生成されるが、どうせ「# gem "rails"」の「#」を除去するし現時点では2行しかないので普通にコマンドで書いちゃう。

mkdir ~/foo
cd ~/foo
cat << EOT >> Gemfile
source "https://rubygems.org"
gem "rails"
EOT
bundle install --path=vendor/bundle --binstubs=vendor/bin
rails new .
# 上書きしても良いか聞かれるので「Y」で上書きする。
bundle update

おまけに.gitignoreも新しくしてrspecのフォルダ作ってgit管理を開始するなど。

cat << EOT > .gitignore
/.bundle

/db/*.sqlite3
/db/*.sqlite3-journal

/log/*.log
/tmp

/vendor/bin
/vendor/bundle
*.swp
*~
.project
.DS_Store
.idea
.secret
EOT
rails generate rspec:install
git init
git add .
git commit -m 'initial commit'