WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

gem開発時におけるGemfile, Gemfile.lock, gemspecの取り扱いについての注意事項

   

GemのリポジトリにGemfile.lockをチェックインしない

アプリの開発では配置先によって利用するGemのバージョンが固定されていることが重要視されるため、Gemfile.lockはリポジトリにチェックインしたほうがいい。
しかし、gemライブラリの開発では依存関係を緩やかに定義し、柔軟性を持たせることが重要なポイントなのでGemfile.lockはリポジトリにチェックインしないほうがいい。

開発中のgemが依存するgemはGemfileではなくgemspecに記載する

gemライブラリの開発時、ライブラリが依存するgemはGemfileではなくgemspecの方に記載すべき。
これは、再帰的にBundlerがgemの依存解決を行うときにgemが持っているGemfileの情報は使われないため。

例えばfooというgemがbarというgemに依存しているときに、fooのリポジトリでは’bar’をgemspecではなくGemfileの方に記載していたとする。
このときにfooを利用するアプリケーションhogeで`bundle install`を行うとどうなるか。

hogeのGemfileには’foo’が記載されているため`bundle install`によりfooはインストールされる。
しかし、fooが依存している’bar’はインストールされない。

理由は前述のとおり、gemが保持しているGemfileの情報は依存関係の解消に用いられないため。
ただし、’foo’のgemspecに’bar’を記載していて、かつgemspecが読み込まれている場合は、hogeで’foo’をインストールしたときにfooが依存している’bar’もインストールされる。これは、gemspecはgemの依存関係解消の際に再帰的に参照されるため。

このことは下記のページで図説されているので、これを見るとイメージがつきやすい。
http://qiita.com/metheglin/items/32fe6042fb0416e04359

結論として、標題の通り「開発中のgemが依存するgemはGemfileではなくgemspecに記載」したほうがいい。

通常、bundle gemやrails plugin newなどで生成されたgemnのひな形ではRubygemsのソースとgemspecの一行だけが書かれているが、これをこのまま用いるのがいい。

source 'https://rubygems.org'

gemspec

まとめ

  • GemライブラリのリポジトリにGemfile.lockをチェックインしない
  • Gemライブラリが依存するGemはGemfileではなくgemspecに記載する

 - Ruby , , , , , ,