美文网首页『技术栈』iOSiOS深入
如何写一个pod并发布到CocoaPods

如何写一个pod并发布到CocoaPods

作者: TonyDuan | 来源:发表于2015-12-30 13:46 被阅读4846次

    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 trunk

    a.注册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/

    相关文章

      网友评论

      • 崔可一:请问一下 我的文件中引用到了 YYWebImage,podspec中添加了 s.dependency 'YYWebImage' 但是我在 pod lib lint 时候报错找不到 YYWebImage文件 请问这个怎么处理呢?
        TonyDuan:@崔可一 :+1:
        崔可一:@TonyDuan 我参考YYWebImage的写法已经解决这个问题了,在引用第三方库的时候,进行判断
        #if __has_include(<YYWebImage/YYWebImage.h>)
        #import <YYWebImage/YYWebImage.h>
        #else
        #import "YYWebImage.h"
        #endif

        类似于这样
        TonyDuan:@崔可一 这个我还没有遇到过,你看显示的log,再搜索下,不好意思没有帮上忙,如果解决了也请粘贴下,方便遇到类似问题的兄弟看到.
      • 孤独感爆棚:你好我一直存在[!] Unable to read the license file `/Users/caoyunxiao/Desktop/YXProgressHUDView/LICENSE` for the spec `YXProgressHUDView (1.0.1)`这个警告,请问是哪里的原因啊
      • Doliant_H:你好我同样出现了像你图示一样的错误Returned an unsuccessful exit code.这种错误如何判断的呢?
      • mimi不是米:为什么我上传完成之后,在自己的电脑上可以搜到并应用,但是在别人的电脑上却搜索不到?谢谢
        TonyDuan:@mimi不是米 让他pod setup下就好,因为他本地的索引中没有你的pod信息,试试
        mimi不是米:@TonyDuan 在官网也能搜到。
        TonyDuan:@1b9f91351ea3 在pods官网查下你的信息能否收到

      本文标题:如何写一个pod并发布到CocoaPods

      本文链接:https://www.haomeiwen.com/subject/zxeihttx.html