最近下载了网上的一份开源代码,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. 函数参数传递常用的三种方式
  2. bpexpdate – 更改映像目录库中备份的截止日期以及介质目录库中介质的截止日期nbu...
  3. 关于java Servlet,Struts,springMVC 的线程安全问题
  4. python语言编程中的保留字_Python语言程序设计整理
  5. Qt::WindowModal和Qt::ApplicationModal的区别
  6. 云服务器运行gpu程序很卡,请问怎样才使程序在GPU上运行?
  7. Python实例讲解 -- 操作数据库 附mysqldb win32 py2.7下载
  8. SqlDictionary表,使用SQL语句查询TableID
  9. java语言介绍及特点分析(萌新入门须知内容)
  10. html中pt与px的转换,ptpx换算(pt和像素换算)
  11. (转贴)联想员工亲历联想大裁员:公司不是家
  12. xss(跨站脚本攻击)详解
  13. 带小数十进制转二进制C语言,c语言十进制小数转为二进制
  14. 计算机会议等级排名,中国计算机学会推荐国际学术期刊(搬运于中国计算机学会)
  15. 创新之道,亚马逊创新之旅背后的故事
  16. prometheus-community-PushProx介绍
  17. python爬取b站弹幕_如何爬取B站弹幕
  18. 百度云盘上传显示服务器异常,百度网盘常见问题之网络异常,这里有最全面的解决方法...
  19. 【程序源代码】微信小程序商城管理系统(Java后台+微信小程序)最新版
  20. 20 个关于程序员的笑话,看懂了,你就不会笑了,也不会羡慕他们工资高了!...

热门文章

  1. 西安理工大学计算机考研难吗,西安理工大学考研难吗?一般要什么水平才可以进入?...
  2. mysql手注_php+mysql手注拿shell教程【朋友给的】
  3. java切面不需要接口了吗_使用java语言,如何对一个类中的静态方法做切面编程?...
  4. 【机器学习】银行贷款违约预测
  5. 华南农业大学c语言期末试题,华南农业大学珠学院C语言期末试卷.doc
  6. AAAI 2022 | 北大 阿里达摩院:基于对比学习的预训练语言模型剪枝压缩
  7. 引入N-gram改进Transformer架构,ACL匿名论文超越Primer等基准
  8. 详解如何充分发挥先验信息优势,用MRC框架解决各类NLP任务
  9. 微调也重要:探究参数初始化、训练顺序和提前终止对结果的影响
  10. 想转行人工智能?机会来了!