Ruby 更新 High Sierra 后遇到的几个坑

w11th · 2017年06月30日 · 9916 次阅读

前段时间一个没忍住,把唯一的主力机更新了 High Sierra。更新完后一切正常,没有闪退,非有异常,APFS 还速度飞快,感觉非常良好。

可是好日子没过两天,就碰到了一地鸡毛。昨天想新建一个 Ruby 2.3.3、Rails 5.0 的工程,先是 Ruby 编译不过,后来又是 nokogiri 和 mysql2,全部安装完了启动 Rails,以为松了一口气,结果监控文件改动的一直报错。本来想搞事情的,结果时间都浪费在前戏了。

现在把这几个坑覆盘一下。说不定能有点用处,帮大家节省一点时间。

1. Ruby 编译不通过,提示 The Ruby openssl extension was not compiled.

这次更新,High Sierra 把 SSL 库从 OpenSSL 0.9.8zh 切换到 LibreSSL。而且通过 homebrew 安装的 OpenSSL 也是 keg-only 的,并且禁止通过 brew link openssl 添加软链接了(StackOver Flow)。所以 Ruby 编译的时候就无法找到 OpenSSL 库。

解决方法

用 homebrew 安装 OpenSSL,安装时指定 OpenSSL 库的位置。我用的是 rbenv,最后的命令如下:

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/usr/local/opt/openssl rbenv install 2.3.3

2. Nokogiri 编译不通过,提示 Running 'compile' for libxml2 2.9.4... ERROR

详细的错误信息:

Running 'compile' for libxml2 2.9.4... ERROR, review '/Users/austin/.gem/ruby/2.3.0/gems/nokogiri-1.6.8/ext/nokogiri/tmp/x86_64-apple-darwin15.3.0/ports/libxml2/2.9.4/compile.log' to see what happened. Last lines are:
========================================================================
    unsigned short* in = (unsigned short*) inb;
                         ^~~~~~~~~~~~~~~~~~~~~
encoding.c:815:27: warning: cast from 'unsigned char *' to 'unsigned short *' increases required alignment from 1 to 2 [-Wcast-align]
    unsigned short* out = (unsigned short*) outb;
                          ^~~~~~~~~~~~~~~~~~~~~~

Nokogiri 在试图编译自己下载的 libxml2 时出错了,后来搜索到了一个 Issue,跟我遇到的状况是一样的。

原因就是通过 homebrew 安装 xz,会同时安装一个包 liblzma,它会覆盖掉系统默认的包。Nokogiri 使用这个包编译的时候就会出错。

解决方法

方法 1: brew unlink xz 然后再安装 Nokogiri。因为 xz 是很多软件的依赖(比如 ag),所以卸载还比较麻烦。安装前 unlink 一下就好,安装完再 link 回来。

方法 2: gem install nokogiri --use-system-libraries 使用系统包安装。

3. Rails 工程更改文件后,文件监控系统报错: fsevent: running worker failed: wrong number of arguments (given 2, expected 1)

详细的错误信息:

E, [2017-06-30T12:58:08.490986 #14782] ERROR -- : fsevent: running worker failed: wrong number of arguments (given 2, expected 1):/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/adapter/base.rb:41:in `block (2 levels) in configure'
/Users/w11th/.rbenv/versions/2.4.1/gemsets/rails5.0/gems/rb-fsevent-0.10.1/lib/rb-fsevent/fsevent.rb:75:in `run'
/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb:68:in `_run_worker'
/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb:77:in `block (2 levels) in _run_workers_in_background'
/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/internals/thread_pool.rb:6:in `block in add' called from: /Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb:67:in `_run_worker'
/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb:77:in `block (2 levels) in _run_workers_in_background'
/Users/w11th/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/listen-3.0.8/lib/listen/internals/thread_pool.rb:6:in `block in add'

通过 Google 大法找到了相关的 Issuelisten 这个 gem 对 fb-fsevent 的限定是 '~> 0.9', '>= 0.9.4',而最新版本的 rb-fsevent0.10.0,这个版本目前有问题。

解决方法

在新的 listen 更新前在 Gemfile 里指定 rb-fsevent 版本

gem "rb-fsevent", "0.9.8"
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号