最近下载了网上的一份开源代码,pod更新时出错,根据网上别人的解答是项目太新用了Xcode7与iOS9 SDK,需要对CocoaPods进行了升级,没想到这一升级造成了一系列的问题,费了老鼻子劲才把这些问题都一一解决,就在这里记录一下吧,希望对需要的人有所帮助。

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>这种形式的头文件引用了,应该是检查更严格了。

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是:

platform :ios, '7.0'pod 'Reveal-iOS-SDK', :configurations => ['Debug']
post_install do |installer_representation|installer_representation.project.targets.each do |target|target.build_configurations.each do |config|config.build_settings['ARCHS'] = 'armv7 arm64'config.build_settings['VALID_ARCHS'] = 'armv7 arm64'config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'endend
end

升级后就要改成:

platform :ios, '7.0'pod 'Reveal-iOS-SDK', :configurations => ['Debug']if defined? installer_representation.projectpost_install do |installer_representation|installer_representation.project.targets.each do |target|target.build_configurations.each do |config|config.build_settings['ARCHS'] = 'armv7 arm64'config.build_settings['VALID_ARCHS'] = 'armv7 arm64'config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'endendend
endif defined? installer_representation.pods_projectpost_install do |installer_representation|installer_representation.pods_project.targets.each do |target|target.build_configurations.each do |config|config.build_settings['ARCHS'] = 'armv7 arm64'config.build_settings['VALID_ARCHS'] = 'armv7 arm64'config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'endendend
end

4、DVTAssertions: ASSERTION FAILURE问题

这是CocoaPods降级到0.37.2后pod install遇到的问题,记忆中当初好像就是因为这个问题而升级到0.39.0版本的。

具体的错误详情如下:

[MT] DVTAssertions: ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-8227/IDEFoundation/Initialization/IDEInitialization.m:590
Details: Assertion failed: _initializationCompletedSuccessfully
Function: BOOL IDEIsInitializedForUserInteraction()
Thread: {number = 1, name = main}
Hints: None
Backtrace:
0 0x000000010462aa5c -DVTAssertionHandler handleFailureInFunction:fileName:lineNumber:assertionSignature:messageFormat:arguments:
1 0x000000010462a1e9 _DVTAssertionHandler (in DVTFoundation)
2 0x000000010462a455 _DVTAssertionFailureHandler (in DVTFoundation)
3 0x000000010462a3b7 _DVTAssertionFailureHandler (in DVTFoundation)
4 0x0000000107191f5c IDEIsInitializedForUserInteraction (in IDEFoundation)
5 0x0000000109da8eb9 +PBXProject projectWithFile:errorHandler:readOnly:
6 0x0000000109daaa3e +PBXProject projectWithFile:errorHandler:
7 0x00007fff8bc68f44 ffi_call_unix64 (in libffi.dylib)
Abort trap: 6

网上大部分的帖子都说升级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路径。

我是这样指定的:

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版本并没有删除。这个可以用下面的命令查看:

gem list --local | grep cocoapods

如果你的只有一个版本,你可以再安装一个CocoaPods 0.38.2版本或者其它版本试试。比如安装0.38.2版本的命令就是:

sudo gem install cocoapods -v 0.38.2

说是共存了,但到底是怎么共存使用呢?就比如说我的CocoaPods默认版本是0.39.0,有一个项目要用0.37.2版本的CocoaPods该怎么用呢?

这里有人提供了这样的一个方法,但我没有细研究,也没实践,需要用到rbenv:

rbenv global 2.1.0
gem install cocoapods -v 0.34.4
rbenv global 2.0.0-p0
gem install cocoapods -v 0.33.1

最后是使用这篇文章里的方法解决了:使用Bundle管理Cocoapods版本——关键要点:在Rails开发中,可以用Bundle进行Gem管理,而Cocoapods本身就是一个Gem,那么也就能用Bundle来管理Cocoapods。

步骤:

  • 在项目根目录下创建Gemfile,指定CocoaPods版本
gem 'cocoapods', '~> 0.37.2'
  • 执行bundle install命令

CocoaPods更新遇redefinition问题及其它问题汇总相关推荐

  1. cocoapods更新

    使用sudo gem install cocoapods更新提示: ERROR: While executing gem ... (Errno::EPERM) Operation not permit ...

  2. cocoapods——更新

    cocoapods更新 1.查看pod版本 pod --version 2.查看Ruby源环境 如果你得Ruby不支持最新pod版本,pod 更新失败,你需要重新替换Ruby源. gem source ...

  3. iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案

    今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题.当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件 ...

  4. CocoaPods版本升级——本地CocoaPods更新

    CocoaPods已经发布了正式版本,还是测试版本的,可能需要动动手指了. 这里不再详细的介绍怎么安装CocoaPods了,相信你来查找CocoaPods升级就应该安装过了,要是需要它的安装步骤和详细 ...

  5. cocoapods更新本地库

    更新本地库 pod repo update --verbose 查看pod版本号 pod --version 查看源 gem source -l 结果 *** CURRENT SOURCES ***h ...

  6. CocoaPods更新出现file not found.

    在我们从SVN上下载下来的项目, 或者 当CocoaPods版本更新的时候,去pod install / update 之后,编译项目经常会出现 一些第三方库 .h file not found 问题 ...

  7. #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲

    又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...

  8. #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲...

    又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...

  9. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟 ...

最新文章

  1. java闭合数据_java多线程中线程封闭详解
  2. 牛客练习赛79E-小G的数学难题【dp,单调队列】
  3. sudo su su_Spring Security应用程序中的su和sudo
  4. JAVA进阶教学之(产生随机数)
  5. mysql binlog mixed_MySQL Binlog三种格式介绍及分析
  6. procise 时钟的坑
  7. 对Redis单线程的一些看法
  8. JavaWeb那些事儿(一)--为什么做java的web开发使用struts2,springMVC和spring这样的框架
  9. oracle使用cgi吗_php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单
  10. 华为OJ题目 -- 初级篇(机试OJ平台)
  11. 拼多多搜索热度怎么做|重庆乾胤
  12. oracle的同义词删不掉,oracle 删除同义词
  13. 腾讯浏览器支持html5视频播放器,JS第8款:html5media.js跨浏览器兼容的HTML5视频音频播放器...
  14. git 裁切_Croppic图片裁切插件中文API帮助文档
  15. 仿酷狗音乐列表点击item子控件展开功能
  16. 《编码隐藏在计算机软硬件背后的语言》读感
  17. 微信小程序时间显示几分钟前、几小时前、几天前....
  18. 【Java基础】二、大厂都开始重视的基础很重要吗?快来加入基础的学习,巩固一下细枝末角,刷刷面试题吧
  19. AFL_qemu_mode
  20. eclipse的outline窗口_【Eclipse】使用指南(5)快捷 Outline 视图

热门文章

  1. 怎样快速识别 英文地址中包含非英文字符_[论文笔记]端到端的场景文本识别算法--CRNN 论文笔记...
  2. 期末考试前的预习,科目:化工设备与反应器(4)
  3. python 来搞定 非线性方程组和最小二乘拟合问题
  4. 博士申请 | ​麦吉尔大学智能自动化实验招收2022年秋季入学全奖博士生
  5. AAAI 2021 | 基于动态混合关系网络的对话式语义解析方法
  6. VD-BERT:用BERT搭建统一的视觉对话模型
  7. 数字图像处理与Python实现笔记之频域滤波
  8. 【建议收藏】IntelliJ IDEA 常用的快捷键 提高开发效率
  9. Git/码云上多人协作,创建分支,上传修改
  10. Numpy-随机生成以及矩阵的运算