走远欣赏你 - 博客园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怎么添加的介绍,如:
然后按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"(库的名称 库的版本号)
(如果是多个就继续罗列即可):
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