【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)
これは前回、
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]
動いたぞ!