避免Rack的冗余Bundler依赖声明

时间:2011-08-05 00:13:35

标签: sinatra bundler rack

想象一下Rack应用程序,它在启动时会创建一些其他Ruby应用程序的实例,并将路由映射到这些应用程序。此应用程序的Rack依赖性为1.2.2。

现在假设我们正在开发一个将由此应用程序运行的子应用程序。它具有1.2.6的Sinatra依赖性并使用Bundler。它的宝石文件是贫瘠的:

source "http://rubygems.org"

gem "sinatra", "1.2.6"

不幸的是,当我们bundle install这个子应用程序时,Bundler不知道父应用程序的Rack 1.2.2依赖性,将安装与Sinatra 1.2.6兼容的最新版Rack :目前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 个答案:

答案 0 :(得分:1)

您的“主要”流程应使用bundle exec启动子流程,就像错误消息建议的那样。

这将强制新应用在其自己的 Gemfile的捆绑上下文中启动,而不是全局gem上下文。因此,新应用程序将使用Rack 1.3.2或更高版本启动, Rack 1.2.2。

答案 1 :(得分:0)

尝试从gem local

删除Rack 1.2.2