前段时间一个没忍住,把唯一的主力机更新了 High Sierra。更新完后一切正常,没有闪退,非有异常,APFS 还速度飞快,感觉非常良好。
可是好日子没过两天,就碰到了一地鸡毛。昨天想新建一个 Ruby 2.3.3、Rails 5.0 的工程,先是 Ruby 编译不过,后来又是 nokogiri 和 mysql2,全部安装完了启动 Rails,以为松了一口气,结果监控文件改动的一直报错。本来想搞事情的,结果时间都浪费在前戏了。
现在把这几个坑覆盘一下。说不定能有点用处,帮大家节省一点时间。
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
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
使用系统包安装。
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 大法找到了相关的 Issue。listen
这个 gem 对 fb-fsevent
的限定是 '~> 0.9', '>= 0.9.4'
,而最新版本的 rb-fsevent
是 0.10.0
,这个版本目前有问题。
解决方法
在新的 listen
更新前在 Gemfile 里指定 rb-fsevent
版本
gem "rb-fsevent", "0.9.8"