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

用CocoaPods做iOS程序的依赖管理(转载)

2015-09-17 18:08 267 查看

原文链接:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/

用CocoaPods做iOS程序的依赖管理

MAY25TH,2014



文档更新说明

2012-12-02v1.0初稿

2014-01-08v1.1增加设置ruby淘宝源相关内容

2014-05-25v2.0增加国内spec镜像、使用私有pod、podfile.lock、创建spec文件等内容

2015-09-03v2.1优化排版,调整一些描述方式,使文章更易读懂。

CocoaPods简介

每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的名字叫做:CocoaPods。

CocoaPods项目的源码在Github上管理。该项目开始于2011年8月12日,经过多年发展,现在已经成为iOS开发事实上的依赖管理标准工具。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和更新第三方开源库的时间。

我在开发猿题库客户端时,使用了24个第三方开源库。在没有使用CocoaPods以前,我需要:

把这些第三方开源库的源代码文件复制到项目中,或者设置成git的submodule。

对于这些开源库通常需要依赖系统的一些framework,我需要手工地将这些framework分别增加到项目依赖中,比如通常情况下,一个网络库就需要增加以下framework:CFNetwork,SystemConfiguration,MobileCoreServices,CoreGraphics,zlib。

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

管理这些依赖包的更新。

这些体力活虽然简单,但毫无技术含量并且浪费时间。在使用CocoaPods之后,我只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后执行
podinstall
。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。

CocoaPods的安装和使用介绍

安装

安装方式异常简单,Mac下都自带ruby,使用ruby的gem命令即可下载安装:

1
2

$sudogeminstallcocoapods
$podsetup

如果你的gem太老,可能也会有问题,可以尝试用如下命令升级gem:

1

sudogemupdate--system

另外,ruby的软件源https://rubygems.org因为使用的是亚马逊的云服务,所以被墙了,需要更新一下ruby的源,使用如下代码将官方的ruby源替换成国内淘宝的源:

1
23

gemsources--removehttps://rubygems.org/gemsources-ahttp://ruby.taobao.org/gemsources-l

还有一点需要注意,
podsetup
在执行时,会输出
SettingupCocoaPodsmasterrepo
,但是会等待比较久的时间。这步其实是Cocoapods在将它的信息下载到
~/.cocoapods
目录下,如果你等太久,可以试着cd到那个目录,用
du-sh*
来查看下载进度。你也可以参考本文接下来的
使用cocoapods的镜像索引
一节的内容来提高下载速度。

使用CocoaPods的镜像索引

所有的项目的Podspec文件都托管在
https://github.com/CocoaPods/Specs
。第一次执行
podsetup
时,CocoaPods会将这些
podspec
索引文件更新到本地的
~/.cocoapods/
目录下,这个索引文件比较大,有80M左右。所以第一次更新时非常慢,笔者就更新了将近1个小时才完成。

一个叫akinliu的朋友在gitcafe和oschina上建立了CocoaPods索引库的镜像,因为gitcafe和oschina都是国内的服务器,所以在执行索引更新操作时,会快很多。如下操作可以将CocoaPods设置成使用gitcafe镜像:

1
23

podreporemovemaster
podrepoaddmasterhttps://gitcafe.com/akuandev/Specs.gitpodrepoupdate

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

使用CocoaPods

使用时需要新建一个名为Podfile的文件,以如下格式,将依赖的库名字依次列在文件中即可

1
23
4
5

platform:ios
pod'JSONKit','~>1.4'
pod'Reachability','~>3.0.0'
pod'ASIHTTPRequest'
pod'RegexKitLite'

然后你将编辑好的Podfile文件放到你的项目根目录中,执行如下命令即可:

1
2

cd"yourprojecthome"
podinstall

现在,你的所有第三方库都已经下载完成并且设置好了编译参数和依赖,你只需要记住如下2点即可:

使用CocoaPods生成的.xcworkspace文件来打开工程,而不是以前的.xcodeproj文件。

每次更改了Podfile文件,你需要重新执行一次
podupdate
命令。

查找第三方库

你如果不知道cocoaPods管理的库中,是否有你想要的库,那么你可以通过podsearch命令进行查找,以下是我用podsearchjson查找到的所有可用的库:

1
23
4
5
6
7
8
9
10
1112
13
14
15
16

$podsearchjson

->AnyJSON(0.0.1)
Encode/DecodeJSONbyanymeanspossible.
-Homepage:https://github.com/mattt/AnyJSON-Source:https://github.com/mattt/AnyJSON.git-Versions:0.0.1[masterrepo]

->JSONKit(1.5pre)
AVeryHighPerformanceObjective-CJSONLibrary.
-Homepage:https://github.com/johnezang/JSONKit-Source:git://github.com/johnezang/JSONKit.git
-Versions:1.5pre,1.4[masterrepo]

//...以下省略若干行

关于Podfile.lock

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

CocoaPods的这篇官方文档也在
WhatisaPodfile.lock
一节中介绍了
Podfile.lock
的作用,并且指出:


Thisfileshouldalwaysbekeptunderversioncontrol.


为自己的项目创建podspec文件

我们可以为自己的开源项目创建
podspec
文件,首先通过如下命令初始化一个
podspec
文件:

1

podspeccreateyour_pod_spec_name

该命令执行之后,CocoaPods会生成一个名为
your_pod_spec_name.podspec
的文件,然后我们修改其中的相关内容即可。

具体步骤可以参考这两篇博文中的相关内容:

《如何编写一个CocoaPods的spec文件》

《Cocoapods入门》。

使用私有的pods

我们可以直接指定某一个依赖的
podspec
,这样就可以使用公司内部的私有库。该方案有利于使企业内部的公共项目支持CocoaPods。如下是一个示例:

1

pod'MyCommon',:podspec=>'https://yuantiku.com/common/myCommon.podspec'

不更新podspec

CocoaPods在执行
podinstall
podupdate
时,会默认先更新一次
podspec
索引。使用
--no-repo-update
参数可以禁止其做索引更新操作。如下所示:

1
2

podinstall--no-repo-update
podupdate--no-repo-update

生成第三方库的帮助文档

如果你想让CococaPods帮你生成第三方库的帮助文档,并集成到Xcode中,那么用brew安装appledoc即可:

1

brewinstallappledoc

关于appledoc,我在另一篇博客《使用Objective-C的文档生成工具:appledoc》中有专门介绍。它最大的优点是可以将帮助文档集成到Xcode中,这样你在敲代码的时候,按住opt键单击类名或方法名,就可以显示出相应的帮助文档。

原理

大概研究了一下CocoaPods的原理,它是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。发现的一些技术细节有:

Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。

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

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

愿大家玩得开心~

本人发言:

  巧叔力作!

  对于像我这样的菜鸟来说,连创建个Podfile文件都是问题。所以一起记录下来:

  终端里创建Podfile文件:

1

vimPodfile





  按i为编辑状态;

  按esc退出编辑状态;

  输入:wq将缓冲区内的资料写入磁盘中,并退出;

  如果想重新编辑Podfile文件,输入viPodfile。

  可以参考Unix命令大全。

  另外在学习过程中我还存在另外一个问题。

  如果在Podfile文件中写的内容如下:

1
23
4
5

platform:ios
pod'JSONKit','~>1.5pre'
pod'AFNetworking','~>2.6.0'



  

  然后执行如下命令:

1
2


podinstall



  会出现如下错误:

  


  后来发现是platformios后边没有跟平台版本号的原因。

  另外,引入依赖库时,需要显示或隐式注明引用的依赖库版本,具体写法和表示含义如下:

pod'AFNetworking'//不显式指定依赖库版本,表示每次都获取最新版本
pod'AFNetworking','2.0'//只使用2.0版本
pod'AFNetworking','>2.0'//使用高于2.0的版本
pod'AFNetworking','>=2.0'//使用大于或等于2.0的版本
pod'AFNetworking','<2.0'//使用小于2.0的版本
pod'AFNetworking','<=2.0'//使用小于或等于2.0的版本
pod'AFNetworking','~>0.1.2'//使用大于等于0.1.2但小于0.2的版本
pod'AFNetworking','~>0.1'//使用大于等于0.1但小于1.0的版本
pod'AFNetworking','~>0'//高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本


  希望我的经历能够帮助更多的人!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航