Rails 3的“捆绑安装”速度超快(需要1秒),但之后没有Rails吗? (使用rvm)

我正在使用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不会将rails作为gem安装? 但如果我输入script/rails -v则表明它是3.0.0

这是对的。 bundle install不会像传统意义上那样将Rails安装为gem。 现在解释原因。

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

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

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

就个人而言,我已经把这个别名化了,在一些命令之前两个字符是一个值得的权衡,以避免我认为的第七圈gem冲突地狱。

你的程序似乎是正确的(一定要使用新创建的gemset,通过rvm infovalidation,如果它不说gemset:’proj’,请执行rvm ree@proj ),所以我会坚持下去并尝试建议。 顺便说一句,rails与bundler完美安装。

我一直在与奇怪的行为系统gem和本地gem斗争,因为有很多捆绑用户,包括Yehuda Katz,导致这个全面的postA Tale of Abort Traps

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

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

Yehuda在post中说它是在新的捆绑版本中修复的,但我几天前就遇到过这种情况(bundler 1.0.0)。 希望我带来更多的帮助而不是混乱到桌子上:)