美文网首页
CocoaPods更新遇redefinition问题及其它问题汇

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

作者: 千若逸 | 来源:发表于2015-10-15 19:40 被阅读3901次

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

    相关文章

      网友评论

          本文标题:CocoaPods更新遇redefinition问题及其它问题汇

          本文链接:https://www.haomeiwen.com/subject/stxacttx.html