• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

bundlerを使うとRubyアプリケーションごとに閉じたgemの依存関係を構築できるので、gemのバージョンの違いや環境ごとの違いで悩まされることが減ります。 これは非常に便利なのですが、rakeやunicornのようにコマンドをインストールするgemの場合、

   1  % bundle exec unicorn

のように、bundle execを介して実行する必用があって面倒です。 しかし、rvmを使えばこれを賢く解決できます。

比較的新しめのrvmとbundlerが必用になるので、 あらかじめ最新版をインストールしておいてください。

まず、以下のように適当なアプリケーション名などでgemsetを作ります。

   1  % rvm gemset create foo-app

作成したgemsetは

   1  % rvm gemset use foo-app

のようにしてアクティベートできます。新規に作成したgemsetの中身は こんな感じになっています。

   1  % gem list
   2  
   3  *** LOCAL GEMS ***
   4  
   5  bundler (1.0.2)
   6  rake (0.8.7)

bundler-1.0.2はちょっと古いので、gem udpateして最新のbundlerにします。

この状態であらかじめ用意しておいたGemfileに従ってgemをインストールします。

   1  % bundler install --system

これで foo-app gemset にはGemfileで指定したgem群が入った状態になり、rake, unicornなどのコマンド群もrvmがいい感じに取り計らってくれます。 あとは、rvm gemset use xxx を使えば適宜必用なgem環境を切り替えることができます。

ただ、アプリケーションが複数ある場合に、頻繁にgem環境を切り替えるのは面倒です。 アプリケーションのrootディレクトリに .rvmrc というファイルを作って

   1  rvm use ruby-1.8.7-p302@foo-app

のように記述しておいておくと、cd した時にrvmが勝手にgemsetを切り替えてくれます。これで完璧ですね!

Bye bye gem hell!

posted by Png genki on Sat 28 May 2011 at 21:49

Rubyはメソッド定義内で begin/end が無くても直接rescueやensureを記述できますが、これは無駄な記述を減らす上でとても魅力的な文法だと思います。

   1  def foo
   2    puts "hello world :-)"
   3  rescue
   4    puts "something wrong :'-("
   5  end

この書き方のまま、所定回数だけretryしたい場合、retry回数を覚えておくカウンタ変数を用意する場所に困ったりするのですが (ローカル変数として定義すると、retry後に再初期化されてしまいますからね) 以下のように引数として用意しておくと、methodが定義するブロックよりも外側のライフタイムを持つので、retryカウンタとして使えます。

   1  def foo(bar = 0)
   2    puts bar
   3    raise 
   4  rescue
   5    bar += 1
   6    retry if bar < 10
   7  end
   8  
   9  foo

実行した結果は以下の通り

   1  0
   2  1
   3  2
   4  3
   5  4
   6  5
   7  6
   8  7
   9  8
  10  9

posted by Png genki on Sat 28 May 2011 at 01:29 with 1 comment
Contents
rvmのgemsetを使ってbundlerと賢く付き合う方法
retry回数制限つきrescueの書き方のメモ
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ