Tuesday, April 20, 2010

Exclusively require and load tasks for rake with bundler

Rails アプリケーションで Bundler の Gemfile を使う場合、
group :test do
gem :rspec-rails
end

のように Rails.env に応じたグルーピングができます。

rake でしか使わない gem とそのタスクをこの仕組でできないかなと思って、bundler の issue トラッカーでヒントを貰ってなんとかできました。

Gemfile では
group :tasks do
gem 'ar_fixtures'
gem 'yaml_waml'
end


Rakefile では
Bundler.require(:tasks)
def load_task(task_file)
load Dir[Bundler.bundle_path + "gems/*/{tasks,rails/tasks,lib/tasks}/#{task_file}.rake"].first
end
load_task "ar_fixtures"


これで、
$ rake -T db:fixtures:dump
...
rake db:fixtures:dump # Dump data to the test/fixtures/ directory.

Saturday, April 17, 2010

a rvm tips - install rubies as root, use them as a user

2010-07-30: 現状では Installing RVM System Wide に従ったほうがいいですね。たぶん。

rvm (Ruby Version Manager)を使う場合、ユーザーホーム以下に rubies から gems までインストールして使う方法が一般的なようですが、 rails のデプロイ先のサーバーや複数ユーザーで共有しているホストなど、それだと気持ち悪い。
root で ruby をインストールしてユーザーからそれ使いたいのですが、いまいち方法がよくわからなかったので試行錯誤して、とりあえず動くようになったので書いておきます。

まずは rvm gem をインストール
sudo gem install rvm

(rvm 自体はシェルスクリプトの集まりなので ruby がない状態からインストールできるようですが、やったことありません。Installing RVM を見てください。)

次に root に /usr/local/rvm ディレクトリを作成
sudo rvm-install


ユーザーの設定ファイル ~/.rvmrc に rubies と gems は /usr/local/rvm を見るように設定:
rvm_rubies_path=/usr/local/rvm/rubies
rvm_gems_path=/usr/local/rvm/gems


それからユーザーの ~/.rvm ディレクトリを作成
rvm-install

rvm-install の仰せの通りに source $HOME/.rvm/srcipt/rvm を設定、
いちどログインシェルを抜けてから、

いよいよ欲しい ruby をインストール。
rvmsudo rvm install ruby-head

通常の sudo だと sudoers に "Defaults setenv" を書いて -E しても PATH は渡されなかったりしていろいろ面倒なんですが、 rvmsudo を使うと PATH や GEM_HOME とかのruby関連の環境変数を引き渡せるので便利です。 rvm 以外にも gem, bundler などで root 権限が必要なときも rvmsudo が使えます。

先程 ~/.rvmrc ファイルに /usr/local/rvm を参照する設定を書きましたが、現状では ruby をインストールするごとに ~/.rvm/bin にシンボリックリンクを作成する必要があるようです。
(cd ~/.rvm/bin && ln -s /usr/local/rvm/bin/ruby-head ruby-head)


これで、ユーザーから通常通り
rvm ruby-head

とすれば switch できるようになりました。

もっといい方法がないか rvm google group にポストしたところ "it may never work" とは言われなかったので個人的にはこんな感じで使おうかと思ってます。

(ちなみに上記は rvm 0.1.27 で試しました)