アプリ毎にRails3のバージョンを指定してrails newするスクリプトをつくってみた

まだ Rails 始めたばっかで右も左も分かってないですが、
プロジェクト毎に rails3 のバージョンを変えれるようにしたくて

  • まず一時領域で rails3 自身を Bundler でインストールして
  • ↑でインストールした内容で rails new して
  • 一時領域を削除

みたいなことを毎回するの面倒そうだなと思ってスクリプトをつくってみた。
ついでにテストフレームワークを Test::Unit から RSpec に変更する処理も追加しといた。

#!/bin/sh

prj_path=$1 # プロジェクトルートのパス
prj_name=$2 # rails new で指定するアプリ名
rails_version=$3 # インストールしたい rails のバージョン

tmp_path=$1"/_tmp"
mkdir $tmp_path
cat << EOF > $tmp_path"/Gemfile" 
source :rubygems
gem "rails", "$rails_version"
EOF

# 一時ディレクトリでrailsプロジェクト生成
cd $tmp_path
bundle install --path vendor/bundle
bundle exec rails new $prj_name --skip-bundle -J -T

# 一時生成したrailsプロジェクトと一時生成でつくられたvendor/bundleをプロジェクトルートに移動
echo "mv "$tmp_path"/"$prj_name"/* "$tmp_path"/"$prj_name"/.??* "$prj_path | sh
echo "mv "$tmp_path"/vendor/bundle "$prj_path"/vendor/bundle" | sh
rm -rf $tmp_path

# .bundle/configファイル追加
mkdir -p $prj_path"/.bundle"
cat << EOF > $prj_path"/.bundle/config"
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
BUNDLE_BIN: bin
EOF

# Gemfileにgem追加
cat << EOF >> $prj_path"/Gemfile"

group :test do
  gem 'rspec-rails'
end
EOF

# 改めて bundle install
cd $prj_path
bundle install

# config/application.rbにtest_frameworkの設定を追加
LF=$(printf '\\\012_')
LF=${LF%_}
sed -i -e 's/version\(.*\)/version\1'"$LF$LF"'    config.generators do |g|'"$LF"'      g.test_framework :rspec'"$LF"'    end/' config/application.rb

使い方は↑のシェルスクリプトrails-starter.sh みたいな感じの名前で保存して下記のように実行するだけです。

$ cd /path/to/working_directory
$ mkdir hoge
$ sh ~/bin/rails-starter.sh /path/to/working_directory/hoge hoge 3.2.12