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