2

我在 RVM 环境中运行 Rails 3.2.1 和 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、耙子-10.0.3

所以我安装了一个 rake 10.0.2 版本,我的主应用程序 gemfile.lock 调用 rake(10.0.2) 并且当我运行 bundle exec rake routes 它确实有效(大概运行 10.0.2?),但是当我运行一条直线 rake 路线,Rails 似乎想要运行一个没有被要求的不同版本的 Rake。

所以我的问题是,鉴于调用已安装 Gem 的特定版本似乎不像您预期​​的那样,我如何知道实际运行的是哪个版本的已安装 Gem?

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

4

2 回答 2

6

此问题已在 ruby​​gems 2.0 中得到修复 - 可以尊重 Gemfile 以加载任何可执行的 gem。

至于您的问题,RVM 随附我的 gem 安装rubygems-bundler,如果可能,它应该自动解决依赖关系 - 如果未安装正确的版本,它将回退到您的问题,有一张票可以改变情况以在这种情况下引发异常 - https: //github.com/mpapis/rubygems-bundler/issues/37

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

于 2013-01-05T23:17:15.873 回答
3

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

有三种解决方案:

  1. 使用bundle exec rake这将始终使用您的 Gemfile 中的版本
  2. 使用捆绑器 binstubs: bundle --binstubs. 这会./bin在您的项目中创建一个文件夹。您现在可以从 Gemfile 访问指定 gem 版本的二进制文件。你可以打电话给 rake./bin/rake
  3. 卸载较新的版本,使二进制文件指向 Gemfile 中的那个

编辑:正如您所提到的,您还可以创建单独的 gemset 来推迟问题。有时,当您更新分支上的 gem 然后切换时,您仍然会收到错误。

于 2013-01-05T19:39:16.250 回答