用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
我在开发猿题库客户端时,使用了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 |
1 | sudogemupdate--system |
1 23 | gemsources--remove |
podsetup在执行时,会输出
SettingupCocoaPodsmasterrepo,但是会等待比较久的时间。这步其实是Cocoapods在将它的信息下载到
~/.cocoapods目录下,如果你等太久,可以试着cd到那个目录,用
du-sh*来查看下载进度。你也可以参考本文接下来的
使用cocoapods的镜像索引一节的内容来提高下载速度。
使用CocoaPods的镜像索引
所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行
podsetup时,CocoaPods会将这些
podspec索引文件更新到本地的
~/.cocoapods/目录下,这个索引文件比较大,有80M左右。所以第一次更新时非常慢,笔者就更新了将近1个小时才完成。
一个叫
1 23 | podreporemovemaster podrepoaddmaster |
https://gitcafe.com/akuandev/Specs.git替换成
http://git.oschina.net/akuandev/Specs.git即可使用oschina上的镜像。
使用CocoaPods
使用时需要新建一个名为Podfile的文件,以如下格式,将依赖的库名字依次列在文件中即可1 23 | platform:ios pod'JSONKit','~>1.4' pod'Reachability','~>3.0.0' pod'ASIHTTPRequest' pod'RegexKitLite' |
1 2 | cd"yourprojecthome" podinstall |
使用CocoaPods生成的.xcworkspace文件来打开工程,而不是以前的.xcodeproj文件。
每次更改了Podfile文件,你需要重新执行一次
podupdate命令。
查找第三方库
你如果不知道cocoaPods管理的库中,是否有你想要的库,那么你可以通过podsearch命令进行查找,以下是我用podsearchjson查找到的所有可用的库:1 23 | $podsearchjson ->AnyJSON(0.0.1) Encode/DecodeJSONbyanymeanspossible. -Homepage: |
关于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 |
your_pod_spec_name.podspec的文件,然后我们修改其中的相关内容即可。
具体步骤可以参考这两篇博文中的相关内容:
使用私有的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 |
原理
大概研究了一下CocoaPods的原理,它是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。发现的一些技术细节有:Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。
对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。
愿大家玩得开心~
本人发言:
巧叔力作!
对于像我这样的菜鸟来说,连创建个Podfile文件都是问题。所以一起记录下来:
终端里创建Podfile文件:
1 | vimPodfile |
按esc退出编辑状态;
输入:wq将缓冲区内的资料写入磁盘中,并退出;
如果想重新编辑Podfile文件,输入viPodfile。
可以参考
另外在学习过程中我还存在另外一个问题。
如果在Podfile文件中写的内容如下:
1 23 | platform:ios |
然后执行如下命令:
1 2 |
|
后来发现是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的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本
希望我的经历能够帮助更多的人!
相关文章推荐
- idfa还是idfv,IOS唯一标示利弊分析
- iOS开展block说明
- iOS9适配技巧
- ubuntu 启动项创建器 选择不了CD镜像,IOS镜像的解决方法
- IOS 证书配置
- iOS9新特性
- iOS9 JSONKit闪退解决方案
- iOS程序拨打电话
- iOS 小 Tip:优化侧滑返回与 ScrollView 的兼容性
- iOS中传值方式
- iOS单个方向的圆角处理
- NSUserDefaults
- ios 类似于网易广告栏许多栏目Button 点击变颜色
- iOS开发学习笔记-创建和初始化对象
- iOS触摸其他控件弹回键盘
- iOS8定位问题,在iPhone设置中点击开启定位功能直接崩溃的问题
- iOS9中友盟分享不能使用 破解方法
- iOS storyboard 多个子视图均匀排列
- iOS TextField 的用法
- iOS9中错误信息信息是引入的一个第三方库不包含bitcode