iOS 第三方框架 - CocoaPods的安装、使用、原理

介绍 CocoaPods

每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的名字叫做:CocoaPods。

CocoaPods项目的源码在Github上管理。

Cocoapods意义体现在两个方面:

  1. 引入第三方库无可避免地要进行各种各样的配置。对于Objective-C的初级开发者来说,项目配置可是一件艰巨的任务。在配置编译阶段和链接器选项的过程中,极有可能引入许多人为的错误。而CocoaPods简化了这一切,它能自动配置编译选项,拯救了开发者。

  2. 使用CocoaPods可以很方便地查找新的第三方库。让你找到真正好用的库,缩短你的开发周期,提升你的代码质量。

接下来,我们将通过分析pod安装的过程,一步步揭示CocoaPods背后的技术。

   CocoaPods 的安装

CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境。幸运的是OS X系统默认的已经可以运行Ruby了,因此我们只需要执行以下命令。

1、更换 Gem 的源

Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org)源来查找、安装、升级和卸载软件包

1.移除掉原有的源(服务器在国外,速度较慢)

$ gem sources --remove https://rubygems.org/

2.等有反应之后再敲入以下命令(添加国内的Ruby China官方的源)

$ gem source -a https://gems.ruby-china.org

3.验证是否替换成功

$ gem sources -l

2、更新升级 Gem 版本

Gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级Gem,执行下述命令即可:

更新升级gem

$ sudo gem update --system

 
 

3、安装CocoaPods

安装CocoaPods(OS X 10.11以前)

$ sudo gem install cocoapods


 

安装CocoaPods(10.11后苹果升级了安全策略)

$ sudo gem install -n /usr/local/bin cocoapods

 

4、更换repo镜像为国内服务器

所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的 ~/.cocoapods/目录下,这个索引文件比较大,有80M左右。所以第一次更新时非常慢。

一个叫akinliu的朋友在gitcafe和oschina上建立了CocoaPods索引库的镜像,因为gitcafe和oschina都是国内的服务器,所以在执行索引更新操作时,会快很多。

如下操作可以将CocoaPods设置成使用gitcafe镜像:

1.移除原有服务器

$ pod repo remove master



 

2.添加境内服务器(建议使用第一个)

$ pod repo add master https://gitcafe.com/akuandev/Specs.git

$ pod repo add master http://git.oschina.net/akuandev/Specs.git

 

3.查看是否添加源成功

$ pod repo


 
 

CocoaPods 的使用

1、新建 Podfile 文件

使用时需要在你的项目根目录下新建一个名为Podfile的文件,将依赖的库名字依次列在文件中即可
进入你的工程目录

$ cd /Users/xiao/Desktop/CocoaPodsDemo  


 

创建Pods文件

$ touch Podfile



 

2、编辑 Podfile 文件

假设我们想导入 AFNetworking ,进入http://cocoapods.org,搜索AFNetworking

3、执行导入命令

$ cd /Users/xiao/Desktop/CocoaPodsDemo 

$ pod install
 

pod install命令执行成功后,会看到工程目录下多出CocoaPodsTest.xcworkspace、Podfile.lock文件和Pods目录。

再看看刚才执行完pod install命令打印出来的内容的最后一行:From now on use CocoaPodsDemo.xcworkspace.提示我们从现在起,我们需要使用CocoaPodsTest.xcworkspace文件来开发。

4、第三方库更新

只需要在Podfile文件中添加相应的第三方库信息,执行pod update命令即可。 $ pod update

5、解决问题

以后使用CocoaPods过程中出现了莫名其妙的问题,执行下面命令:

$ sudo gem update --system

$ sudo gem install cocoapods

$ pod setup


 

1、pod install提速

每次执行pod install和pod update的时候,cocoapods都会默认更新一次spec仓库。这是一个比较耗时的操作。在确认spec版本库不需要更新时,给这两个命令加一个参数跳过spec版本库更新,可以明显提高这两个命令的执行速度。

$ pod install --verbose --no-repo-update

$ pod update --verbose --no-repo-update


 
 

2、关于Podfile文件编辑

第三方库版本号的各种写法

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’, ‘~>0.1.2′//使用大于等于0.1.2但小于0.2的版本,相当于>=0.1.2并且<0.2.0
pod ‘AFNetworking’, ‘~>0.1′//使用大于等于0.1但小于1.0的版本
pod ‘AFNetworking’, ‘~>0′//高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本

核心组件

CocoaPods是用ruby写的,并划分成了若干个Gem包。CocoaPods在解析执行过程中最重要的几个包的路径分别是:CocoaPods/CocoaPods、 CocoaPods/Core 和 CocoaPods/Xcodeproj。

CocoaPods / CocoaPod

这是面向用户的组件,每当你执行一个pod命令时,这个组件将被激活。它包括了所有实用CocoaPods的功能,并且还能调用其他gem包来执行任务。

CocoaPods / Core

Core gem提供了与CocoaPods相关的文件(主要是Podfile和podspecs)的处理。

Podfile

Podfile用于配置项目所需要的第三方库。它能被高度定制,所以你可以尽可能地给它添加你想要的特性。如果您还想对Podfile了解更多的话,请查看Podfile指南(地址http://guides.cocoapods.org/syntax/podfile.html)。

Podspec

.podspec文件描述了一个库将怎样被添加进工程中。.podspec文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。

CocoaPods / Xcodeproj

这个包负责工程文件直接关系的处理。它能创建以及修改.xcodeproj文件和.xcworkspace文件。它也可以作为一个独立的包使用,当你要编写修改项目文件的脚本时,可以考虑使用CocoaPods/Xcodeproj。

版本控制和冲突

CocoaPods使用语义版本命名约定来解决对版本的依赖。由于冲突解决系统建立在非重大更改的补丁版本之间,这使得解决依赖关系要容易得多。举个栗子,两个完全不同的第三方库同时依赖CocoaLumberjack。它们其中一个依赖的版本是2.3.1,而另一个则为2.3.3,解析器可以自动使用较新的版本,在这里则是2.3.3,因为这可以与2.3.1向后兼容。

但这并不总是有效。有许多第三方库还并不支持这个约定,这让解决方案变得非常复杂。

当然,总是会有一些冲突需要手工解决。如果一个第三方库依赖CocoaLumberjack 1.2.5,而另一个依赖CocoaLumberjack 2.3.1,最后只能靠调用这两个第三方库的用户来手动地决定CocoaLumberjack的版本了。

加载源码

CocoaPods执行的下一个步骤是加载源代码。每个.podspec文件都包含了源代码的索引,这些索引一般指向了一个Git地址或者git tag。它们以commit SHA码的方式存储在 ~/Library/Caches/CocoaPods中。而在这些路径中创建文件则由 Core 包负责。

源代码将依照Podfile、.podspec和缓存文件的信息下载到相应的第三方库路径。

生成Pods.xcodeproj

每次pod install 执行后并且检测到改动时,Pods.xcodeproj文件将呗Xcodeproj gem更新。如果Pods.xcodeproj文件不存在,则会以默认配置生成,若已存在,则Pods.xcodeproj会使用现有的配置。

安装第三方库

当Cocoapods向项目中增加了一个第三方库的时候,不仅仅是将添加代码这么简单。由于每个第三方库有不同的target,所以每次添加第三方库时,都只有几个文件被添加。每个源代码都需要:

一个包含编译选项的.xcconfig文件

一个同时拥有编译设置和CocoaPods默认配置的私有.xcconfig文件

编译所必须的prefix.pch文件

另一个编译必须的文件dummy.m

一旦每个pod的target都完成了以上步骤,整个Pods的Target就会被创建。这增加了相同的文件,与另外几个。如果有源代码中包含了资源bundle,向app的target中添加bundle的方式将写入Pods-Resources.sh。还有一个叫Pods-environment.h的文件,文件中含有许多检查组件是否来自pod的宏定义。最后,将生成两个确认文件,一个.plist文件,一个用于给用户查阅许可信息的markdown文件。

写入到磁盘

直到现在,许多已完成的过程都使用的是内存中的对象。为了让这些过程的结果可重复被使用,我们需要将所有结果都记录在一个文件中。所以Pods.xcodeproj和另外两个非常重要的文件:Podfile.lock和Manifest.lock都将被写入磁盘。

Podfile.lock

这是CocoaPods创建的最重要的文件之一。它记录了需要被安装的pod的每个已安装的版本。如果你想知道已安装的pod是哪个版本,可以查看这个文件。推荐将Podfile.lock文件加入到版本控制中,这有助于整个团队的一致性。

Manifest.lock

这是每次运行pod install时创建的Podfile.lock文件的副本。如果你见过“沙盒文件和Podfile.lock文件不同步”的错误,这个错误就是因Manifest.lock文件和Podfile.lock文件不一样引起。由于Pods所在的目录并不总在版本控制之下,这样可以保证开发者运行app之前都能更新他们的pods,否则app可能会crash,或者在一些不太明显的地方编译失败

xcproj

如果您已经依照我们的建议在系统上安装了xcproj,它会将您的Pods.xcodeproj文件转换成就旧有ASCII格式的plist文件。为什么要这么做呢?因为Xcode所依赖和使用的plist在很久以前就已经不被其他软件支持了。如果没有xcproj,你的Pods.xcodeproj文件将会以XML格式的plist文件存储,当你用Xcode打开它时,它会被改写,造成大量的文件冲突。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值