当前位置:首页 > 科技数码 > 正文

Setting up CocoaPods 卡住不动的解决方法

摘要: SettingupCocoaPods卡住不动的解决方法最佳答案53678位专家为你答疑解惑SettingupCocoaPods卡...

Setting up CocoaPods 卡住不动的解决方法

最佳答案 53678位专家为你答疑解惑

Setting up CocoaPods 卡住不动的解决方法

今天做了个项目,在Podfile中新增了几个第三方,准备pod update/install的时候,发现下面的报错

Pasted Graphic.png

然后赶紧去百度了,网上说先清除下CocoaPods的缓存,于是继续进行

Pasted Graphic 1.png

删除缓存以后,再次pod update结果继续是一堆的报错

Pasted Graphic 2.png

然后继续百度上面的报错,说是因为cocoaPods下面没有master文件夹造成的...然后开始使用pod setUp去clone这个文件夹回来,结果多次尝试都是失败告终!

Pasted Graphic 3.png

那么这个报错原因是什么呢? 怎么解决?由于网上的解决方案太杂太乱,方法步骤没有截图,导致很难使用,于是写下了此文,欢迎各位雅正!下面,进入今天正题,看看原因和解决方案

失败原因:pod setup的本质就是将https://github.com/CocoaPods/Specs 上的Specs项目clone到~/.cocoapods/repos目录下。若此目录下已有Specs项目,则会将项目更新到最新的状态。由于Specs很大,容易导致pod setup失败。这时就需要我们手动安装Specs。若直接从github上下载zip文件,由于缺少git文件,会导致cocoa pods不使用。由于直接pod setup用时太久,很容易导致失败,使用 cocoapods 的镜像索引来提高下载速度。这里给出国内的一个镜像索引地址: https://coding.net/u/hging/p/Specs/git点击打开以后,我们获得他的git地址,为后面的clone做准备..操作方法截屏如下

Pasted Graphic 4.png

好了,国内的cocoapods 的镜像索引有了,那么下面我们就来进行相关操作了1.我们先去~.cocoapods文件去看看

Pasted Graphic 5.png

你会发现有下面的文件

Pasted Graphic 7.png

如果有master的话,建议你先删除掉master这个文件夹,因为马上我们下载下来的文件夹,需要该名称master

2.删除master文件以后,我们打开终端,将podspec索引文件clone到本地的~/.cocoapods/repos/master位置我们先切到~./cocoapods文件夹处

Pasted Graphic 8.png

然后利用我们上面拿到的git地址clone就可以了

Pasted Graphic 9.png

后面我们静静的等待就可以了,大概10几分钟可以下载完成

Pasted Graphic 10.png

再去文件夹里看看,发现master文件夹已经生成了,并且全部文件也已经全部下载下来

Pasted Graphic 11.png

此时,我们再次 pod update下,更新下我们的第三方库

Pasted Graphic 12.png

安装完一堆配置文件后,然后自动为我们更新了第三方

Pasted Graphic 13.png

至此,我们解决了pod setup失败,导致项目中的cocoaPods无法使用的问题

PS:经常会写总结文章,都是iOS开发中遇到的小问题,喜欢的话,就关注我吧

从作用、安装、使用等角度讲CocoaPods

一、cocoapods 作用:

开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省配置和更新第三方开源库的时间。

如果开发项目不使用Cocopods的话,我们要做的步骤可能有:

1.把开源库的源代码复制到项目中

2.添加一些依赖框架和动态库

3.设置-ObjC,-fno-objc-arc等参数

4.管理他们的更新

二、cocoapods原理:

核心组件

CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是:CocoaPods/CocoaPods,CocoaPods/Core, 和CocoaPods/Xcodeproj(是的,CocoaPods 是一个依赖管理工具 -- 利用依赖管理进行构建的!)。

编者注CocoaPods 是一个 objc 的依赖管理工具,而其本身是利用 ruby 的依赖管理 gem 进行构建的

CocoaPods/CocoaPod

这是是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。

CocoaPods/Core

Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 Podfile 和 podspecs。

Podfile

Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅Podfile 指南。

Podspec

.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。

CocoaPods/Xcodeproj

这个 gem 组件负责所有工程文件的整合。它能够对创建并修改.xcodeproj和.xcworkspace文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个 gem。

运行pod install命令

当运行pod install命令时会引发许多操作。要想深入了解这个命令执行的详细内容,可以在这个命令后面加上--verbose。现在运行这个命令pod install --verbose,可以看到类似如下的内容:

可以上到,整个过程执行了很多操作,不过把它们分解之后,再看看,会发现它们都很简单。让我们逐步来分析一下。

读取 Podfile 文件

你是否对 Podfile 的语法格式感到奇怪过,那是因为这是用 Ruby 语言写的。相较而言,这要比现有的其他格式更加简单好用一些。

在安装期间,第一步是要弄清楚显示或隐式的声明了哪些第三方库。在加载 podspecs 过程中,CocoaPods 就建立了包括版本信息在内的所有的第三方库的列表。Podspecs 被存储在本地路径~/.cocoapods中。

版本控制和冲突

CocoaPods 使用语义版本控制 - Semantic Versioning命名约定来解决对版本的依赖。由于冲突解决系统建立在非重大变更的补丁版本之间,这使得解决依赖关系变得容易很多。例如,两个不同的 pods 依赖于 CocoaLumberjack 的两个版本,假设一个依赖于2.3.1,另一个依赖于2.3.3,此时冲突解决系统可以使用最新的版本2.3.3,因为这个可以向后与2.3.1兼容。

但这并不总是有效。有许多第三方库并不使用这样的约定,这让解决方案变得非常复杂。

当然,总会有一些冲突需要手动解决。如果一个库依赖于 CocoaLumberjack 的1.2.5,另外一个库则依赖于2.3.1,那么只有最终用户通过明确指定使用某个版本来解决冲突。

加载源文件

CocoaPods 执行的下一步是加载源码。每个.podspec文件都包含一个源代码的索引,这些索引一般包裹一个 git 地址和 git tag。它们以 commit SHAs 的方式存储在~/Library/Caches/CocoaPods中。这个路径中文件的创建是由 Core gem 负责的。

CocoaPods 将依照Podfile、.podspec和缓存文件的信息将源文件下载到Pods目录中。

生成 Pods.xcodeproj

每次pod install执行,如果检测到改动时,CocoaPods 会利用 Xcodeproj gem 组件对Pods.xcodeproj进行更新。如果该文件不存在,则用默认配置生成。否则,会将已有的配置项加载至内存中。

安装第三方库

当 CocoaPods 往工程中添加一个第三方库时,不仅仅是添加代码这么简单,还会添加很多内容。由于每个第三方库有不同的 target,因此对于每个库,都会有几个文件需要添加,每个 target 都需要:

一个包含编译选项的.xcconfig文件

一个同时包含编译设置和 CocoaPods 默认配置的私有.xcconfig文件

一个编译所必须的prefix.pch文件

另一个编译必须的文件dummy.m

一旦每个 pod 的 target 完成了上面的内容,整个Podstarget 就会被创建。这增加了相同文件的同时,还增加了另外几个文件。如果源码中包含有资源 bundle,将这个 bundle 添加至程序 target 的指令将被添加到Pods-Resources.sh文件中。还有一个名为Pods-environment.h的文件,文件中包含了一些宏,这些宏可以用来检查某个组件是否来自 pod。最后,将生成两个认可文件,一个是plist,另一个是markdown,这两个文件用于给最终用户查阅相关许可信息。

写入至磁盘

直到现在,许多工作都是在内存中进行的。为了让这些成果能被重复利用,我们需要将所有的结果保存到一个文件中。所以Pods.xcodeproj文件被写入磁盘,另外两个非常重要的文件:Podfile.lock和Manifest.lock都将被写入磁盘。

Podfile.lock

这是 CocoaPods 创建的最重要的文件之一。它记录了需要被安装的 pod 的每个已安装的版本。如果你想知道已安装的 pod 是哪个版本,可以查看这个文件。推荐将 Podfile.lock 文件加入到版本控制中,这有助于整个团队的一致性。

Manifest.lock

这是每次运行pod install命令时创建的Podfile.lock文件的副本。如果你遇见过这样的错误沙盒文件与 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),这是因为 Manifest.lock 文件和Podfile.lock文件不一致所引起。由于Pods所在的目录并不总在版本控制之下,这样可以保证开发者运行 app 之前都能更新他们的 pods,否则 app 可能会 crash,或者在一些不太明显的地方编译失败。

xcproj

如果你已经依照我们的建议在系统上安装了xcproj,它会对Pods.xcodeproj文件执行一下touch以将其转换成为旧的 ASCII plist 格式的文件。为什么要这么做呢?虽然在很久以前就不被其它软件支持了,但是 Xcode 仍然依赖于这种格式。如果没有 xcproj,你的Pods.xcodeproj文件将会以 XML 格式的 plist 文件存储,当你用 Xcode 打开它时,它会被改写,并造成大量的文件改动。

结果

运行pod install命令的最终结果是许多文件被添加到你的工程和系统中。这个过程通常只需要几秒钟。当然没有 Cocoapods 这些事也都可以完成。只不过所花的时间就不仅仅是几秒而已了。

补充:持续集成

CocoaPods 和持续集成在一起非常融洽。虽然持续集成很大程度上取决于你的项目配置,但 Cocoapods 依然能很容易地对项目进行编译。

Pods 文件夹的版本控制

如果 Pods 文件夹和里面的所有内容都在版本控制之中,那么你不需要做什么特别的工作,就能够持续集成。我们只需要给.xcworkspace选择一个正确的 scheme 即可。

不受版本控制的 Pods 文件夹

如果你的Pods文件夹不受版本控制,那么你需要做一些额外的步骤来保证持续集成的顺利进行。最起码,Podfile文件要放入版本控制之中。另外强烈建议将生成的.xcworkspace和Podfile.lock文件纳入版本控制,这样不仅简单方便,也能保证所使用 Pod 的版本是正确的。

一旦配置完毕,在持续集成中运行 CocoaPods 的关键就是确保每次编译之前都执行了pod install命令。在大多数系统中,例如 Jenkins 或 Travis,只需要定义一个编译步骤即可 (实际上,Travis 会自动执行pod install命令)。对于Xcode Bots,在书写这篇文章时我们还没能找到非常流畅的方式,不过我们正朝着解决方案努力,一旦成功,我们将会立即分享。

三、cocoapods 安装:

在iOS开发中,经常会使用到第三方库,CocoaPods可以用来方便的统一管理这些第三方库。 下面就和大家详细介绍一下CocoaPods的使用。

3.1 升级Ruby环境

$ sudo gem update --system

3.2 使用淘宝的RubyGems镜像

因为那堵墙阻挡了cocoapods.org,我们可以用淘宝的Ruby镜像来访问cocoapods。按照下面的顺序在终端中敲入依次敲入命令:

$ gem sources --remove https://rubygems.org/

//等有反应之后再敲入以下命令

$ gem sources -a http://ruby.taobao.org/

为了验证你的Ruby镜像是并且仅是taobao,可以用以下命令查看:

$ gem sources -l

只有在终端中出现下面文字才表明你上面的命令是成功的:

*** CURRENT SOURCES ***

http://ruby.taobao.org/

上面所有的命令完成之后,这时候,你在终端中运行:

$ sudo gem install cocoapods

等上十几秒钟,CocoaPods就可以在你本地下载并且安装好了,不再需要其他设置。

四:使用CocoaPods

我们这里导入AFNetworking AFNetworking类库在GitHub地址

4.1 新建一个项目,名字为TextDemo

4.2 终端中,cd到项目总目录(注意:包含PodTest文件夹、PodTest.xcodeproj、PodTestTest的那个总目录)如下图:

4.3 建立Podfile(配置文件)

接着上一步,终端输入

1

vim Podfile

回车键进入下图:

键盘输入 i,进入编辑模式,输入 低版本的cocoa pods在编写Podfile文件时这样写就可以了

1

2

platform :iOS, '8.0'

pod 'AFNetworking'

高版本的cocoa pods在编写Podfile文件必须这样写

1

2

3

4

platform :ios, '8.0'

target "TextDemo" do

pod 'AFNetworking'

end

然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq

注意:键盘输入 :后,才能输入wq。回车后发现tTextDemo项目总目录中多一个Podfile文件,如下图:

4.4 下载

然后输入

1

pod install

等待一会,大约3分钟。

安装成功,查看项目根目录:

注意:现在打开项目不是点击TextDemo.xcodeproj了,而是点击打开TextDemo.xcworkspace 进入项目就可以看到项目结构了:

五、使用过程中问题:

1. install和update命令的配置速度问题

在我们输入pod install或者pod update之后,CocoaPods首先会去匹配本地的spec库,在确认spec版本库不需要更新之后,才会下载相应的库文件,这样比较耗时,有时候,以为是卡死了呢。所以一般使用下面两个命令,跳过spec版本库更新匹配。

pod update --verbose --no-repo-update

pod install --verbose --no-repo-update

有朋友说不加--verbose,其实加--verbose的意义在于可以输出更详细的配置过程 debug信息,在书写时位置也可以换,跳过spec版本库更新匹配的重点是--no-repo-update,比如:

pod install --no-repo-update --verbose // 不更新,并打印出详细过程信息

2. The dependency **** is not used in any concrete target.

[!] The dependency UMengAnalytics-NO-IDFA is not used in any concrete target.

这个提示是因为,cocoapods升级为1.0以后,Podfile文件书写格式的问题,

1.0之前:

platform :ios

pod 'UMengAnalytics-NO-IDFA’

pod 'MBProgressHUD', '~> 0.9.2'

pod 'FMDB'

pod 'SDWebImage', '~> 3.7.3'

pod 'IQKeyboardManager', '~> 3.2.4'

pod 'MJRefresh', '~> 2.3.2'

pod 'MJExtension', '~> 0.2.0'

1.0之后:

platform :ios,’7.0’

target ‘ProjectName’ do #ProjectName工程名字

pod 'MBProgressHUD', '~> 0.9.2'

pod 'FMDB'

pod 'SDWebImage', '~> 3.7.3'

pod 'IQKeyboardManager', '~> 3.2.4'

pod 'MJRefresh', '~> 2.3.2'

pod 'MJExtension', '~> 0.2.0'

pod 'UMengAnalytics-NO-IDFA’

end

?波浪线**~ > ** 含义:从指定版本到倒数第二位版本号升1为止,比如 ‘~> 0.3.7’所指的版本区间为[0.3.7, 0.4.0),即>=版本0.3.7,<版本0.4.0,详见guides.cocoapods.org

3. Unable to satisfy the following requirements: - *** required by Podfile

这种提示主要是因为要添加的类库有最新版本,而你本地local specs repositories并没有更新其下载版本导致。

比如 Unable to satisfy the following requirements: - SDWebImage (~> 3.8) required by Podfile

处理方式有两种:

1、pod update更新本地库

2、降低Podfile文件中的版本;

4. 使用CocoaPods之后,头文件无法自动补齐问题

使用CocoaPods来管理三方库,还是比较方便的,但是突然发现一个美中不足的小问题,在使用import引入文件时,不能自动补齐,需要手工copy文件名,纠结了半天:

解决办法:

Target -> Build Settings ,User Header Search Paths条目中,添加${SRCROOT}或者$(PODS_ROOT),并且选择Recursive,递归搜索,然后就可以自动补齐了。

5. 在项目中移除CocoaPods三方库配置文件

如果我们在配置CocoaPods的三方库文件后,不在需要了可以移除指定库文件配置,具体步骤如下:

删除工程文件夹下的Podfile、Podfile.lock和Pods文件夹;删除xcworkspace文件;打开xcodeproj文件,删除项目中的libpods.a和Pods.xcconfig引用;打开Build Phases选项,删除Check Pods Manifest.lock和Copy Pods Resources;重新pod install如果不想使用pod了,可以使用 pod deintegrate,移除三方库,手动添加。

6. Pods written in Swift can only be integrated as frameworks; add use_frameworks! to your Podfile or target to opt into using it.

这种提示,主要是因为要添加的这个库有专有swift库,或者demo中有swift代码。

解决办法:在Podfile文件的target后面添加use_frameworks!,注意,这里有!。

比如[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pods being used are: ReactiveCocoa, ReactiveSwift, and Result

7. The XXXX [Debug] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-XXXX/Pods-XXXX.debug.xcconfig'. This can lead to problems with the CocoaPods installation

或者

The XXXX [Debug] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods-XXXX/Pods-XXXX.debug.xcconfig'. This can lead to problems with the CocoaPods installation

参考:the-target-overrides

解决方法:

Go to your target Build Settings -> Other linker flags -> double click . Add $(inherited) to a new line.All these 3 errors would be gone by adding $(inherited) to

Header Search Paths

Other Linker Flags

Preprocessor Macros

in Project -> Target -> Build Settings

重新pod

pod install

发表评论