CocoaPods更新遇redefinition问题及其它问题汇总

来源:互联网 发布:淘宝上的原厂汽车配件 编辑:程序博客网 时间:2024/05/20 08:01

最近下载了网上的一份开源代码,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'        end    endend

升级后就要改成:

platform :ios, '7.0'pod 'Reveal-iOS-SDK', :configurations => ['Debug']if defined? installer_representation.project    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'            end        end    endendif defined? installer_representation.pods_project    post_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'            end        end    endend

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:590Details: Assertion failed: _initializationCompletedSuccessfullyFunction: BOOL IDEIsInitializedForUserInteraction()Thread: {number = 1, name = main}Hints: NoneBacktrace: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.0gem install cocoapods -v 0.34.4rbenv global 2.0.0-p0gem install cocoapods -v 0.33.1

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

步骤:

  • 在项目根目录下创建Gemfile,指定CocoaPods版本
gem 'cocoapods', '~> 0.37.2'
  • 执行bundle install命令
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脱硫塔里的二氧化硫高怎么办 恐怖黎明铁匠选错怎么办 堡垒之夜草变色怎么办 火柴没有擦的了怎么办 乙醚倒进下水道了怎么办 乙醚和水不分层怎么办 乙醚闻多了头晕怎么办 爱乐维吃了便秘怎么办 刮完滑石粉墙面很软怎么办 被硫酸泼到皮肤怎么办 头磕了一下头晕怎么办 家里有事与工作不能请怎么办 撞了头头晕想吐怎么办 猫不小心摔一下怎么办 一氧化二氮中毒怎么办 电脑开机变慢了怎么办 怎么办抚顺韦德健身卡 预售健身卡合法吗怎么办 被浓硫酸泼到怎么办 婴儿误喝了生水怎么办 宝宝喝了生水拉肚子怎么办 因妈妈喝生水宝宝拉肚子怎么办 喝了几口生水怎么办 不小心吃到蟑螂怎么办 吃了有蛆的樱桃怎么办 不小心误食了蛆怎么办 吃了有蟑螂的汤怎么办 调节天平时指针向右怎么办 香薰蜡烛融化了怎么办 香薰蜡烛挂壁怎么办y 粗蜡烛只烧中间怎么办 紫薯馒头变绿怎么办 小孩手开水烫了怎么办 被油烫伤了怎么办才不留疤 烫伤水泡蹭破了怎么办 烧伤的水泡破了怎么办 烧伤后水泡破了怎么办 烫伤泡破了红肿怎么办 烧伤第二天水泡破了怎么办? 烧伤后换药特别疼怎么办 盐酸溅到皮肤上怎么办