CocoaPods更新遇redefinition问题及其它问题汇总
最近下载了网上的一份开源代码,pod更新时出错,根据网上别人的解答是项目太新用了Xcode7与iOS9 SDK,需要对CocoaPods进行了升级,没想到这一升级造成了一系列的问题,费了老鼻子劲才把这些问题都一一解决,就在这里记录一下吧,希望对需要的人有所帮助。
1、问题环境
升级时所使用的命令为:
1 | gem install cocoapods |
升级后用”pod –version”查看版本号是0.39.0,升级前的版本我没记错的话应该是0.37.2.
2、Redefinition问题
升级后遇到的最大的问题就是这个Redefinition问题了,具体情况是我的工作项目中需要增加一个新的pod引用,pod update后编译报出一大堆Redefinition问题,涉及到AFNetworking,SDWebImage等常用库,而以前都好好的,百思不得其解。
“Redefinition of module X” errors in 0.38.1 · Issue #3886 · CocoaPods/CocoaPods 这个Github issue提到了这个问题,但我并不得要领。
为了这个问题我把Pods文件夹、Podfild.lock文件删除重新更新,甚至把CocoaPods降级到0.38.2以及0.37.2版本都没有解决,然后这个过程中又遇到了其它的问题,问题怎么解决的后面再说。
静下心来再查看这个问题,发现错误日志里还是提供了一些关键要素,能显示重复定义在哪里。因为我一般情况下都是看默认显示在Xcode左侧栏里的错误日志列表就解决,很少展开日志详细信息。这次的关键要素就是在日志详细信息中,然后就发现了一些规律:以AFNetworking为例,我在pch文件中是这样引用的:#import <AFNetworking/AFNetworking.h>,然后在其它文件也做了这样的引用:#import “AFNetworking.h”。这两个引用同时存在就造成了Redefinition,去掉后者的引用方式就可以解决AFNetworking的Redefinition问题了。
正常情况下肯定是用尖括号那种引用方式,但是由于历史原因,项目中使用后者那种引用方式也有不少,以前也从来没出问题,不知道现在为什么一下子就全部暴露出来了。这一改就要改不少,没办法就只能一个一个改了。
后记:根据最新回复,是必须得使用#import < AFNetworking\/AFNetworking.h >这种形式的头文件引用了,应该是检查更严格了。
我在这里遇到的问题是SDWebImage的Redefinition问题,是在pch中导入了#import < SDWebImage\/UIImageView+WebCache.h >,但是在其他的类中又导入了#import “UIImageView+WebCache.h”,从而引起了Redefinition问题
3、undefined method `project’ for #<Pod::Installer问题
旧版本的Podfile在升级Cocoapods后pod install就会遇到这个问题,根据这篇文章,是因为Cocoapods升级到0.38或0.39版本后installer_representation.project.targets.each中的project改名了,变成了pods_project,好在给了一个0.37——0.39都通用的办法,比如原来的Podfile是:
1 | platform :ios, '7.0' |
升级后就要改成:
1 | platform :ios, '7.0' |
4、DVTAssertions: ASSERTION FAILURE问题
这是CocoaPods降级到0.37.2后pod install遇到的问题,记忆中当初好像就是因为这个问题而升级到0.39.0版本的。
1 | [MT] DVTAssertions: ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-8227/IDEFoundation/Initialization/IDEInitialization.m:590 |
网上大部分的帖子都说升级CocoaPods,比如这个帖子,然而具体问题具体分析好不好,我这个是降级时遇到的问题。
这个问题应该就是与Xcode版本有关了,实际就是与Developer的路径有关。我的Mac上同时存在有Xcode6.1.1版本与Xcode7.0版本,后者是默认的Xcode版本。
当CocoaPods为0.37.2版本时,对应的Developer路径应该是Xcode6.1.1版本的路径,因为这个之前一直都配合使用好好的。那么,就需要用到xcode-select问题了。通过xcode-select -p命令可以查看当前Developer路径,用xcode-select -s可以指定新的Developer路径。
我是这样指定的:
1 | xcode-select -s /Applications/Xcode6.1.1.app/Contents/Developer |
然后这个问题就不复存在了。注意当有必要使用CocoaPods 0.39.0版本时,必须得切换回来,要不然还是会遇到这个问题
5、CocoaPods多版本共存问题
本来我是想降级的,结果CocoaPods好像默认就是多版本共存了,比如我原来本来是0.37.2版本,用了本文开头的升级命令升级后,虽然用pod –version看是0.39.0版本,但是0.37.2版本并没有删除。这个可以用下面的命令查看:
1 | gem list --local | grep cocoapods |
如果你的只有一个版本,你可以再安装一个CocoaPods 0.38.2版本或者其它版本试试。比如安装0.38.2版本的命令就是:
1 | sudo gem install cocoapods -v 0.38.2 |
说是共存了,但到底是怎么共存使用呢?就比如说我的CocoaPods默认版本是0.39.0,有一个项目要用0.37.2版本的CocoaPods该怎么用呢?
这里有人提供了这样的一个方法,但我没有细研究,也没实践,需要用到rbenv:
1 | rbenv global 2.1.0 |
步骤:
- 在项目根目录下创建Gemfile,指定CocoaPods版本
1 | gem 'cocoapods', '~> 0.37.2' |
- 执行bundle install命令
****************这是华丽丽的分割线o(╯□╰)o******************
我是在原文章的基础上做了些许改动,总结了自己遇到的一些问题。
我们都是热爱移动开发的程序猿,加入我们,共同提高: