Install Ruby2.0 and Rails 4.0 on OX S Part 1


*本文主要介绍安装rbenv和Ruby2.0的过程。*

Ruby 2.0都出来好一段时间了，咱也赶个时髦刷新一下，现在用的版本还是1.8.7呢。

安装环境：MBP OX S 10.8.3

#1. 事先准备
有些东西是前提条件，需要保证完成如下两个包的安装。

##1.1. Command Line Tools
编译Ruby需要c编译器，所以要在系统里提前安装Xcode并安装Command Line Tools

##1.2. ruby-build
编译Ruby用的，它是一个rbenv的plugin，实际上rbenv install命令就是它提供的。

>$ brew install ruby-build

#2. 安装rbenv和需要的包

##2.1. 什么是rbenv？
简单来说，因为Ruby的稳定版和开发版本比较多，所以有很多需要同时支持几个版本的需求，rvm和rbenv就是干这个的。
rbenv年纪小于rvm，设计之初就是以简单为主，比如连编译ruby都不是自己来做，而是使用了ruby-build。另外，更重要的是它和[Bundler](http://gembundler.com/)配合的很好，这对Rails开发者来说很重要。

##2.2. 安装rbenv

mac下可以直接用brew安装rbenv，还算方便，只需如下命令即可：

> $ brew install rbenv

但是，有些工作还是需要手工来做的，比如执行上面这条命令后，会打印出如下信息：

>To enable shims and autocompletion add to your profile:
  if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

所以我们需要做的下一步就是把***"if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi"***这行加到~/.profile文件里，最后的profile文件可能会像这样：

>$ cat .profile 
\# for rbenv
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

上述安装完成之后，通过如下命令就可以另起一个shell进行后续操作了：

>$ exec $SHELL -l

***备注：***
关于rbenv的更多内容和使用方法请参考 [rbenv的主页] (https://github.com/sstephenson/rbenv)。

##2.3. 安装openssl等包

为了使Ruby和Rails等正常运行，需要安装openssl等包。

###2.3.1. 安装openssl和readline
*readline是为了在irb等输入亚洲语言的*

>$brew install readline openssl

###2.3.2. 安装curl-ca-bundle
在命令行里执行***"brew install curl-ca-bundle'***即可：

> $ brew install curl-ca-bundle
To use these certificates with OpenSSL:
  export SSL_CERT_FILE=/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt

然后，拷贝证书文件：
>$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

***重要***
上面这个命令是否必须请各自尝试，根据网上资料，如果是brew安装的openssl，可能会有问题，需要执行这条拷贝命令。
我执行了这条语句，在访问https的网站时候能正常访问，详见本文最后部分。但这不一定说如果你不执行这条命令就不能正常运行。

#3. 安装并设置Ruby2.0 

上面的各种准备完成之后，就可以安装Ruby了。

##3.1. 安装Ruby2.0包
首先，通过rbenv 命令来确认可以使用的版本都有哪些：

>$ rbenv install -l | grep "2\\.0\\.0"
  2.0.0-dev
  2.0.0-p0
  2.0.0-p195
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  rbx-2.0.0-dev
  rbx-2.0.0-rc1

从上面命令结果可以看出来，2.0的版本很多，我们选择最新的p195来安装。

安装某一版本的Ruby使用***rbenv install VER*** 即可，其中***VER***是版本号在这里。

安装的时候，需要指定编译选项。我们通过编译选项指定了openssl的位置。

>$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=\`brew --prefix openssl\` --with-readline-dir=\`brew --prefix readline\`" rbenv install 2.0.0-p195
Downloading ruby-2.0.0-p195.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p195.tar.gz
Installing ruby-2.0.0-p195...
Installed ruby-2.0.0-p195 to /Users/liubin/.rbenv/versions/2.0.0-p195

***重要***
RUBY_CONFIGURE_OPTS是传给ruby-build的环境变量，主要是为config（编译用）设置参数。网上有资料用的不是RUBY_CONFIGURE_OPTS，而是CONFIGURE_OPTS，具体这俩个参数的区别，就是RUBY_CONFIGURE_OPTS设置的参数只会影响MRI（Matz' Ruby Implementation），只会传给Ruby，而不会给其它lib。
具体参见[ruby-build](https://github.com/sstephenson/ruby-build)的主页里对这两个参数的说明。

##3.2. rehash
rbenv安装包之后，需要rehash：

>$ rbenv rehash 

命令很简单，但是这里我们还是简单了解下rehash是干什么的及为什么需要它。

简单来说，rbenv通过shims机制，在系统和各个版本间做个link，即解决了如何在用户输入ruby等命令后找到对应的真正的ruby执行体。
shims存放在***${RBENV_ROOT}/shims***下面，里面有ruby，gem，irb等命令，都是脚本文件，可以自己查看。

在两种情况下需要rehash，一是安装一个新版本的Ruby之后，第二个就是在安装某些提供了os命令（即非简单lib）的gem包，这些包会提供命令，所以会影响$PATH，所以也必须放到shims下。这两个场景，都需要进行rehash操作。

当然，每次都rehash是挺麻烦的，而且最关键最重要的是如果漏了的话会导致命令等不能执行。
还好，有这么个gem，叫做**rbenv-rehash**，利用它可以实现在每次安装gem后自动执行rbenv的rehash操作。

我们可以通过gem安装rbenv-rehash：

>$ gem i rbenv-rehash
Successfully installed rbenv-rehash-0.3
Parsing documentation for rbenv-rehash-0.3
1 gem installed

更多关于rehash的内容，可以参考[rbenv的主页里关于rehash的说明](https://github.com/sstephenson/rbenv#rbenv-rehash)

##3.3. 设定系统默认Ruby版本
系统里有多个Ruby版本存在的时候，我们需要设置一个默认的使用版本。

###3.3.1. 查看当前Ruby版本
通过**rbenv versions**命令来查看系统已经安装的版本和当前的默认使用版本：

>$ rbenv versions
* system (set by /Users/liubin/.rbenv/version)
  2.0.0-p195

可见，现在版本还是原来的，而不是我们新安装的版本。
###3.3.2. 设置系统的默认Ruby版本
通过**rbenv global**命令来设置系统默认的Ruby版本：

>$ rbenv global 2.0.0-p195 

再通过***rbenv versions***命令来确认上面的修改是否生效了：

>$ rbenv versions
  system
* 2.0.0-p195 (set by /Users/liubin/.rbenv/version)
>$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]

可见，当前系统默认版本已经是Ruby2.0了。


#4. 确认安装是否正确

其实主要是确认openssl是否可用，因为这个功能被很多地方用到。

>irb(main):002:0> require 'openssl'
=> true
irb(main):005:0> open('https://www.google.com/').read

以上命令如果不出问题，说明安装基本正常了。

另外，可以用这句话来确认是否系统里可以正常处理YAML

>require 'psych'


#5. 总结
rbenv很简单，很方便。不过，话说谁没事老换Ruby版本呢？


至此，Ruby2.0的安装可以说是告一段落了，下面将会安装Rails4.0，请关注后续文章。


参考文章
1. [rbenv を使って ruby 2 系 をインストール、ついでに rails4 までやってみる一部始終] (http://inokara.hateblo.jp/entry/2013/04/21/023840)
2. [rbenv主页](https://github.com/sstephenson/rbenv)