今天凌晨苹果如期推送了 macOS High Sierra 更新,于是一大早打开电脑更新系统。过程还算顺利,网络很快,大概 10 分钟就下载完毕,升级过程中也没有碰到网上其他开发者遇到的各种问题,重启电脑后打开多个大型 App 也几乎没有卡顿,这点要给苹果一个👍

不过在使用 Cocoapods 的时候还是遇到了问题:

$ pod install --verbose
zsh: /usr/local/bin/pod: bad interpreter: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin: no such file or directory

看起来是 Cocoapods 依赖的 Ruby 版本问题,Google 一下,发现已经有人在 Cocoapods 的 repo 下提了这个 issue,下面也有开发者给出了解决方案:重新安装 Cocoapods. 至于具体原因,似乎是因为 Cocoapods 的安装并不是下载代码就完事的,gem 需要根据当前的 Ruby 版本生成 pod 命令的源码,可以通过执行 cat ` which pod` 查看 pod 命令的代码:

#!/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'cocoapods' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0.a"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
    version = $1
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('cocoapods', 'pod', version)
else
gem "cocoapods", version
load Gem.bin_path("cocoapods", "pod", version)
end

从第一行可以看出 pod 命令需要用到 2.0 版本的 Ruby 解释器 /System/Library/Frameworks/Ruby.framework/Versions/2.0,而 macOS High Sierra 将系统的 Ruby 解释器升级到了 2.3 /System/Library/Frameworks/Ruby.framework/Versions/2.3,因此执行 pod 命令的时候由于找不到 Ruby 解释器而报错。

于是按照提示重装 Cocoapods:

$ sudo gem install cocoapods

安装完成后继续执行 pod install --verbose,What,又报了同样的错误😂 不死心的我决定继续重装一次 Cocoapods,不过这次加上 --verbose 参数,看看安装过程中做了哪些操作。log 太长我就不贴了,不过注意到最后输出的 pod 命令位置似乎跟上面执行 which pod 输出有点不一样,它是 /usr/bin/pod,而 which pod 的输出是 /usr/local/bin/pod,再看一下我的 $PATH 路径:

$ echo $PATH
/Users/majun/.swiftenv/shims /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Applications/Wireshark.app/Contents/MacOS

可以看到在我的 $PATH 环境变量里,/usr/local/bin 的优先级是高于 /usr/bin 的,因此当这两个地方都存在一个名叫 pod 的命令时,系统优先执行 /usr/local/bin/pod,于是错误就这么产生了。因此我直接删除 /usr/local/bin/pod 文件,再执行 pod install --verbose,这一次果然安装成功了。

这个问题应该是由于 Cocoapods 改变了安装路径导致的,记得 macOS 启用 System Integrity Protection 之后 Cocoapods 的安装路径也修改过,这次应该也是类似的问题吧,由于 $PATH 这个环境变量的问题,导致老版本的 pod 命令优先被执行。


我也在 Cocoapods 的 repo 里添加了这个 issue,也许可以帮助同样遇到这个问题的人。