OSX中自带了一个ruby版本,但是由于这个ruby版本比较旧,并且使用起来总会有各种错误,于是想要安装一个新的ruby版本。
OSX上安装ruby主要有以下方式:
- 直接通过osx的包管理器brew进行安装。
- 通过chruby配合ruby-install进行安装管理多个版本ruby。
- 通过rbenv配合插件rb-build安装管理多个版本的ruby。
- 通过官方提供rvm(ruby version manager)进行管理。
ruby的版本安装和管理方式有很多中,建议只选用其中一种便可,不要混着用,容易导致命令版本的混用和配置错误。
这里我们采用第三种安装方式进行安装, 第三种方式最直观,没有那么多的自动化。其原理和管理也与jenv一致,对于熟悉这个java多版本管理工具的同学比较友好。
一. rbenv安装
rbenv安装可以通过brew包管理命令安装, 或者手动克隆仓库进行安装,这里直接使用克隆仓库的方式。
克隆rbenv的git仓库
1 2
mkdir ~/.rbenv git clone https://github.com/rbenv/rbenv.git ~/.rbenv
基于克隆出来的rbenv仓库进行编译
1
cd ~/.rbenv && src/configure && make -C src
添加path环境变量的执行路径
1 2
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile source ~/.bash_profile
小tips: 不管使用的是哪种shell,建议都在那个bash的配置文件中source一下~/.bash_profile,这样不管用哪种shell配置文件都能用同一个
执行初始化rbenv的初始化,这里主要做的就是配置各种环境变量
1
~/.rbenv/bin/rbenv init
重启shell窗口, 因为第4步中的各种环境变量需要重新初始化shell才能生效
检查安装是否完整
1
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
这个时候你的输出应该是下面这个样子的
1 2 3 4 5 6 7 8 9 10 11
Checking for `rbenv' in PATH: /Users/lee/.rbenv/bin/rbenv Checking for rbenv shims in PATH: OK Checking `rbenv install' support: not found Unless you plan to add Ruby versions manually, you should install ruby-build. Please refer to https://github.com/rbenv/ruby-build#installation Counting installed Ruby versions: none There aren't any Ruby versions installed under `/Users/lee/.rbenv/versions'. You can install Ruby versions like so: rbenv install <version> Checking RubyGems settings: OK Auditing installed plugins: OK
上面提示你,没有安装ruby-build,如果想支持rbenv install命令安装ruby的多个版本的话需要在安装ruby-build插件
二. ruby-build安装
新建rbenv插件文件夹
1
mkdir ~/.rbenv/plugins
克隆ruby-build插件仓库至rbenv的插件目录中
1
cd ~/.rbenv/plugins && git clone https://github.com/rbenv/ruby-build.git
这样就完成了安装了, 下面再执行上面的检查命令
1 2 3 4 5 6 7 8 9
~/.rbenv/plugins $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash Checking for `rbenv' in PATH: /Users/lee/.rbenv/bin/rbenv Checking for rbenv shims in PATH: OK Checking `rbenv install' support: /Users/lee/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20220426-3-g1038c07) Counting installed Ruby versions: none There aren't any Ruby versions installed under `/Users/lee/.rbenv/versions'. You can install Ruby versions like so: rbenv install 3.1.2 Checking RubyGems settings: OK Auditing installed plugins: OK
三. ruby安装
直接执行命令 rbenv install 3.1.2
, 便可以进行安装了。最后所有安装的ruby版本都会在 /Users/lee/.rbenv/versions/
目录下。
最后执行检查命令将会如下
1
2
3
4
5
6
7
~/.rbenv/plugins $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /Users/lee/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /Users/lee/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20220426-3-g1038c07)
Counting installed Ruby versions: 1 versions
Checking RubyGems settings: OK
Auditing installed plugins: OK
rbenv常用命令:
1
2
3
rbenv local [版本号] #设置当前文件夹的ruby版本
rbenv global [版本号] #设置全局ruby版本
rbenv versions #查看已安装的ruby版本
3.1 校验安装是否正确
通过which命令检验安装的版本是否正确
1
2
3
4
5
6
~ $ which ruby
/Users/lee/.rbenv/shims/ruby
~ $ which gem
/Users/lee/.rbenv/shims/gem
~ $ which bundler
/Users/lee/.rbenv/shims/bundler
可以看到成功正常安装后,命令指向的地址均为~/.rbenv
,安装与配置完成。
如果which命令输出的是一个函数, 或者指向的地址不是~/.rbenv
, 那就需要检查一下PATH环境变量设置是否正确。
四. 常见问题处理
4.1 openssl build失败问题
使用命令rbenv install 3.1.2安装ruby 3.1.2版本时openssl安装失败,原因是使用的这个openssl版本的一个bug,少了一个头部声明,详见test/v3ext.c fails to compile on MacOS11 arm64。
openssl 问题的通用办法:
确定旧版本
这个版本不行,那我们就换一个旧一点的openssl版本。下面是openssl的几个常用站点:
修改ruby-build配置,替换旧版本openssl
rbenv install xxx的是通过委托到ruby-build进行安装的。
ruby-build安装配置文件位于{ruby-build安装目录}/share/ruby-build/xxx版本号,我们修改3.1.2的配置文件如下:将openssl-1.1.1q换成opensslp版本,替换下载链接
1 2
install_package "openssl-1.1.1p" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1p.tar.gz" openssl --if needs_openssl_102_300 install_package "ruby-3.1.2" "https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz#61843112389f02b735428b53bb64cf988ad9fb81858b8248e22e57336f24a83e" ldflags_dirs enable_shared standard verify_openssl
重新执行rbenv install 3.1.2, 安装成功
1 2 3 4 5 6 7 8 9 10 11 12
rbenv install 3.1.2 Downloading openssl-1.1.1p.tar.gz... -> https://www.openssl.org/source/old/1.1.1/openssl-1.1.1p.tar.gz Installing openssl-1.1.1p... Installed openssl-1.1.1p to /Users/lee/.rbenv/versions/3.1.2 Downloading ruby-3.1.2.tar.gz... -> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz Installing ruby-3.1.2... ruby-build: using readline from homebrew Installed ruby-3.1.2 to /Users/lee/.rbenv/versions/3.1.2