1,Cocoapods是什么?
每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,Node.js的npm,C#的Nuget。随着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的文件中,然后执行pod install。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。
CocoaPods是一个用来帮助我们管理第三方依赖库的工具,用它可以解决库与库的依赖,下载库的源代码,同时通过创建一个Xcode的workspace来将这些三方库和我们的工程连接起来,供我们开发使用。使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。
2,CocoaPods安装、使用、原理
打开Terminal,假如你本地的Ruby环境是可用的。输入 sudo gem install cocoapods(需要科学上网)
安装好Cocoapods后,在命令行中 pod search 'DHFixCLLocation'
图1:WGS-84 to GCJ-02即可看到需要集成可用的三方代码库的pod文件怎么写,这里是 pod 'DHFixCLLocation','~> 1.0.0',为了便捷使用你可以直接复制这句到Podfile中。使用过程:假如你新建一个Xcode的工程文件,并在*.xcodeproj中同级目录下,创建一个名为Podfile的文件,并简单配置下,然后在Terminal中,首次安装用pod install,后面又跟新用pod update,接下来就等Cocoapods自动运作了。根据提示,关闭当前你打开的Xcode工程文件,打开*.xcworkspace工作空间,即可调用库的代码。
图2:Podfile的建立及配置 图3:pod install or pod update完成后的打开方式原理说明:
a.第三方库会被编译成.a静态库供我们真正的工程使用。
CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给我们自己的CocoaPodsTest工程使用。对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
b.我们的工程和第三方库所在的工程会由一个新生成的workspace管理
为了方便我们直观的管理工程和第三方库,Demo工程和Pods工程会被以workspace的形式组织和管理,也就是我们刚才看到的Demo.xcworkspace文件。
c.原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。
d.CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。
图4:工程文件和Cocoapods的联系 图5:Project的Configuration文件配置3,写一个pod发布到CocoaPods
我在日常开发中用到了CocoaPods,但大多用的都是别人的库,寻思着自己也要尝试发布一个pod到公共代码中去,这次发文的同时也发布了个简单的代码(DHFixCllocation2DHelper .h/.m)到CocoaPods。当我们日常调用iOS的CoreLocation的SDK获取到的位置是WGS-84坐标系,然而反向地理位置解析用的是GCJ-02坐标系,所谓的火星坐标偏移。最直观的就是iOS系统的CLLocation的坐标体系和Mapkit的坐标体系的差异,若将CLLocation的经纬度直接绘制在你Map上面会出现的偏移。
图6:wgs-84 to gcj-02实现过程下面就让我们跟着以下这张图来走完整个流程:
图7:pod trunka.注册trunk
pod trunk register EMAIL [NAME]
pod trunk register duanhai@outlook.com 'TonyDuan' --verbose
注册成功后会在你的邮箱收到一份确认邮件
pod trunk me
注册成功后可以看到相应的信息
图8:注册trunk确认信息b,创建podspec文件
用pod的命令创建podspec文件
pod spec create DHFixCLLocation
会生成一个DHFixCLLocation.podspec文件我们只需要简单修改下相应的信息即可。
图9:DHFixCLLocation.podspec①s.summary 即pod search 'name'的时候显示的说明
②s.homepage git的仓库地址
③s.license Pods依赖库使用的license类型,填上对应的即可
④s.source_files 源文件路径,相对于podspec文件而言,本文中是DHCLLocation的文件夹下面的文件
图10:podspec的文件结构⑤s.frameworks 需要用到的frameworks,上图我截图时候截掉了,这里补充下
*1 s.frameworks="CoreLocation","Foundation"
p.s.从github上面创建仓库并且clone这步我没有给出,需要说明的是创建仓库的时候应该把license加上,并且加上说明,方便开发者调用。
c.通过trunk推送podspec文件以及验证pod文件
在做这个步骤之前需要你确认两点
①.确保你的源码已经push到Github上。如果还没push源代码,可以用Terminal cd到本地源代码的根目录,执行
git add -A
git commit -m"first commit for version 1.0.0"
git push origin master
②.确保你所push的代码已经打上"version tag",也就是给源代码打上版本号标签:
git tag'1.0.0'
git push --tags
确认上面的两点后,为了让推送能够顺利进行,我们可以对我们的pod文件进行一个验证。
参考:http://blog.csdn.net/wzzvictory/article/details/20067595中的 第四点。
pod lib lint的时候遇到了一个错误
图11:pod lib lint验证在pod lib lint 后面加上--verbose后可以得出更详细的信息,根据我的文件我的警告是description文件太短了,另外的一个错误是我把framework的依赖写成了CLLocation,应该是CoreLocation见上文中*1的地方。
图12:pod lib lint验证通过验证通过后就来到了最后一步
pod trunk push DHFixCLLocation.podspec 执行过程如图4的过程
图13:pod trunk push DHFixCLLocation.podspec我的上传过程还比较顺利,审核很快就过了。但是当我pod search 自己库名的时候,这个时候始终没有出现。其实这个时候你需要重新配置下你本地的pod库索引 pod setup,等待同步、合并的过程,完成后再来pod search 'DHFixCLLocation'就出来了。上传一个pod到Cocoapods到此结束。想想是不是很激动呢,此刻有千千万万人的正在壮大、丰富这个库。Cocoapods让越来越多的开发者接受,并且出力。常用到的三方框架AFNetworking,VLCKit,FFMpeg等都在上面能够找到,同时许多SDK发布也采用了这种pod的模式,让你将更多的时间花在更有意义的事情上。方便你使用的同时,请你认清楚该pod采用的哪种协议(MIT or Others),综合考虑后选择你最钟意的一个pod来提升效率吧。
参考:
https://blog.cocoapods.org/CocoaPods-Trunk/
https://guides.cocoapods.org/making/getting-setup-with-trunk.html
http://objccn.io/issue-6-4/
网友评论
#if __has_include(<YYWebImage/YYWebImage.h>)
#import <YYWebImage/YYWebImage.h>
#else
#import "YYWebImage.h"
#endif
类似于这样