CocoaPods更新遇redefinition问题及其它问题汇总
最近下載了網(wǎng)上的一份開源代碼,pod更新時(shí)出錯(cuò),根據(jù)網(wǎng)上別人的解答是項(xiàng)目太新用了Xcode7與iOS9 SDK,需要對CocoaPods進(jìn)行了升級(jí),沒想到這一升級(jí)造成了一系列的問題,費(fèi)了老鼻子勁才把這些問題都一一解決,就在這里記錄一下吧,希望對需要的人有所幫助。
1、問題環(huán)境
升級(jí)時(shí)所使用的命令為:
gem install cocoapods升級(jí)后用"pod --version"查看版本號(hào)是0.39.0,升級(jí)前的版本我沒記錯(cuò)的話應(yīng)該是0.37.2.
2、Redefinition問題
升級(jí)后遇到的最大的問題就是這個(gè)Redefinition問題了,具體情況是我的工作項(xiàng)目中需要增加一個(gè)新的pod引用,pod update后編譯報(bào)出一大堆Redefinition問題,涉及到AFNetworking,SDWebImage等常用庫,而以前都好好的,百思不得其解。
"Redefinition of module X" errors in 0.38.1 · Issue #3886 · CocoaPods/CocoaPods?這個(gè)Github issue提到了這個(gè)問題,但我并不得要領(lǐng)。
為了這個(gè)問題我把Pods文件夾、Podfild.lock文件刪除重新更新,甚至把CocoaPods降級(jí)到0.38.2以及0.37.2版本都沒有解決,然后這個(gè)過程中又遇到了其它的問題,問題怎么解決的后面再說。
靜下心來再查看這個(gè)問題,發(fā)現(xiàn)錯(cuò)誤日志里還是提供了一些關(guān)鍵要素,能顯示重復(fù)定義在哪里。因?yàn)槲乙话闱闆r下都是看默認(rèn)顯示在Xcode左側(cè)欄里的錯(cuò)誤日志列表就解決,很少展開日志詳細(xì)信息。這次的關(guān)鍵要素就是在日志詳細(xì)信息中,然后就發(fā)現(xiàn)了一些規(guī)律:以AFNetworking為例,我在pch文件中是這樣引用的:#import \<AFNetworking/AFNetworking.h\>,然后在其它文件也做了這樣的引用:#import "AFNetworking.h"。這兩個(gè)引用同時(shí)存在就造成了Redefinition,去掉后者的引用方式就可以解決AFNetworking的Redefinition問題了。
正常情況下肯定是用尖括號(hào)那種引用方式,但是由于歷史原因,項(xiàng)目中使用后者那種引用方式也有不少,以前也從來沒出問題,不知道現(xiàn)在為什么一下子就全部暴露出來了。這一改就要改不少,沒辦法就只能一個(gè)一個(gè)改了。
后記:根據(jù)最新回復(fù),是必須得使用#import <AFNetworking/AFNetworking.h>這種形式的頭文件引用了,應(yīng)該是檢查更嚴(yán)格了。3、undefined method `project’ for #<Pod::Installer問題
舊版本的Podfile在升級(jí)Cocoapods后pod install就會(huì)遇到這個(gè)問題,根據(jù)這篇文章,是因?yàn)镃ocoapods升級(jí)到0.38或0.39版本后installer_representation.project.targets.each中的project改名了,變成了pods_project,好在給了一個(gè)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升級(jí)后就要改成:
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 end4、DVTAssertions: ASSERTION FAILURE問題
這是CocoaPods降級(jí)到0.37.2后pod install遇到的問題,記憶中當(dāng)初好像就是因?yàn)檫@個(gè)問題而升級(jí)到0.39.0版本的。
具體的錯(cuò)誤詳情如下:
[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網(wǎng)上大部分的帖子都說升級(jí)CocoaPods,比如這個(gè)帖子,然而具體問題具體分析好不好,我這個(gè)是降級(jí)時(shí)遇到的問題。
這個(gè)問題應(yīng)該就是與Xcode版本有關(guān)了,實(shí)際就是與Developer的路徑有關(guān)。我的Mac上同時(shí)存在有Xcode6.1.1版本與Xcode7.0版本,后者是默認(rèn)的Xcode版本。
當(dāng)CocoaPods為0.37.2版本時(shí),對應(yīng)的Developer路徑應(yīng)該是Xcode6.1.1版本的路徑,因?yàn)檫@個(gè)之前一直都配合使用好好的。那么,就需要用到xcode-select問題了。通過xcode-select -p命令可以查看當(dāng)前Developer路徑,用xcode-select -s可以指定新的Developer路徑。
我是這樣指定的:
xcode-select -s /Applications/Xcode6.1.1.app/Contents/Developer然后這個(gè)問題就不復(fù)存在了。注意當(dāng)有必要使用CocoaPods 0.39.0版本時(shí),必須得切換回來,要不然還是會(huì)遇到這個(gè)問題
5、CocoaPods多版本共存問題
本來我是想降級(jí)的,結(jié)果CocoaPods好像默認(rèn)就是多版本共存了,比如我原來本來是0.37.2版本,用了本文開頭的升級(jí)命令升級(jí)后,雖然用pod --version看是0.39.0版本,但是0.37.2版本并沒有刪除。這個(gè)可以用下面的命令查看:
gem list --local | grep cocoapods如果你的只有一個(gè)版本,你可以再安裝一個(gè)CocoaPods 0.38.2版本或者其它版本試試。比如安裝0.38.2版本的命令就是:
sudo gem install cocoapods -v 0.38.2說是共存了,但到底是怎么共存使用呢?就比如說我的CocoaPods默認(rèn)版本是0.39.0,有一個(gè)項(xiàng)目要用0.37.2版本的CocoaPods該怎么用呢?
這里有人提供了這樣的一個(gè)方法,但我沒有細(xì)研究,也沒實(shí)踐,需要用到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版本——關(guān)鍵要點(diǎn):在Rails開發(fā)中,可以用Bundle進(jìn)行Gem管理,而Cocoapods本身就是一個(gè)Gem,那么也就能用Bundle來管理Cocoapods。
步驟:
- 在項(xiàng)目根目錄下創(chuàng)建Gemfile,指定CocoaPods版本
- 執(zhí)行bundle install命令
總結(jié)
以上是生活随笔為你收集整理的CocoaPods更新遇redefinition问题及其它问题汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除已经配置的类库和移除CocoaPod
- 下一篇: UICollectionView详解