せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】パーフェクトRuby 学習感想文 ~余談:Bundleって何

パーフェクトRubyを読んで、まだ分かっていないところを、改めて振り返ります。

 
(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに

分かっていないところ

Bundle
シンボル

です。
ここではBundleについて取り上げる。

 
本にももちろん解説は載っているのだけれど、
もやーとしたまま通り過ぎて、手を動かす15・16章でなにか発見できた、と言うこともなかった。

たとえば

ブロック

は、15章でいろんな所で出てきて、そのたびに嵌ったので、よく分かったと思う。


 

Bundle

Bundle とは

P455

アプリケーションで利用するgemパッケージを定義し、
依存関係を解決するための仕組みです

 

ああ!なるほど!
 
って展開速すぎですよね。

いや、15章で実際にTODOアプリを作るときに、たくさんbundleコマンドを実行していて、もやっと、

bundleって、実行環境を登録して、その環境で実行する仕組み?

という認識があったので、改めて読むとなるほどなと。
でも、gemとセットで出てきたので、いまいち知識がごちゃごちゃしている。

詳しく読んでみる。


なるほどね、bundlerってgemに対する便利な考え方なのか。
「実行環境を制御しているー」みたいな難しいイメージがあったけど、
gemに絞って考えたらいいんだ。

と思っていたけどロードパスも設定できる

「bundler gem コマンド」を使ってgemを作成した場合、
bundleが見に行くGemfileが、さらにgemspecファイルを見に行く設定となる。

gemspecファイルではロードパスへの追加などが可能。(P540)

lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)

うーん。。なるほど。
bundlerはgemに絞った(どのgemをrequireするか)だけの便利機能、ってわけでもないんだ。

でも良く考えると、
ロードパスの追加というと難しく聞こえるけれども、
結局はgem(含むrbファイル)を探してるだけだ。



 

pathを指定してインストール

$ bundle install --path hogebundle

PATH変数に追加される↓

$  bundle exec env
PATH=/c/repositories/todo_samp/hogebundle/ruby/2.0.0/bin:

 
.bundle/configファイルにも追記されてる

---
BUNDLE_PATH: bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'


この「パスを指定して追加」がbundlerの醍醐味みたい。

パスを指定しないとシステムにgemがインストールされてしまいます。
bundlerで管理している意義が薄れるので、必ず指定しましょう。

うん。--pathを指定して、gem一式がインストールされるのを確認したよ。

 

 --path オプションを使うと、指定した場所に gem がインストールされるので、不要になったときにまとめて削除出来て便利です。

http://qiita.com/znz@github/items/5471e5826fde29fa9a80

なるほど。削除したよ


挫折した16章、改めてbundleを理解して解決する。

負けないぞ・・・
 

RUBYOPTを設定時の、bundleのエラーを回避

$ bundle exec rackup
c:/Ruby200/bin/rackup:1:in `require': cannot load such file -- what_methods (LoadError)

P601にてrackupコマンドを使うとエラーになり。

これは前回、
what_methodsっていうgemをRUBYOPT変数に追加したからだと思う。

調子に乗るんじゃなかった・・・ではなく、
解決方法を探してみる。
what_methods がないと言っているんだから、
bundleのlibフォルダにwhat_methodsを追加してあげよう。
what_methodsを二個持ちになるので、たとえばwhat_methodsをupdateしたときは、
手動でbundleのlibフォルダ内what_methodsを更新してあげないといけない。

そういうリスクはあるけれども、what_methodsはupdateする見込みもないので、
libに入れる方針で行きます。
弱気なときは「ですます調」


 

RUBYOPT変数の確認

システム変数で定義した「RUBYOPT」↓

C:\>echo %RUBYOPT%
-rwhat_methods


budleがこの値を読みにいっている↓

$  bundle exec env
RUBYOPT=-Ic:/Ruby200/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib 
  -rbundler/setup -rwhat_methods ←これ

what_methodsって「どこ」の「何」?

$ gem which what_methods
c:/Ruby200/lib/ruby/gems/2.0.0/gems/what_methods-1.0.1/lib/what_methods.rb

はあ。
/what_methods.rbファイルをコピーすればいいのか。

 

bundleのlibフォルダにwhat_method.rbをコピー

C:.
│  bundler.rb
│  what_methods.rb ←コピーした
│
└─bundler
    │  capistrano.rb …

解決ー

$ bundle exec rackup
[2013-08-31 08:30:18] INFO  WEBrick 1.3.1
[2013-08-31 08:30:18] INFO  ruby 2.0.0 (2013-06-27) [i386-mingw32]

動いたぞ!
f:id:sekaiya:20130831161855j:plain
 

参考:同じエラーの人がいた

http://ryopeko.hatenablog.com/entry/20120924/1348477185



しんどいよ。。
この日々の果てに何があるんだ。。