bundlerの疑問点とか色々メモ

bundlerのgemのインストール先ってどこ?


普通は、rvm等で標準で指定されている場所

bundle show ${gem名}


path オプション で格納先を変更できる

bundle install --path vender/bundle

Gemfile.lockって何?


初回の bundle install で生成される
全ての開発環境と運用環境で使用するgemを統一する為に使用される
bundle install した時の依存関係まで含めた、全てのgemのバージョン指定と取得先が格納されている
Gemfile.lockがあると、それ以降はそれを元に、gemがインストールされる

で、結局 Gemfile.lock はリポジトリに含めるべきなの?

中の人の談話


Clarifying the Roles of the .gemspec and Gemfile « Katz Got Your Tongue?


和訳
LangTurn: gemspecとGemfileの役割をはっきりさせておく

  • gemを開発するときは、バージョンを厳密に定義し過ぎると(様々な環境の)利用者が困ることがあるので、含めない
  • アプリを開発するときは、どの環境でも同じソースの同じGemが使えるようにするべきなので、含める
gemのインストールオプションが環境によって異なるので、その辺で困ることがあるよね。--with-mysql-dir とか


理想的にはその辺の環境も合わせるべきなのかな
環境依存のオプションがあるgemがない場合は、入れちゃって良さそう

デプロイの時の話


deploymentオプションを付けて、bundle install する

bundle install --deployment


Ruby - bundlerでの運用方法 - Qiita


bundle install --deploymentすると、vender/bundle以下にgemがインストールされる。
また、.bundle/configにBUNDLE_FROZEN="1"が追加される。
deploymentオプションをつけた場合は、Gemfile.lockを元にgemがインストールされる。
deployment付きで実行された環境で、Gemfileを書き換えて新たにgemをインストールすることはできない。

開発用のgemを本番に入れたくない


withoutオプションをつければ良いはず

bundle install --without development --deployment


Bundler: The best way to manage a Ruby application's gems


そんな感じ