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.rbconfig/environments/development.rbに色々書く方法が見つかるのですが、どれもうまく動きませんでした。

幸い、この機能を提供してくれるgemがあるのでそれを使いましょう。

teohm/require_reloader

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側のソースコードを変更したあとでサーバーの再起動は必要なくなります。