bundler使う時、依存関係の根っこのgemほど下に書くべきらしい。

sinatra-rocketio -> (sinatra-cometio/sinatra-websocketio) -> sinatra-contrib -> sinatra -> rack
みたいな依存の階層関係があるgemから、複数のgemをGemfile/.gemspecに書いてしまうと、親のgemの方がメジャーバージョンアップした時に依存解決できなくなる事がある。


sinatra-rocketioのリポジトリで

bundle install
するとこういうエラーがでてた(もう直った)
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "sinatra":
In Gemfile:
sinatra-rocketio (>= 0) ruby depends on
sinatra (~> 1.3.0) ruby

sinatra-rocketio (>= 0) ruby depends on
sinatra (1.4.1)
何を言っているのかわからない・・


これがsinatra-rocketio.gemspec
gem.add_dependency "rack", ">= 1.5.0"
gem.add_dependency "sinatra", ">= 1.3.6"
gem.add_dependency "eventmachine", ">= 1.0.0"
gem.add_dependency "event_emitter", ">= 0.2.3"
gem.add_dependency "sinatra-contrib", ">= 1.3.2"
gem.add_dependency "sinatra-cometio", ">= 0.3.7"
gem.add_dependency "sinatra-websocketio", ">= 0.1.5"

これはsintra1.4がリリースされたが、sinatra-contribのgemspecがsinatra1.3系統の最新版を使うようになっているため。

上の行から解釈していくっぽいので、sinatra-contribをsinatraより上に書けばsinatra1.3.6が使われる。


というわけでこういう感じで書けばいい
gem.add_dependency "sinatra-cometio", ">= 0.3.8"
gem.add_dependency "sinatra-websocketio", ">= 0.1.6"
gem.add_dependency "sinatra"
gem.add_dependency "eventmachine", ">= 1.0.0"
gem.add_dependency "event_emitter", ">= 0.2.3"

これのおかげで、bundlerでインストールするとずっと0.0.3がインストールされちゃってたけど今の最新は0.0.8です