今天正巧点到@happypeter大哥的 casts http://happycasts.net/episodes/75
rbenv 介绍很简单可以略过。。但所说的和 rvm 比较很有共鸣。特别是评论里的那句(不像 rvm 直接有 gemset 功能,和 bundler 发生功能重叠),以前就觉得这样很冲突(记得当初头痛过 gemset 和 bundler 的区别)~
当初试过开发环境(rbenv)后因 cap 部署生产环境时(rvm 限定。。不让我改)的时候碰到问题而放弃了~
话说大家有碰到这类问题不(具体什么问题很久以前我也忘记了)~
还有大家是像 Peter 这样全力支持 rbenv 的多还是觉得 rvm 用久了顺手的多~
我目前的情况是本地用 rbenv, 线上 (公司) 用 rvm。但是它们的 gemset (rbenv 有 gemset 的 plugin) 功能都不用。
从来都是 bundle install --path=vendor/bundle --binstubs=.binstubs
。
Gemset bundler 哪里重叠了?同问。 只是 pd 环境确实就不需要 gemset 了,因为使用 CAP 后,gem 都可以安装到单独的 bundle 目录里面。各个 APP 互不干扰。
Bundler 的作用:依赖声明、自动解依赖、依赖隔离 Gemset 的作用:系统 gem 隔离
显然重复了,除非你要维护没使用 bundler 的项目。 说 Gemset 和 Bundler 没重叠的都在 Rails2 和 3 一起用么?即使 Rails2 也可以用 bundler。
使用 bundle install --path=vendor/bundle --binstubs
以后,我遇到以下问题
ery@Ery-ThinkPad:awebook$ ruby -I test test/functional/companies_controller_test.rb
/home/ery/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:51:in `require': cannot load such file -- spork (LoadError)
from /home/ery/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:51:in `require'
from /home/ery/Documents/awebook/test/test_helper.rb:3:in `<top (required)>'
from /home/ery/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:51:in `require'
from /home/ery/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb:51:in `require'
from test/functional/companies_controller_test.rb:3:in `<main>'
我估计是无法加载 spork gem,因为 gem path 中没有加载 vendor/bundle
我们的项目很多,我不能每次都手动加载 特定的项目的 vendor/bundle
吧
也许 bundle 有什么办法,可能我不知道,
我曾想,可以在 test/test_helper.rb
中 加载 bundle 环境,但是我觉得似乎这不太好。
你们是怎么解决这个问题的?
#31 楼 @ery 这样讨论就要追溯到 bundler 为什么要产生了。
Bundler maintains a consistent environment for ruby applications. It tracks an application's code and the rubygems it needs to run, so that an application will always have the exact gems (and versions) that it needs to run.
Bundler 的目的就是让应用自包含能够让 app 正确运行的 gem,不去依赖系统环境。而 gemset 和 rubygems 都是系统依赖,你的系统环境和其他人的系统环境可能不一样。
你的应用代码(Rails)是依赖 bundler 的,test 本身就没有正确构建出应用的运行环境。不要说 gemset 可以,gemset 在没有 bundler 做依赖声明的情况下如何保证你使用的 gem 版本和其他人使用的 gem 版本一致?
简单的说: