ぴよログ

↓に移転したのでこっちは更新されません、多分。

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

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

teohm/require_reloader

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