Представьте себе приложение Rack, которое при запуске создает экземпляры некоторых других приложений Ruby и сопоставляет маршруты с этими приложениями.Это приложение имеет зависимость Rack 1.2.2.
А теперь представьте, что мы разрабатываем субприложение, которое будет запускаться этим приложением.Он имеет зависимость от Sinatra 1.2.6 и использует Bundler.Это гемфайл бесполезный:
source "http://rubygems.org"
gem "sinatra", "1.2.6"
К сожалению, когда мы bundle install
, это субприложение, Bundler, не зная о зависимости родительского приложения от Rack 1.2.2, установит самую последнюю версиюстойки, совместимой с Sinatra 1.2.6: в настоящее время 1.3.2.Наш Gemfile.lock будет выглядеть следующим образом:
GEM
remote: http://rubygems.org/
specs:
rack (1.3.2)
sinatra (1.2.6)
rack (~> 1.1)
tilt (< 2.0, >= 1.2.2)
tilt (1.3.2)
PLATFORMS
ruby
DEPENDENCIES
sinatra (= 1.2.6)
Когда мы попытаемся запустить родительское приложение (которое запускает наше субприложение), мы получим:
You have already activated rack 1.2.2, but your Gemfile requires rack 1.3.2. Consider using bundle exec. (Gem::LoadError)
Как правильно справиться с этой ситуацией?Да, мы могли бы явно потребовать стойку 1.2.2, но мы бы фактически указали зависимость зависимости.Я бы предположил, что в идеале родительское приложение было бы драгоценным камнем, которое требовалось бы нашему подприложению, но в этой ситуации у нас нет возможности сделать это так.