Ruby [姨妈] 终于把 rvm 换成 rbenv 了

luikore · 2013年12月08日 · 最后由 luikore 回复于 2014年03月18日 · 12089 次阅读

后知后觉...

主要是 rvm 几点不太爽:

  • gemset 和 bundler 功能重复
  • autolib 太傻瓜
  • rubygems-bundler 自作聪明

rbenv 就没这些问题。brew install rbenv ruby-build rbenv-gem-rehash 改改启动脚本就好了,弄起来还挺简单的,重新安装 ruby 速度也飞快

CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)" rbenv install -k -v 2.1.0-dev

我去,必须 chruby 啊。

rvm 好像计划用 ruby 重写,搞不懂,为本来简简单单的事情弄个如此复杂的壳,吃饱了撑着。

#1 楼 @xds2000 chruby 除了没有 shim 外还有什么好处吗?

这段时间我也把 mac 和新服务器的 rvm 都换成 rbenv 了,体验中,估计不会换回 rvm 了

#1 楼 @xds2000 chruby 不认 .rvmrc 比较不爽 (好多项目都还没改成 .ruby-version)... 好像也没有 rbenv 那样可以 rbenv shell 切版本不影响默认版本的做法?

其实我觉得吧不用来回切换 ruby 环境的话用 ruby-install 也挺好的

我觉着用 10.9 自带的 Ruby,然后改改 $GEM_HOME 成 ~/.gem/ruby/2.0.0,并且把 $GEM_HOME/bin 加到 $PATH 就 OK 了

我选择 rbenv 的原因是 debian 里面有 rbenv,没有 chruby 和 rvm

@luikore chruby 是最简的。这就是好处。就是切换 ruby version 的功能。ruby-install 可以安装你需要的版本。

2 和 3 深有体会 一个版本控制承载了太多不必要的功能

我在 Linux 上几个月前就换成 rbenv 了 但是在 OS X 上几个月前尝试过一次,失败了。

#9 楼 @xds2000 这哥们真逗

How good is it? I don't know, I've been using it for less than 24 hours. Seems good.

#1 楼 @xds2000 我去,必须 chruby 啊。

#1 楼 @xds2000 太小众也不好啊,很多工具就不支持了,比如 pow

gemset 和 bundler 功能重复

也不能这么说吧。。。

不过 rbenv 是比较轻量

#15 楼 @blackanger 或者这样说?和 bundler 功能交叉,作为隔离环境又不如虚拟机

#16 楼 @luikore 回复好神速。 这么说到是有点道理。

#18 楼 @ashchan 选版本得自己改 .powrc 不方便

#19 楼 @doitian 恕我无知, rvmpow 一起用的时候是不用指定的吗?

#20 楼 @ashchan rvm 和 rbenv 都只要 .ruby-version 或者 .rbenv-version 这些文件指定版本就好了

#21 楼 @doitian 我在 chruby 下也是用 .ruby-version 的,跟 pow 结合的确需要在项目下放 .powrc 文件。不知道 rvm 下不用 .powrc 也可以根据 .ruby-version 来自动切版本,不明觉厉啊。

据小道消息,rubygmes 将来会把 bundler 的功能集成,以后就没 bundler 这东西了。

#22 楼 @ashchan 所以说太小众,和其它工具集成就会稍微麻烦点

话说以前装过多次 on my zsh + rvm 一直没出过问题,昨天重装了系统安装 rvm 失败才发现官网和 stackoverflow 上都说两者不太兼容。。。。

rbenv 也有坑,他的 gemset 很爽,支持继承关系,但是不支持 rubymine

#26 楼 @gene_wu 现在的 RubyMine 已经支持 rbenv 了。

#27 楼 @apexy 不支持 rbenv-gemset,就基本没用除非不用 gemset

#28 楼 @gene_wu 在 rbenv 下仍用 gemset,其实还是延用 rvm 的思想。完全可以不用,直接 bundle 就足够了。

而且这样同时 rubymine 也是完美支持的了。

#29 楼 @apexy 项目多就乱了

rubygems-bundler 自作聪明 +1

#31 楼 @jan 这个自作聪明是啥意思..?

我是从 rbenv 换到了 rvm.

原因是自己用 rbenv 编出来的老是不能在 irb 里面输入中文,虽然知道其根本原因是使用了错误的 readline 库,但是一直都处理不好,一怒之下就换了 rvm.

另外 rvm 良好的处理了多用户服务器环境下的管理。比如我用 root 安装 rvm 和 ruby, 但是用另一个普通用户运行 app 这种场景,rvm 能帮你搞定。而 rbenv 则需要你有一定的 SA 能力才能处理好。

真正让我选择 rvm 的原因是:

  • 它有 offline 安装的方法,对我来说很重要,我有很多机器都不能上外网。
  • 有一个 binary 功能,可以让我自己打包一个适应本地环境的 ruby, 避免在每个服务器上编译

再求教一下,列出的理由 2 和 3, 我其实没看懂。

#33 楼 @ruohanc 我这 readline 正常... 用 ruby-build 装不会出什么问题啊

我有 .bashrc 和 .zshrc 同时载入一个公共的 .profile, 如果把 rvm 环境脚本放到 .profile 中,每次升级 rvm 都会提示,很烦人,不得已就放了两份。

rvm 通过 autolib 管理依赖的,然后 rvm 就把依赖隐藏起来了不让你知道了,如果把 autolib 级别调低,明明装了一个 libyaml 但版本不是它喜欢的就不能通过很蛋疼。在 linux 上我完全可以在无管理员权限的状态下把所有依赖和 ruby 都编译好放到一个目录中交给 rbenv, 用 rvm 就不行。rbenv 有目录就可以切换了,拷贝 binary ruby 可以连带 gem 一起拷,而 rvm 的 gem 和 ruby 都不在一个地方的...

#34 楼 @luikore 我对依赖没啥想管的。所以我觉得 autolib 帮我整的挺好的。然后嘛,你都自己编译好 ruby 了,已经比较违反使用工具管理的初衷了嘛,这是何以呀。

继续问..理由 3 是啥意思..

#35 楼 @ruohanc rvm 自带了一个叫做 rubygems-bundler 的东西,结果 gem 带的可执行文件都会被它加上个 no exec wrapper 非常恶心,这个东西和新版本 rubygems 检查 Gemfile 的特性是打架的...

ok 基本搞定,Rbenv 系统级的安装,也解决了权限问题,使用了组权限。把需要完全控制 rbenv 的用户加入 rbenv 组就可以了

GIST: https://gist.github.com/crhan/8064624#file-rbenv-install-system-wide-sh

RBENV_PREFIX="/usr/local/rbenv"
RBENV_GROUP="rbenv"

## Install rbenv
git clone git://github.com/sstephenson/rbenv.git $RBENV_PREFIX

## Add rbenv to the path:
echo '# rbenv setup' > /etc/profile.d/rbenv.sh
echo "export RBENV_ROOT=${RBENV_PREFIX}" >> /etc/profile.d/rbenv.sh
echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh

chmod +x /etc/profile.d/rbenv.sh
source /etc/profile.d/rbenv.sh

## set rbenv group property
groupadd $RBENV_GROUP
chown -R :rbenv $RBENV_PREFIX
sudo find $RBENV_PREFIX -type f -perm /100 -exec chmod g+x {} \;
sudo find $RBENV_PREFIX -type f -perm /200 -exec chmod g+w {} \;
sudo find $RBENV_PREFIX -type d -exec chmod g+rwxXs {} \;

## Install ruby-build:
pushd /tmp
  git clone git://github.com/sstephenson/ruby-build.git
  cd ruby-build
  ./install.sh
popd

## Install Ruby 1.9.2-p290:
#rbenv install 1.9.3-p484
#rbenv global 1.9.3-p484

## Rehash:
#rbenv rehash

想问各位大大: 我在 centos6 下安装的 rbenv, 再用 rbenv 安装 ruby2.1.0 和 1.9.3 都没问题, 然后我用 gem install rails 也没问题, 但: 当我,rails new blog 的时候,报错了: /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:in require': /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-linux/digest/md5.so: undefined symbol: rb_Digest_MD5_Init - /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-linux/digest/md5.so (LoadError) from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:inrequire' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/railties-4.0.4/lib/rails/generators/app_base.rb:1:in <top (required)>' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:inrequire' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:in require' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/railties-4.0.4/lib/rails/generators/rails/app/app_generator.rb:1:in' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:in require' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:inrequire' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/railties-4.0.4/lib/rails/commands/application.rb:29:in <top (required)>' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:inrequire' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:in require' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/railties-4.0.4/lib/rails/cli.rb:15:in' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:in require' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:45:inrequire' from /home/zengfb/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/railties-4.0.4/bin/rails:9:in <top (required)>' from /home/zengfb/.rbenv/versions/2.1.0/bin/rails:23:inload' from /home/zengfb/.rbenv/versions/2.1.0/bin/rails:23:in `' 有同病相连的么,或者各位有什么建议

#39 楼 @u1384048594 大概是安装 ruby 前没把 openssl 装上的问题,参考:

sudo yum -y install sqlite-devel sqlite openssl openssl-devel readline-devel readline compat-readline5 libxml2-devel libxslt-devel libcurl curl wget git 
ruohanc rbenv system wide install (support for multi-user usecase) 提及了此话题。 04月03日 10:57
需要 登录 后方可回复, 如果你还没有账号请 注册新账号