Rails没有在Gemfile中运行gem

时间:2013-01-05 19:13:44

标签: ruby-on-rails-3 gem rvm

我正在运行Rails 3.2.1& RVM环境中的Ruby 1.9.2-p290

在我的dev文件夹中,我有许多不同的Rails应用程序,都运行上面的内容,但我没有创建单独的gemsets

我用自己的gemfile创建了一个新的应用程序,运行了bundle install等等,所有这些都没问题,直到我回到原来正在处理的主应用程序

当我现在做rake路线时,我收到了错误

rake aborted!
You have already activated rake 10.0.3, but your Gemfile requires rake 10.0.2. Using bundle exec     may solve this. 

我想我知道如何回到正轨,但这是我不明白的地方:

当我查看.rvm / gems / ruby​​-1.9.2-p290 / gems文件夹时,我可以看到rake-0.8.7,rake-0.9.2.2,rake-10.0的每个宝石的文件夹.2,rake-10.0.3

所以我安装了一个版本的rake 10.0.2,我的主应用程序gemfile.lock调用rake(10.0.2),当我运行bundle exec rake路由时它实际上工作(假设运行10.0.2?),但是当我运行直接的rake路线时,Rails似乎想要运行不同版本的Rake而不被要求。

所以我的问题是如何知道安装Gem的哪个版本实际上正在运行,因为调用已安装的Gem的特定版本似乎没有按照您的预期执行?

(另外,我想如果我在相同的RVM空间内开发不同的应用程序,我应该为每个应用程序创建单独的gemsets?)

2 个答案:

答案 0 :(得分:6)

在rubygems 2.0中修复了这个问题 - 可以尊重Gemfile加载任何可执行的gem。

至于你的问题RVM附带我的gem安装rubygems-bundler并且如果可能的话它应该会自动解决依赖关系 - 如果没有安装正确的版本,它会回退你的问题,有一张票可以改变这种情况来提高在这种情况下的例外 - https://github.com/mpapis/rubygems-bundler/issues/37

基本上 - 确保在项目中执行任何操作之前运行bundle installrubygems-bundler将确保运行正确版本的gem。

答案 1 :(得分:3)

问题是,当您安装了同一个gem的多个版本时,您将执行的二进制文件rake始终是最新版本。如果您的应用程序依赖于该gem的旧版本,则无法激活它,因为已经加载了较新版本。

有三种解决方案:

  1. 使用bundle exec rake这将始终使用Gemfile中的版本
  2. 使用bundler binstubs:bundle --binstubs。这会在项目中创建一个./bin文件夹。您现在可以从Gemfile访问指定gem版本的二进制文件。您可以使用./bin/rake
  3. 拨打rake
  4. 卸载较新版本,以便二进制文件指向Gemfile中的二进制文件
  5. 编辑:正如您所提到的,您还可以创建单独的gemsets来推迟问题。有时候,当您更新分支上的gem然后切换时,您仍然会收到错误。