小试 rbenv

rbenv

https://github.com/sstephenson/rbenv

Why not RVM?

RVM用了很长时间,很不错,只是有时会闹心,比如说Gemsets.rvmrc文件,有时加上.pow,Ruby的版本时常被换掉,搞的莫名奇妙。
bundler已经可以很好的解决gems的版本问题,gemsets里多份相同gem存在,感觉是浪费空间。
所以打算在服务器上小试下rbenv,感受下这种轻。

UPDATE:

经过几天的小试,效果出奇的好,再也没有因.rvmrc 文件导致进项目目录后找不到 Ruby,需要重进执行一次 rvm 2.2.1@rails 的问题了。而且 rbenv 真的很轻,用下来完全没有添加学习负担。唯一不爽的地方就是 default 下载源总是被墙,还要手工替换。


安装

Ubuntu Server

1
2
3
4
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# rbenv install 是基于该plugin的,所以要一并安装。
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

更简的单办法是用下面这个脚本rbenv-installer来一键安装,会自动安装十大插件,方便快捷。

1
$ curl https://raw.githubusercontent.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash

然后,按提示,在.profile里配置环境变量。

1
2
3
4
5
6
export RBENV_ROOT="${HOME}/.rbenv"
if [ -d "${RBENV_ROOT}" ]; then
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
fi
ISSUE:: Ubuntu环境变量配置

Unicorn & Nginx 的启动脚本中,如果环境变量配置在.bashrc中,会无法使用,找不到PATH。将其添加到 .profile 里就可以了。上文中有关于环境变量的讲解。

重新加载环境变量

1
$ source ~/.profile

macOS 下可以通过 brew 来安装,不过实践后发现这个方法安装的路径归理的很乱,而且在使用 RubyMine 这样的软件时还要创建软链,不方便,所以不推荐。

1
$ brew install rbenv ruby-build

检查安装是否成功

1
$ type rbenv

升级

1
$ rbenv update


管理Ruby

安装

1
2
3
4
5
# 列出所有可安装的Ruby版本
$ rbenv install -l
# 安装指定版本
$ rbenv install 2.2.0

显示已安装的Ruby版本

1
2
3
4
5
6
$ rbenv versions
# 列出所有安装过的Ruby版本:
system
2.1.5
* 2.2.0 (set by /Users/lanvige/.rbenv/version)

删除

1
2
3
4
5
6
7
8
# 显示某版本的Ruby安装位置
$ rbenv prefix 2.2.0
# 直接删除一个目录就可以了
$ rm -rf
# 安装过ruby-build插件后,也可以用命令来删除
$ rbenv uninstall 2.2.0

使用

指定全局默认Ruby版本

1
$ rbenv global 2.2.0

如果有需要在一个特定项目里使用指定版本,可以通过以下命令:这条命令实际上在是当前目录下建了一个.ruby-version的文件,文件里记录了要使用的ruby版本 2.2.0

1
$ rbenv local 2.2.0

指定本次shell里使用的Ruby版本,本质是创建一个 RBENV_VERSION 的环境变量。

1
$ rbenv shell 2.2.0

取消shell的版本限定

1
$ rbenv shell --unset

rehash

每当切换 ruby 版本和执行 bundle install 之后必须执行这个命令,也可以通过 rbenv-gem-rehash 库来实现自动切换,上面的安装脚本里会安装这个插件。

1
$ rbenv rehash


其它备注

- 多 Rails 版本

在 RVM 中,可以为一个 Ruby 版本创建多个 Gemset,每个 Gemset 中可安装指定 Rails版本。但 rbenv 中如何管理多个版本的 Rails 共存问题。

安装 Rails

1
$ gem install rails -v 4.1.0.rc1

新版本安装成功后,可以使用该版本来创建新项目。

1
$ rails _4.1.0.rc1_ new newapp

- gemrc 配置

rbenv默认没有创建~/.gemrc文件,可以手工创建,并指定源为taobao.org,这样会很大大加快gem安装速度,内容为:

1
2
3
4
5
6
7
8
9
10
11
---
:backtrace: false
:benchmark: false
:bulk_threshold: 1000
:sources:
- http://ruby.taobao.org/
- http://rubygems.org/
:update_sources: true
:verbose: true
gem: --no-document

如果已经创建,只配置.gemrc全局略过rdoc&ri的安装,可使用下面命令

1
$ echo "gem: --no-document" >> ~/.gemrc

- Gem 安装位置:

和 RVM 不同,rbenv 没有 gemset 的概念,gems都装到每个 Ruby 版本对应的目录里,以ruby2.2.0 为例,gems 被安装到该目录。
~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems

- shims 的作用

该目录用来放置 gem rake ruby 等文件的 wrapper。

- macOS 下通过 Homebrew 安装时如何结合使用 RubyMine

RubyMine 会自动扫描 ~/.rbenv 目录来确定当前 Ruby 版本信息,但 Homebrew 却是将 rbenv 安装到 /usr/local/var/rbenv 下。通过创建 link 可解决这个问题。

1
$ ln -s /usr/local/var/rbenv ~/.rbenv


- Break the Wall

UPDATE: 20161220

方法一:(推荐)社区有人做了一个 Plugin,可以很方便的进行安装:

1
$ git clone https://github.com/andorchen/rbenv-china-mirror.git ~/.rbenv/plugins/rbenv-china-mirror

然后直接正常安装即可。

1
$ rbenv install 2.4.0

UPDATE: 20141219

方法二:rbenv提供了一个变量来配置下载地址,这样较为方便:

1
$ env RUBY_BUILD_MIRROR_URL=http://ruby.taobao.org/mirrors/ruby/ruby-2.2.0.tar.gz# rbenv install 2.2.0

修改下载配置文件:

如果下载 Ruby 太慢,可以通过修改 ruby-build 里配置文件来进行速度提升。2.2.0 对应的文件在~/.rbenv/plugins/ruby-build/share/ruby-build/2.2.0

1
2
3
install_package "openssl-1.0.1e" "https://www.openssl.org/source/openssl-1.0.1e.tar.gz#66bf6f10f060d561929de96f9dfe5b8c" mac_openssl --if has_broken_mac_openssl
#install_package "ruby-2.2.0" "http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz#e57fdbb8ed56e70c43f39c79da1654b2" ldflags_dirs standard verify_openssl
install_package "ruby-2.2.0" "http://ruby.taobao.org/mirrors/ruby/ruby-2.2.0.tar.gz#" ldflags_dirs standard verify_openssl

REF::


http://happycasts.net/episodes/75
http://ruby-china.org/wiki/rbenv-guide
https://coderwall.com/p/alfc_a
http://thepast.me/post/124963292
http://robots.thoughtbot.com/using-rbenv-to-manage-rubies-and-gems
http://liubin.org/2013/06/01/install-ruby2-0-and-rails-4-0-on-ox-s-part-1/
rbenv Plugins & Bundler integration