pod错误undefined method `activate_bin_path' for Gem:Module (NoMethodError)原因分析

#/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)”。

发现这个链接https://stackoverflow.com/questions/37805525/rails-2-2-2-issue-undefined-method-activate-bin-path-for-gemmodule-nomethod

看到高票答案是


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,所以出现了找不到方法的错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。