瞎扯淡 姨妈贴 RVM rbenv 讨论

arthur_h · 2013年07月31日 · 最后由 cao7113 回复于 2014年01月09日 · 6844 次阅读

今天正巧点到@happypeter大哥的 casts http://happycasts.net/episodes/75

rbenv 介绍很简单可以略过。。但所说的和 rvm 比较很有共鸣。特别是评论里的那句(不像 rvm 直接有 gemset 功能,和 bundler 发生功能重叠),以前就觉得这样很冲突(记得当初头痛过 gemset 和 bundler 的区别)~

当初试过开发环境(rbenv)后因 cap 部署生产环境时(rvm 限定。。不让我改)的时候碰到问题而放弃了~

话说大家有碰到这类问题不(具体什么问题很久以前我也忘记了)~

还有大家是像 Peter 这样全力支持 rbenv 的多还是觉得 rvm 用久了顺手的多~

我觉得吧... production 环境里面不需要,development 环境里面用哪个都无所谓。

好快追求 index 都是灰色吗。。。@blacktulip

#2 楼 @Arthur_h 不一定要回复才会变灰啊...

我觉得开发环境和生产环境保持一致的习惯比较好,以前我直接在 OS X 下开发,现在都改用 Ubuntu 了...

我目前的情况是本地用 rbenv, 线上 (公司) 用 rvm。但是它们的 gemset (rbenv 有 gemset 的 plugin) 功能都不用。

从来都是 bundle install --path=vendor/bundle --binstubs=.binstubs

都用 rbenv

不像 rvm 直接有 gemset 功能,和 bundler 发生功能重叠

重叠神马呀

现在开发用 rvm,服务器用 bundler

#4 楼 @LarryLv 我觉得 bundle install --path=vendor/bundle 很好, 我之前从来没用过,我一直在用rvm gemset 我打算今后改用bundle install --path=vendor/bundle

#4 楼 @LarryLv 如果我使用 bundle install --path=vendor/bundle --binstubs 那我今后 启动服务器 就用 .\bin rails s 啦,有点麻烦

#9 楼 @ery 可以把 binstubs 指定的地址加到环境变量,然后直接 rails s 即可。

比如我总是指定 --binstubs=.binstubs,然后将 .binstubs 放在 $PATH 的最前面就可以了。

alias bi='bundle install --path=vendor/bundle --binstubs=.binstubs'
export PATH=.binstubs:$PATH

关于 rvm 和 rbenv,看这里:

完整版: http://jonathan-jackson.net/rvm-and-rbenv

#12 楼 @blackanger 暴走漫画是中国人发明的吗?

#13 楼 @kikyous 老外发明的吧。 P.S 你歪楼了。

简单的问题被 rvm rbenv 弄得恶心至极,不就切换一下环境变量的事!

Gemset bundler 哪里重叠了?

#1 楼 @blacktulip 生产环境部署多 app 很有用

#11 楼 @LarryLv 谢谢,真是好办法!

Gemset bundler 哪里重叠了?同问。 只是 pd 环境确实就不需要 gemset 了,因为使用 CAP 后,gem 都可以安装到单独的 bundle 目录里面。各个 APP 互不干扰。

标准答案:

  • mac 本地开发:rvm
  • 服务器部署:rbenv

Bundler 的作用:依赖声明、自动解依赖、依赖隔离 Gemset 的作用:系统 gem 隔离

显然重复了,除非你要维护没使用 bundler 的项目。 说 Gemset 和 Bundler 没重叠的都在 Rails2 和 3 一起用么?即使 Rails2 也可以用 bundler。

#21 楼 @hooopo 我喜欢 bundle install --path=vendor/bundle 因为她把所有依赖 Gem 装到了一个子目录下, 这样 ctags 更简单, 找源码,也更简单。

#22 楼 @ery 不用装在里面查源码也方便。并且平时只查 app 里的源码。特殊情况才查 gem 里的源码:

ack hello `bundle show --paths`

#23 楼 @hooopo #11 楼 @LarryLv

使用 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 环境,但是我觉得似乎这不太好。 你们是怎么解决这个问题的?

@ery Use Bundler.setup in test/test_helper.rb.

#26 楼 @LarryLv 谢谢,我已经用了,的确能解决这个问题, 但是通过修改代码,来解决这个问题,感觉不理想。

姨妈帖是指每月都会发一次的帖么?

#27 楼 @ery 代码是错的,为何不修改

#28 楼 @chairy11 是的。我看也有叫月经贴的。

#29 楼 @hooopo 代码是错的,这个答案是相对的, 如果 使用 rvm gemset 代码就是对的。 如果 使用 budler 代码就是错的。 那么 你觉得 到底是 代码错了,还是 bundler 错了?

#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 版本一致?

简单的说:

  1. 不使用 bundler,错了。
  2. 使用 bunlder,但是用法不正确,错了。

#32 楼 @hooopo 哈哈,谢谢你的分析,有点道理。 请问 你在 test_helper.rb 中 加载 bundle 环境了吗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号