#/usr/local/bin/pod:22:in `<main>': undefined method `activate_bin_path' for Gem:Module (NoMethodError)
前段时间在执行了pod install的时候,突然出现这个问题。google了下“undefined method `activate_bin_path' for Gem:Module (NoMethodError)”。
看到高票答案是
gem update --system
gem update bundler
升级gem的版本。
在mac上直接执行的时候又是
ERROR: While executing gem ... (Errno::EACCES)
Permission denied @ dir_s_mkdir - /Library/Ruby/Site/2.3.0/rubygems
直接sudo gem update --system 又出现。
ERROR: While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
timed out (https://gems.ruby-china.com/specs.4.8.gz)
于是就研究了下这个问题到底是什么原因。
先看一下pod的报错地方,执行which pod后可以看到。pod的地方在
/usr/local/bin/pod
cat这个文件的内容可以看到是一个ruby文件
#!/usr/bin/env 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
load Gem.activate_bin_path('cocoapods', 'pod', version)
可以看出Gem是在 rubygems 里定义的,所以问题应该是rubygems和这个生成的pod版本不一致。继续看下rubygems是在哪个地方定义的。找了半天,没找到ruby定义module的地方,但是看ruby给方法提供了个source_location的属性。直接进入irb.
require("rubygems")
Gem.methods
Gem.method(:gemdeps).source_location
可以看到Gem确实没有activate_bin_path这个方法,随便挑个Gem的方法可以看到是在
"/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems.rb"
这个2.3的ruby是mac自带的,mac很多系统库依赖这个ruby。所以不能直接更新ruby,这个也是一开始gem update --system失败的原因。
后面意外的发现原来新开的终端窗口是可以正常pod install的。原来应该是装了rvm,使用rvm更新了ruby之后,又更新了gem以及pod这些一系列的东西,在装了rvm的ruby后,会添加新版ruby的路径/Users/xiaobochen/.rvm/rubies/ruby-2.3.8/bin到$PATH里面,这个时候的gem版本是/Users/xiaobochen/.rvm/rubies/ruby-2.3.8/lib/ruby/site_ruby/2.3.0/rubygems.rb, 但是旧的终端窗口里的$PATH没有更新,导致调用的ruby还是系统的旧版ruby也就调用了旧版的Gem,所以出现了找不到方法的错误。