My External Storage

Mar 21, 2018 - 2 minute read - Comments - RubyOnRails Ruby

[Ruby]ローカルで修正したgemのコードをbundle installする

Railsのプロダクトが参照しているgemを修正しながら開発する必要が出てきた。
ローカルで編集して未コミット状態のコードを含んだのgembundle installする方法をまとめる。

TL;DR

  • bundle installするときローカルで修正中のgemのコードを取り込むようにしたい。
  • その1 Gemfileの設定にpath: '../path/to/target_gem'を追加する
  • その2 bundle configを使う

やりかた その1 Gemfileを変更する

変更したGemfileをコミットしないように注意できるならばGemfileを直接変更する。
ローカルのコードを参照するにはGemfile内の対象のgemのインストール定義にpath:を追加してファイルパスを与えるだけ。
git:でリポジトリを明示的に参照している場合はその参照は消しておく。

# Gemfile内にあるローカルのコードを参照してほしいgemの定義
-  gem 'target_gem', git: 'ssh://git@github.com/USER/target_gem.git'
+  gem 'target_gem', path: '/path/to/target_gem'

あとは通常通りにgemを再取得する。

$ bundle clean
$ bundle install --path vendor/bundle

やりかた その2 bundlerの設定を変更しておく

bundlerの設定で、ローカルのコードを見るようにしておくことができる。
Gemfileがあるディレクトリで以下のように行う。

$ bundle config --local local.target_gem  /path/to/target_gem

gemのコードの編集状態のチェックが有効になっているとめんどくさいのでoffにする。

$ bundle config --local disable_local_branch_check true

あとは「その1」同様に通常通りにgemを再取得する。

$ bundle clean
$ bundle install --path vendor/bundle

こちらの場合、用がすんだらbunderの設定を元にもどすこと

$ bundle config --delete local.target_gem
$ bundle config --delete disable_local_branch_check

終わりに

Gemfileの変更をコミットしないように気をつけるのか、終わった後bundle configを忘れないように気をつけるのか、どちらのほうがラクかは個人のお好みで。
今設定してあるbundleの設定はbundle configで確認できる。また、bundle config --deleteはglobalな設定かlocalな設定かは見てくれないみたい。。。

$ bandle config --help
...
Executing bundle config --delete <name> will delete the configuration in both local and global sources. Not compatible with --global or --local flag.
...

参考

Work against local gems without modifying your Gemfile
https://coderwall.com/p/tqdrhq/work-against-local-gems-without-modifying-your-gemfile

bundle config
http://bundler.io/v1.16/bundle_config.html

bundle config ローカルGitリポジトリ
http://ruby.studio-kingdom.com/bundler/bundle_config/#local_git_repos

関連記事