# Ruby on M1 MacBook

看起来有不少尝鲜购入M1 MacBook的朋友装上了x86的homebrew,导致在编译Ruby时遇到了错误。事实上,如果使用了正确的ARM64 Homebrew,就已经可以正常地编译使用rbenv+Ruby了。

My Ruby Environment

系统自带的是Ruby-2.6.3,我已经成功使用rbenv安装了2.7.2用来写作Jekyll,并且准备用3.0.0来继续开发我的Rails项目。

# 安装步骤

# 1. Homebrew

Ruby编译需要安装ARM64版本的openssl,所以需要安装3.0.0以上版本适用于Apple Silicon的Homebrew。默认运行官方网站的脚本即可安装正确版本的Homebrew,新版Homebrew的工作目录在/opt/homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

脚本全自动运行,按照提示安装即可,可以使用brew -v查看brew版本,并确保brew被安装到了/opt/homebrew

$ brew -v
Homebrew 3.0.1-93-g53d840c
Homebrew/homebrew-core (git revision 70345; last commit 2021-02-17)
Homebrew/homebrew-cask (git revision 0ab858; last commit 2021-02-18)
$ which brew
/opt/homebrew/bin/brew

# 2. 安装rbenv、readline和openssl

接下来使用上一步安装的Homebrew安装rbenv。

brew install rbenv

使用ruby-build编译ARM64的Ruby还需要安装对应的ARM64版本readline和openssl。

brew install readline
brew install openssl

然后将下述的环境变量添加到~/.zshrc的末尾。

# ~/.zshrc
# rbenv
export RBENV_ROOT=/opt/homebrew/opt/rbenv
export PATH=$RBENV_ROOT/bin:$PATH
eval "$(rbenv init -)"
# Use native openssl libraries for building
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/homebrew/opt/openssl@1.1"

运行source ~/.zshrc或者重启Terminal来使环境变量生效。

# 3. 安装Ruby

此时安装2.7.2及以上版本Ruby只需直接运行rbenv install (version)即可。

# Example
rbenv install 2.7.2
rbenv global 2.7.2
rbenv rehash

如果需要安装更低版本的Ruby,则要额外添加一个FLAG。

# Example
RUBY_CFLAGS="-Wno-error=implicit-function-declaration" rbenv install 2.5.3

# 代理

如果安装过程出现SSL错误,那么你可能需要代理来下载Ruby源码。将下面的代码添加到~/.zshrc的末尾,将ip:port替换成你的代理服务器ip与端口。

# ~/.zshrc
export http_proxy="http://ip:port"
export HTTP_PROXY=${http_proxy}
export https_proxy=${http_proxy}
export HTTPS_PROXY=${http_proxy}

同样地,运行source ~/.zshrc或者重启Terminal来使环境变量生效,然后再重复上一步。

# 皆大欢喜

此刻运行ruby -v,就可以发现刚才安装的ruby已经可以运行,开始愉快的bundle吧!

开工是不会开工的,只会装好了环境就开始摸鱼这样子。

参考:GitHub/ruby-build#1691