每种语言发展到一定阶段,都会出现相应的依赖管理工具,例如Java语言的Maven、Node.js的npm等。本篇介绍iOS项目的依赖管理工具CocoaPods。
CocoaPods简介
随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的名字叫作CocoaPods。
CocoaPods 项目的源码在 Github 上管理。该项目开始于2011年8月,经过多年发展,现在已经成为iOS开发事实上的依赖管理标准工具。 开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和 更新第三方开源库的时间。
在使用CocoaPods以前,我需要:
1.把这些第三方开源库的源代码文件复制到项目中,或者设置成git的submodule。
2.这些开源库通常需要依赖系统的一些framework,我需要手工地将这些framework 增加到项目依赖中。比如通常情况下,一个网络库就需要增加以下framework: CFNetwork、 SystemConfiguration、MobileCoreServices、CoreGraphics, zlib。
3.对于某些开源库,我还需要设置-licucore或者-fno-objc-arc等编译参数。
4.管理这些依赖包的更新。
这些“体力活”虽然简单,但毫无技术含量并且浪费时间。在使用CocoaPods之后,我只需要 将用到的第三方开源库放到一个名为Podfile的文件中,然后执行pod install。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。
CocoaPods的安装和使用
CocoaPods的安装和使用,在网上可以找到很多教程,这里不做说明。
注意事项
关于.gitignore
当你执行pod install之后,除了Podfile外,CocoaPods还会生成一个名为Podfile.lock的文件,你不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后即使多次执行pod install也不会更改版本,只有执行pod update才会改变Podfile.lock。在多人协作的时候,这样可以防止第三方库升级时造成大家各自的第三方库版本不一致。
CocoaPods 的一篇官方文档也在 What is a Podfile.lock 一节中介绍了 Podfile.lock 的作用,并且指出:
This file should always be kept under version control。
使用私有的pods
我们可以直接指定某一个依赖的podspec,这样就可以使用企业内部的私有库。该方案有利 于使企业内部的公共项目支持CocoaPods。如下是一个示例:
pod ‘MyCommon’, :podspec => ‘https://xxx.com/common/myCommon.podspec'
原理
CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作就从主项目移到了Pods项目中。下面是一些技术细节:
1.Pods项目最终会编译成一个名为IibPods.a的文件,主项目只需要依赖这个.a文件即可。
2.对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
3.CocoaPods通过一个名为Pods.xcconfig的文件在编译时设置所有的依赖和参数。
参考资料:《iOS开发进阶》