您的位置:首页 > 移动开发 > IOS开发

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

2015-05-16 16:35 621 查看
[b]CocoaPods简介[/b]

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了,协议改为了gem sources -a https://ruby.taobao.org/
XQdeMac-mini:iphone-app ioswy$ gem sources --remove http://ruby.taobao.org/
这有可能是因为Ruby的默认源使用的是cocoapods.org。因为ruby的软件源rubygems.org因为使用的亚马逊的云服务,所以被墙了,需要更新一下ruby的源,如下代码将官方的ruby源替换成国内淘宝的源:

gem sources --remove https://rubygems.org/
等上面命令有反应之后再敲入以下命令

gem sources -a http://ruby.taobao.org/
要想验证是否替换成功了,可以执行:

gem sources -l

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

*** CURRENT SOURCES *** http://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/
目录下,这个索引文件比较大。所以第一次更新时非常慢。有人在gitcafeoschina上建立了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怎么添加的介绍,如:



然后按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)`替换掉,



进入终端,执行

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了。





上面的这些是我在操作当中遇到的真实的问题,下面我们继续说明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目录结构如下图:



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的集成。



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"
(库的名称 库的版本号)[/code]
(如果是多个就继续罗列即可):

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: