[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)

走远欣赏你 - 博客园CocoaPods简介

CocoaPods是一个管理第三方依赖库的工具 。它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程连接起来,供我们开发使用。 使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。( CocoaPods项目的源码在Github上管理。该项目开始于2011年8月12日,现在已经成为iOS开发事实上的依赖管理标准工具。)

在没有使用CocoaPods以前,我们需要:

把这些第三方开源库的源代码文件复制到项目中,或者设置成git的submodule。{项目的版本库在某些情况下需要引用其他版本库中的文件,例如有一套公用的代码库,可以被多个项目调用,这个公用代码库能直接放在某个项目的代码中,而是要独立为一个代码库,那么其他要调用公用的代码库该如何处理?分别把公用的代码库拷贝到各自的项目中会造成冗余,丢弃了公共代码库的维护历史,这些显示不是好的办法,现在要了解的git子模组(git submodule)就解决了这个问题。}

对于这些开源库通常需要依赖系统的一些framework,我需要手工地将这些framework一一增加到项目依赖中。

对于某些开源库,我还需要设置-licucore或者-fno-objc-arc等编译参数。

管理这些依赖包的更新。

在使用CocoaPods之后,我们只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后执行pod install。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。

CocoaPods的安装

1.准备工作

注意:想要使用CocoaPods,就要下载安装它,因为CocoaPods是跑在Ruby环境下面的软件,所以下载安装CocoaPods需要Ruby环境。幸运的是OS X系统默认的已经可以运行Ruby了。

在安装的过程中,我们可能遇到诸如 "gem版本过老,执行完install命令半天没反应" 的问题,那么我们可以先行做一些准备操作,尽量避免这些问题。

问题①gem版本过老

先行解决:gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是 升级gem, 执行下述命令即可(需要输入电脑密码)

sudo gem update --system

问题②执行完install命令半天没反应

友情推荐:如果出现了CocoaPods的ruby镜像文件问题  (  gem sources  -a http://ruby.taobao.org/  出现404了),那是因为http改为了https了:

gem sources  -a https://ruby.taobao.org/ 

如果曾经  gem sources -a http://ruby.taobao.org/  过,

那么可以  gem sources -l  查看一下

如果有:

*** CURRENT SOURCES ***

http://ruby.taobao.org/

那么还需要先进行如下清除操作:

gem sources --remove http://ruby.taobao.org/

因为Ruby的默认源使用的是cocoapods.org。因为ruby的软件源rubygems.org因为使用的亚马逊的云服务,被墙了,需要更新一下ruby的源,如下代码将官方的ruby源替换成国内淘宝的源:

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

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

gem sources -a https://ruby.taobao.org/

要想验证是否替换成功了,可以执行:

gem sources -l

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

*** CURRENT SOURCES ***https://ruby.taobao.org/

2.安装

终端输入以下命令:

sudo gem install cocoapods

(如果成功 会有一个 Successfully installed cocoaPods的提示 ,具体如下:

XQdeMac-mini:~ ioswy$ sudo gem install cocoapods

Successfully installed cocoapods-0.38.2

Parsing documentation for cocoapods-0.38.2

1 gem installed)

在安装成功结束的时候,执行如下命令:

pod setup

(如果没有报错,就说明一切安装就成功了!)

如果想查找相关:“pod COMMAND” 的具体任务操作,可以执行下面的命令,就可以找到相关的说明(类似 git help的作用)

pod(该命令可以查到具体的pod COMMAND的任务)

如pod Search

pod search SDWebImage

说明:CocoaPods是以Ruby gem包的形式被安装的。在安装执行的过程中,可能会问我们是不是更新rake,输入y即可。

3、升级CocoaPods

升级很简单,再次执行安装命令即可:

sudo gem install cocoapods

需要注意的是,如果安装的时候使用了sudo,升级的时候一样需要使用该关键字,不然升级完了以后又会出现路径不匹配问题。

4、补充说明:

还有一点需要注意,pod setup在执行时,会输出Setting up CocoaPods master repo,但是会等待比较久的时间。

XQdeMac-mini:~ ioswy$ pod setup

Setting up CocoaPods master repo

CocoaPods 0.39.0.beta.4 is available.

To update use: `gem install cocoapods --pre`

[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org

and the CHANGELOG for this version http://git.io/BaH8pQ.

Setup completed

这步其实是Cocoapods在将它的信息下载到~/.cocoapods目录下,如果你等太久,可以试着cd到那个目录,用du -sh *来查看下载进度。你也可以参考使用cocoapods的镜像索引内容来提高下载速度。以下说明:怎么使用cocoapods的镜像索引:

所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的~/.cocoapods/目录下,这个索引文件比较大。所以第一次更新时非常慢。有人在gitcafe和oschina上建立了CocoaPods索引库的镜像,因为gitcafe和oschina都是国内的服务器,所以在执行索引更新操作时,会快很多。如下操作可以将CocoaPods设置成使用gitcafe镜像:

pod repo remove master

pod repo add master https://gitcafe.com/akuandev/Specs.git

pod repo update

将以上操作中的https://gitcafe.com/akuandev/Specs.git替换成http://git.oschina.net/akuandev/Specs.git即可使用oschina上的镜像。

CocoaPods的使用

安装好CocoPods之后,接下来就是使用它。所幸,使用CocoPods和安装它一样简单,也是通过一两行命令就可以搞定。

场景1:利用CocoaPods,在项目中导入AFNetworking类库

AFNetworking类库在GitHub地址是:https://github.com/AFNetworking/AFNetworking

1 、如果不知道CocoPods管理的库中是否有你想要的第三方类库,那么你可以通过pod search命令进行查找。在终端中输入:

pod search AFNetworking

你可以查找到该类库所有可用的库

2、如果支持的话,我们可以利用CocoaPods将AFNetworking导入你的项目中。

首先,我们需要在我们的项目中加入CocoaPods的支持。看看项目没有支持CocoaPods时的项目Xcode目录结构:

上图等一下要跟项目支持CocoaPods之后的项目Xcode目录结构做对比。

你看到这里也许会问,CocoaPods为什么能下载AFNetworking呢,而不是下载其他类库呢?这个问题的答案是,有个文件来控制CocoaPods该下载什么。这个文件就叫做“Podfile”(注意,一定得是这个文件名,而且没有后缀)。你创建一个Podfile文件,然后在里面添加你需要下载的类库,每个项目只需要一个Podfile文件。

在终端中进入(cd命令到)你项目所在目录,然后在当前目录下,利用vim创建Podfile,运行:

vim Podfile

键盘输入 i,进入编辑模式,

然后在Podfile文件中输入以下文字:

platform :ios, '7.0'

pod "AFNetworking", "~> 2.0"

注意,这段文字不是小编凭空生成的,可以在AFNetworking的github页面找到。这两句文字的意思是,当前AFNetworking支持的iOS最低版本是iOS 7.0, 要下载的AFNetworking版本是2.0。一般你需要添加什么样的第三方库,第三方库说明文档中会有pods怎么添加的介绍,如:

[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)_第1张图片

然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq保存退出。vim环境下,保存退出命令是:

:wq

注意:键盘输入 :后,才能输入wq。

这时候,你会发现你的项目目录中,出现一个名字为Podfile的文件,而且打开文件后发现文件内容就是你刚刚输入的内容。

platform :ios, '7.0'

pod "AFNetworking", "~> 2.0"

注意,Podfile文件应该和你的工程文件.xcodeproj在同一个目录下。

这时候,你就可以利用CocoPods下载AFNetworking类库了。还是在终端中的当前项目目录下,运行以下命令

pod install

本人在操作的过程中真实的状况如下(出现了常见的警告,必须解决):

XQdeMac-mini:~ ioswy$ cd /Users/XQ/Desktop/yoowei/congke_IOS

XQdeMac-mini:congke_IOS ioswy$ pwd

/Users/XQ/Desktop/yoowei/congke_IOS

XQdeMac-mini:congke_IOS ioswy$ vim Podfile

XQdeMac-mini:congke_IOS ioswy$ pod install

Updating local specs repositories

CocoaPods 0.39.0.beta.4 is available.

To update use: `gem install cocoapods --pre`

[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org

and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies

Downloading dependencies

Installing AFNetworking (2.6.0)

Generating Pods project

Integrating client project

[!] Please close any current Xcode sessions and use `Congke_kaoyan2.xcworkspace` for this project from now on.

Sending stats

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

- Use the `$(inherited)` flag, or

- Remove the build settings from the target.

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

- Use the `$(inherited)` flag, or

- Remove the build settings from the target.

[!] The `Congke_kaoyan2 [Release]` target overrides the `OTHER_CFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation

- Use the `$(inherited)` flag, or

- Remove the build settings from the target.

[!] The `Congke_kaoyan2 [Release]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation

- Use the `$(inherited)` flag, or

- Remove the build settings from the target.

这种警告是不能忽视的,它带来的直接后果就是无法通过编译。

而产生此警告的原因是项目 Target 中的一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题。

我想要使用 CocoaPods 中的设置,分别在我的项目中定义`OTHER_CFLAGS` 和 `Other Linker Flags`的地方,把他们的值用`$(inherited)`替换掉,

[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)_第2张图片

进入终端,执行

pod update

警告没了,回到 Xcode,build通过。

网上还流行另外一种简单粗暴的方法

点击项目文件 project.xcodeproj,右键`显示包内容`,用文本编辑器打开`project.pbxproj`,删除`OTHER_LDFLAGS`的地方,保存,回到 Xcode,编译通过。

由于我原来项目中已经存在了AFNetworking的库,现在用cocospods又更新下载了一次,项目中会报错,所以需要将原来的删掉,

ld: 456 duplicate symbols for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果other linker Flags 还有诸如-all_load的值,也可能报错,所以也一并干掉,之后编译就ok了。

[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)_第3张图片

上面的这些是我在操作当中遇到的真实的问题,下面我们继续说明cocospods.刚才在pod install之后

Analyzing dependencies

Downloading dependencies

Installing AFNetworking (2.6.0)

Generating Pods project

Integrating client project

[!] Please close any current Xcode sessions and use `Congke_kaoyan2.xcworkspace` for this project from now on.

注意最后一句话,意思是:以后打开项目就用 Congke_kaoyan2.xcworkspace 打开,而不是之前的.xcodeproj文件。

你刚刚运行pod install命令产生的新文件中除了这个文件,你会发现还多了另外一个文件“Podfile.lock”和一个文件夹“Pods”。 项目Xcode目录结构如下图:

[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)_第4张图片

AFNetwoking已经成功导入项目

至此,CocoPods的第一个应用场景讲述完毕,其实过程是十分简单的。总结一下就是:

先在项目中创建Podfile,Podfile的内容是你想导入的类库的说明。

运行命令:pod install.

如果遇到上面的类似的问题的话,先解决问题,然后执行一下:pod update 即可。

场景2:如何正确编译运行一个包含CocoPods类库的项目

你可能好不容易在GitHub上找到一份代码符合自己的需求,编译发现有各种各样错误。一看,原来是缺失了各种其他第三方类库。这时候莫慌,你再仔细一看,会发现你下载的代码包含了Podfile。没错,这意味着你可以用CocoaPods很方便下载所需要的类库。

下面,小编以代码UAAppReviewManager为例来说明如何正确编译运行一个包含CocoPods类库的项目。

UAAppReviewManager是一个能够让你方便地将提醒用户评分的功能加入到你的应用中。当你去UAAppReviewManager的GitHub地址下载这份代码之后,打开Example工程(UAAppReviewManagerExample),编译,你会发现Xcode报告一大堆错误,基本都是说你编译的这份代码找不到某某头文件,这就意味着你要成功编译UAAppReviewManager的Example代码,必须先导入一些第三方类库。同时你会发现在UAAppReviewManagerExample文件夹下面有三个跟CocosPods相关的文件(文件夹):Podfile,Podfile.lock和Pods。

这时候,打开终端,进入UAAppReviewManagerExample所在的目录,也就是和Podfile在同一目录下,和场景1一样,输入以下命令(由于已经有Podfile,所以不需要再创建Podfile):

pod update

一段时间之后,终端出现:

Analyzing dependencies

Fetching podspec for `UAAppReviewManager` from `../`

Downloading dependencies

Installing UAAppReviewManager (0.1.6)

Generating Pods project

Integrating client project

[!] From now on use `UAAppReviewManagerExample.xcworkspace`.

这时候,再回到UAAppReviewManagerExample文件夹看一看,会看到多了一个文件UAAppReviewManagerExample.xcworkspace:

根据终端的信息提示,你以后就需用新产生的UAAppReviewManagerExample.xcworkspace来运行这个Example代码了。

打开UAAppReviewManagerExample.xcworkspace,编译运行,成功!

注意,这里有个小问题,如果刚刚你不是输入pod update,而是输入pod install,会发现类库导入不成功,并且终端出现下面提示:

[!] Required version (UAAppReviewManager (from `../`)) not found for `UAAppReviewManager`.

Available versions: 0.1.6

这里的意思大概是Podfile文件过期,类库有升级,但是Podfile没有更改。pod install只会按照Podfile的要求来请求类库,如果类库版本号有变化,那么将获取失败。但是pod update会更新所有的类库,获取最新版本的类库。而且你会发现,如果用了pod update,再用pod install就成功了。

那你也许会问,什么时候用pod install,什么时候用pod update呢,我又不知道类库有没有新版本。好吧,那你每次直接用pod update算了。或者先用pod install,如果不行,再用pod update。总之优先使用pod update 命令。

场景3:如何给项目新添一个第三方库。

如果需要依赖多个第三方类库,那么将要导入新的第三方库。由于Podfile已经存在,只需要修改Podfile文件的内容,然后运行pod update命令即可,比如新增一个

SDWebImage第三方库,首先执行pod searchSDWebImage查看一下SDWebImage的配置信息(或者直接到github上面查找),修改Podfile文件内容,在后面增加

SDWebImage的对应配置信息,然后运行pod update命令就完成了对SDWebImage的集成。

[置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei)_第5张图片

XQdeMac-mini:congke_IOS ioswy$ pod update

Update all pods

Updating local specs repositories

CocoaPods 0.39.0.beta.4 is available.

To update use: `gem install cocoapods --pre`

[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org

and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies

Downloading dependencies

Installing AFNetworking 2.5.4 (was 2.6.0)

Installing SDWebImage (3.7.3)

Generating Pods project

Integrating client project

Sending stats

补充1:

1.创建一个 Podfile 文件(可以用vim,也可以用如下方式)

继续在你的终端操作,先使用 cd 操作 进入你的项目目录例如

XQdeMac-mini:congke_IOS ioswy$ cd /Users/XQ/Desktop/未命名文件夹

在这个目录下创建文件

touch Podfile然后回车继续输入

open -e Podfile这时将直接打开一个空的文件

现在在刚才打开的空白Podfile中加入你想要的,如

platform :ios, '7.0'(这表示应用平台)

pod "AFNetworking", "~> 2.0"(库的名称 库的版本号)

(如果是多个就继续罗列即可):

platform :ios, '7.0'

pod "AFNetworking", "~> 2.0"

platform :ios, '6.1'

pod 'SDWebImage', '~>3.7'

2.关于.gitignore

当你执行pod install之后,除了Podfile外,CocoaPods还会生成一个名为Podfile.lock的文件,你不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。

3.对于工程发生的变化,有几点需要说明:

第三方库会被编译成静态库供我们正真的工程使用

我们的工程和第三方库所在的工程会由一个新生成的workspace管理

为了方便我们直观的管理工程和第三方库,Congke_kaoyan2工程和Pods工程会被以workspace的形式组织和管理,也就是我们刚才看到的Congke_kaoyan2.xcworkspace文件。

原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。

在项目中引用刚才添加的第三方库的头文件,执行编译操作,果断成功!

CocoaPods的原理

研究了一下CocoaPods的原理,CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,即将所有的依赖库都放到一个名为Pods工程中,然后让主项目依赖Pods工程,这样,源码管理工作都从主工程移到了Pods工程中。发现的一些技术细节有:

Pods工程最终会编译成一个名为libPods.a的静态库,主项目只需要依赖这个.a文件即可,即提供给我们自己的Congke_kaoyan2工程使用。

对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。

CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。

参考文章:http://www.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/

http://code4app.com/article/cocoapods-install-usage

你可能感兴趣的:([置顶]CocoaPods :为iOS程序提供依赖管理的工具(yoowei))