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