自前のgemをRailsアプリと並行して開発するワークフロー
移転しました →
Railsアプリケーションを書いていて一部機能をgemに切り出したほうがいいんじゃないか、という場面に遭遇したのでローカルでgemを作りました。
Railsアプリケーション側ではbundlerでローカルにあるソースをrequireして使うことができます。なんでgithub等を介する必要はありません。さらに、サーバーの再起動無しにgem側のソースの更新を反映する方法もあるので、アプリケーションから切り離したgemであることを意識することなく開発をすることができます。
まずgemを作る
$ pwd /path/to/gems # ここにいるとする $ bundle gem piyopiyo
bundlerでローカルのgem指定する
# Gemfile gem 'piyopiyo', path:"/path/to/gems/piyopiyo"
サーバーの再起動無しにリロードする
ググるとconfig/application.rb
やconfig/environments/development.rb
に色々書く方法が見つかるのですが、どれもうまく動きませんでした。
幸い、この機能を提供してくれるgemがあるのでそれを使いましょう。
# Gemfile group :development do gem 'require_reloader' end
Gemfile
に追記してbundle
します。
次に、config/environments/development.rb
に1行追記します。
# config/environments/development.rb AppName::Application.configure do # ... RequireReloader.watch_local_gems! # ... end
一旦サーバーを起動しなおせばreloaderが有効になります。それ以降はgem側のソースコードを変更したあとでサーバーの再起動は必要なくなります。