最近下载了网上的一份开源代码,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
end
end
升级后就要改成:
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
end
end
if 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
end
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命令
网友评论