如何强制机架围绕通常的“你已经激活机架…”的bug?

这是一个常见问题,但没有一个答案似乎可以解决这个问题。 我很平常: You have already activated rack 1.4.1, but your Gemfile requires rack 1.3.6. Using bundle exec may solve this. You have already activated rack 1.4.1, but your Gemfile requires rack 1.3.6. Using bundle exec may solve this.

清除Gemlock文件什么都没做,再次运行bundle install没有做任何事情……运行bundle install --binstubs没有解决问题,因为你的app根“运行./bin/{rake|rails|etc”只是造成了更多错误。 有没有办法绕过这个看似常见的问题?

问题是这样的:

  • 您已安装(至少)两个版本的Rack。

  • 您的Gemfile需要一个版本(1.3.6)。 您当前的环境正在提供另一个版本(1.4.1)。

  • 当您的应用程序执行时,当前环境已经加载了1.4.1。

  • Bundler知道你需要加载1.3.6,但它无法加载它。 您可能无法加载同一个gem的多个版本,因此1.4.1版本因为首先加载而获胜。

  • Bundler向你抱怨。

卸载有问题的gem(例如gem uninstall rack -v 1.3.6 )。 更好的是,使用RVM和gemsets更好地隔离你的gem,你不会遇到这个问题。

尝试部署生产应用程序时遇到了同样的问题。 我正在使用rbenv来管理默认情况下安装到rbenv中的rubic环境独角兽。 Gemfile中列出的gem依赖项由bundler安装。 它发生这是导致问题。

我做的解决方法是从rbenv的环境中卸载unicorn并通过Gemfile安装它。 毕竟,我认为这种方法更干净,更直接。

如果您正在使用RVM,那么如果您在全局环境中定义一个与独角兽相同的依赖于机架的gem,然后定义每个项目的gemset,就会出现问题。 我认为这是因为rails 3.1的依赖(虽然我不确定)。 解决方案是从全局gemset卸载unicorn(或安装机架1.4.1的gem)并将其安装在每个项目的gemset中。

如果你使用的是bundler和RVM,你有两个选择: – 使用rails创建一个gemset,安装机架1.4.1的gem(最适合开发工作站) – 将依赖于机架1.4.1的gem放入Gemfile中并让捆绑到魔术。

从存储库(ejem.github)克隆项目时,此问题也很常见,因为它可能已经存在Gemsfile.lock。 所以它的gem可能与你的环境已经加载的gem不同。 所以,firts得到你的Gemsfile.lock的备份,然后将其删除并运行bundle install – withoutout production。它将根据GemFile安装你所有的dependecies。 请注意,如果应用程序已过时,则可能无法与计算机上的环境一起使用。

如果有关Spring的相同错误消息将您带到此处,即您收到类似于此消息的消息:

你已经激活了spring 1.4.0,但你的Gemfile需要spring 1.3.6。

解决方案与接受的答案相同:

 gem uninstall spring -v 1.4.0 

有时你需要做的就是安装gem。

我在openshift上遇到了这个问题并转到项目目录:

$ rhc ssh APP_NAME

$ cd app-root

$ gem安装GEM_NAME

之后应用程序正常启动。

打开Gemfile.lock,找到rack(1.3.6)的条目并删除它。