CocoaPods使用整理

按本人当前的使用和理解,CocoaPods是苹果(包括iOS和Mac)开发过程中代码库依赖管理的一个很好的工具。本人是从Java开发转过来的,一直很好奇iOS开发中有没有类似maven的工具,和maven对应的东西是什么,直到有一天了解并开始接触CocoaPods。不像maven那样复杂,CocoaPods最主要的用处还是对第三方库各个版本依赖的一个管理,方便开发者站在巨人(或众人)的肩膀上。本人使用CocoaPods不算早,接触CocoaPods也有一段时间了,简要整理一下使用过程中的问题和理解。像怎么安装,怎么配置这些其它blog已经写得很好的,官方文档已经说得很清楚的就不在这赘述了。

0. 为啥用CocoaPods

我能想到的有这样几个要用CocoaPods的理由:

  • 我们在开发自己的App时,不太可能所有方面都从头做起,第三方的工具资源是很丰富的,即使有时我们有能力一行一行自己亲为也未必必要。因此如果把第三方开源资源引入进来是个需要考虑的问题。比较土的一种办法是把源码文件Down下来或者copy,这种办法可想是很不“优雅”的,更重要的是如果将来开源库有更新,我们挨个文件替换会很麻烦。CocoaPods可以通过Git的方式把开源库的使用和版本管理关联管理起来,比较好的解决这个问题。
  • 如果我们自己开发的App的各个部分需要拆分成独立模块,我们通常要自己手动搭建workspace,导入子工程,这虽不难,却也麻烦。CocoaPods则会根据配置自己创建好Pods子工程和完整的workspace,省去了很多事。
  • 从使用Git做代码版本维护上考量,子工程通常以submodule的形式引入,我们如果想指定某个submodule的版本,需要到Git下切换其commit或tag。这样submodule少则罢了,多了恐怕很难去挨个调整。而CocoaPods通过一个Podfile做好各方配置,一目了然。
  • 即使不考虑上面这3个点,工程庞大了,源码多了,像ARC/MRR兼容的问题配置起来也和麻烦。而CocoaPods可以最大程度上让每个Pod自己把本来需要使用者配置的东西配好了,写在podspec中,而对于使用者对这些通常可以不必关心。

当然,CocoaPods也不是万能的,和世间万物一样,并非完美无缺。如pod repo的建设和pod spec的版本管理,如果没有一套自动化的流程工具来做,还是有点小麻烦的。而且如上面提到的,CocoaPods应该主要是基于Git的,好在苹果开发者大多都已经用Git管理代码了。

1. 自己创建和使用Pod的一般过程

要想使用Pod,就得有Pod。Pod是一块完整的代码模块,我们要把他用Git管理起来,并按照格式配置好这个Pod的基本信息,也就是pod spec。最后,把pod spec放到pod repo中。因此,pod repo按我的理解也就是一个pod spec的库,最重要的作用可以认为是到源码的指向及说明。

pod spec的编写可参见:

Podspec Syntax Reference

而要想使用Pod,你至少要知道使用哪些Pod,版本是什么,将他们列在Podfile中。这有点类似于maven众pom.xml里的<dependencies>。

Podfile的编写可参见:

The Podfile

2. CocoaPods的大致原理

Cocoa是ruby写的工具,包含CocoaPod、Core、Xcodeproj等部分。

对于一次pod install,CocoaPods通常先读取Podfile配置文件,进行分析,并把pod repo中的spec拉齐,紧接着把pod spec指向的source拉齐到 ~/Library/Caches/CocoaPods,并clone到Pods中,创建Pods工程,为每个Pod生成4个配置文件,安装三方库,写入Podfile.lock和Manifest.lock,记录安装结果,对xcodeproj文件做处理。我们最后还能看到生成了xcworkspace,为我们配好了工作空间。

我们打开就可以看到,CocoaPods把我们需要的Pod都配好了,主工程也采用了其中的一些settings,并且Pods最终汇总生成一个统一的libPods-xxx.a供主工程使用。

3. 印象较深刻的几个问题

其实,使用CocoaPods的过程中,还是会遇到各种各样的问题的,下面简要整理和列了些说明,希望能有帮助。

  • pod不是新的。最新的修改没有集成进主工程,用pod update,这个会更新pod repo的。
  • lock问题(沙盒文件与 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),一般是Podfile.lock和Manifest.lock不一致造成。粗暴直接的办法是,删除Podfile.lock和Pods目录,重新安装。
  • pod顺序相关的问题,注意Podfile里的顺序不同,意义是不完全一样的,如其中有复杂的依赖关系,而且有版本号未限定死的情况,会有问题。如下图。所以要注意版本号和依赖顺序。64b44dd490e60c7ce05e527d2fb84787
  • Linker flags问题。在Pod里提供了vendored library或者framework,但主工程link时却说Undefined symbols,这个很有可能是Link flags里出了问题,可参见主工程的Other Linker Flags是否包含了Pods中的配置,如未包含,则添加下$(inherited)试试。
  • Architecture相关问题。在Build的时候,link阶段出如下问题,“ld: library not found for -lPods-xxx”,但各项配置看起来“没错”,实际上这很可能是Architecture相关settings出了问题,此类往往还一同伴有如“Pods-xxx was rejected as an implicit dependency for ‘libPods-xxx.a’ because its architectures ‘armv7s’ didn’t contain all required architectures ‘armv7 armv7s’”字样的warning。
  • 代码安装过程有问题。可清理 ~/Library/Caches/CocoaPods/Git后重试。libCache
  • Invalid byte sequence问题,这个我在之前的谋篇文章临时的解释了下,可参见:http://www.molotang.com/articles/1590.html

4. 其它

整理本文前,除了翻一翻自己的惨痛经历外,还参考了一些不错的材料:

http://objccn.io/issue-6-4/

http://www.atatech.org/article/detail/17927/0

http://geeklu.com/2013/06/cocoapods-101/

http://ryantang.me/blog/2014/01/05/cocoapods/

http://code4app.com/article/cocoapods-install-usage

欢迎补充,欢迎交流。

祝大家中秋节快乐!

此条目发表在 iOS, 开发, 计算机技术 分类目录,贴了 , , , , 标签。将固定链接加入收藏夹。

CocoaPods使用整理》有 2 条评论

  1. 加勒比水稻 说:

    博主喜欢听雅尼的歌,然而却没有 if i could tell you

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>