Ruby on rails 3 Rails未在gem文件中运行gem

Ruby on rails 3 Rails未在gem文件中运行gem,ruby-on-rails-3,gem,rvm,Ruby On Rails 3,Gem,Rvm,我在RVM环境中运行Rails 3.2.1和Ruby 1.9.2-p290 在我的dev文件夹中,我有许多不同的Rails应用程序,它们都运行上述程序,但我没有创建单独的gemset 我用自己的gemfile创建了一个新的应用程序,运行了bundle安装等,在我回到我最初开发的主应用程序之前一切都正常 当我现在做一个rake路由时,我得到了错误 rake aborted! You have already activated rake 10.0.3, but your Gemfile requi

我在RVM环境中运行Rails 3.2.1和Ruby 1.9.2-p290

在我的dev文件夹中,我有许多不同的Rails应用程序,它们都运行上述程序,但我没有创建单独的gemset

我用自己的gemfile创建了一个新的应用程序,运行了bundle安装等,在我回到我最初开发的主应用程序之前一切都正常

当我现在做一个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的每个gems的文件夹

所以我安装了一个版本的rake 10.0.2,我的主应用程序gemfile.lock调用rake(10.0.2),当我运行bundle exec rake routes时,它确实可以工作(假定运行10.0.2?),但当我运行一个直rake routes时,Rails似乎想要运行一个不同版本的rake,而不是被要求运行

因此,我的问题是,鉴于调用特定版本的已安装Gem似乎没有达到预期效果,我如何知道实际运行的是哪个版本的已安装Gem


(另外,我想如果我在同一个RVM空间中开发不同的应用程序,我可能应该为每个应用程序创建单独的gemset?

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

有三种解决方案:

  • 使用
    bundle exec rake
    这将始终使用您的GEM文件中的版本
  • 使用bundler-binstubs:
    bundle--binstubs
    。这将在项目中创建一个
    /bin
    文件夹。您现在可以从gem文件访问指定gem版本的二进制文件。您可以使用
    /bin/rake
  • 卸载较新版本,以便二进制文件指向您的文件中的版本

  • 编辑:如您所述,您还可以创建单独的宝石来推迟问题的解决。不过,有时当您更新分支上的gem,然后切换时,您仍然会收到错误。

    这个问题在rubygems 2.0中已修复-加载任何可执行gem时,都可以考虑Gemfile

    至于您的问题,RVM随my gem installed
    rubygems bundler
    一起提供,如果可能的话,它应该自动解决依赖关系-如果没有安装正确的版本,它会退回到您的问题上,在这种情况下,有一张票可以更改情况以引发异常-


    基本上-确保在项目中执行任何操作之前运行
    bundle install
    ,并且
    rubygems bundler
    将确保运行正确版本的gems。

    我的问题是安装了rake 10.0.2,但另一个Rails应用程序也导致安装了10.0.3,因此,即使在我的原始应用程序中运行bundle安装,我仍然会遇到上述错误。运行gem列表的相关行是:rake(10.0.3、10.0.2、0.9.2.2ruby、0.8.7)。看起来,正如Yves Senn在下面所说的那样,Rails运行的是最新版本的gem,而不管gem文件中有什么;gem重新生成容器。如上所述,它应该注意选择合适的rake版本。啊,我没有意识到你必须单独安装rubygems bundler。这是有道理的,thanksrvm在默认情况下安装了rubygems bundler,如果ruby是在非常旧的rvm中编译的,您可能会丢失它,否则它可能是一个bug,应该报告以供调查