5

我正在使用 rvm,执行以下操作:

rvm install ree    <--- (Ruby Enterprise Edition), or this can be 1.8.7 or 1.9.2
rvm ree
rvm gemset create 'proj'
cd path/to/proj
bundle install

所以该项目中的 Gemfile 说:

gem 'rails', '3.0.0'

而且bundle install速度超快,报告

Using rails (3.0.0) 

但在那之后当我输入

$ rails -v
/Library/Ruby/Site/1.8/rubygems.rb:779:in `report_activate_error': Could not find RubyGem rails (>= 0) (Gem::LoadError)
    from /Library/Ruby/Site/1.8/rubygems.rb:214:in `activate'
    from /Library/Ruby/Site/1.8/rubygems.rb:1082:in `gem'
    from /usr/bin/rails:18

$ which rails
/usr/bin/rails

所以bundle install不将导轨安装为宝石吗?但如果我输入script/rails -v它显示它是 3.0.0

4

2 回答 2

12

这是对的。bundle install不会将 Rails 安装为传统意义上的 gem。现在来解释为什么。

当 Bundler 运行安装时,它会将 gems 安装到一个目录:~/.bundle/<type-of-ruby>/<version>/gems. 这与将它们安装到系统路径的正常方式不同。当 gem 安装在系统路径中时,可执行文件是可用的,因为该目录位于加载路径中。现在这是一件坏事,因为每个 gem只能有一个可执行文件。您是否安装了 SomeGem v2 但想使用 SomeGem v1 的生成器?太糟糕了。

Bundler 通过将它们安装到上述位置来解决这个问题,并且只需要它需要的特定版本的 gem(在 . 内部指定Gemfile。通过简单地运行rails,您正在尝试运行系统可执行文件(如 do 提供的那样gem install rails)而不是比 Bundler 之一(bundle install为 Rails 项目提供)。

要运行 Bundler 安装的那个,您必须bundle exec rails在包含Gemfile指定任何 Rails 版本的目录中像这样运行它。Bundler 将加载特定版本的 Rails,您现在应该能够并行运行它们,唯一的权衡是bundle exec命令的前缀。

就我个人而言,在我看来,在某些命令之前,我已将其别名为be和两个字符,这是避免宝石冲突地狱第七圈的一个值得权衡的选择。

于 2010-09-07T22:27:31.117 回答
0

您的程序似乎是正确的(确保也使用新创建的 gemset,通过 验证rvm inforvm ree@proj如果它没有说 gemset: 'proj' 则执行),所以我会伸出头来尝试一个建议。顺便说一句,rails 与捆绑器完美安装。

我一直在与奇怪的行为系统 gem 与本地 gem 作斗争,很多捆绑器用户也是如此,包括 Yehuda Katz,导致这篇综合性文章Abort Traps 的故事

简而言之,如果您在拥有 bundler gem之前运行 bundle install (得到“标准” gem not found 错误),然后执行gem install bundler,然后执行另一个 bundle install ,bundler gem 已安装到您的系统,而不是 rvm .

解决方案:删除.bundle,(并做gem卸载捆绑器?)。然后我会打开一个新术语,在安装包之前执行 rvm ree@proj 和 gem install bundler。

Yehuda 在帖子中说它已在新的捆绑器版本中修复,但我在几天前经历了这一点(捆绑器 1.0.0)。希望我带来的帮助多于混乱:)

于 2010-09-13T08:06:05.823 回答