Как избежать избыточных объявлений зависимостей Bundler для Rack - PullRequest
9 голосов
/ 05 августа 2011

Представьте себе приложение 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, но мы бы фактически указали зависимость зависимости.Я бы предположил, что в идеале родительское приложение было бы драгоценным камнем, которое требовалось бы нашему подприложению, но в этой ситуации у нас нет возможности сделать это так.

Ответы [ 2 ]

1 голос
/ 31 октября 2013

Ваш "основной" процесс должен использовать bundle exec для запуска подпроцессов, как рекомендует сообщение об ошибке.

Это заставит новое приложение запускаться в контексте собственного Gemfile, а не в глобальном контексте самоцвета. В результате новое приложение будет запущено с использованием Rack 1.3.2 или более поздней версии, not Rack 1.2.2.

0 голосов
/ 06 марта 2012

Попробуйте удалить Rack 1.2.2 из локального гема

...