CocoaPods 的介绍、安装、使用和原理

CocoaPods 私有库教程已更新,如有需要请移驾 CocoaPods 私有库 step by step - 简书查看

目录

更新记录

CocoaPods简介

常用命令一览

一、CocoaPods 的安装

1、更换 Gem 的源
2、更新升级 Gem 版本
3、安装CocoaPods
4、更换repo镜像为国内服务器

二、CocoaPods 的使用(图和文字有细微的出入)

1、新建 Podfile 文件
2、编辑 Podfile 文件
3、执行导入命令
4、第三方库更新
5、文件和指令说明
6、pod install 和 pod update 的区别

三、遭遇到的问题

四、原理和说明

五、更多

1、pod install提速
2、关于Podfile文件编辑时,第三方库版本号的各种写法


更新记录:

2017.12更新: pod installpod update 的区别。
2016.08更新:Podfile 格式更新

在1.0.0的 CocoaPods 版本升级后,Podfile 文件的使用方法官方已经更新,格式如下

platform :ios, "9.0"

target 'BSBDJ' do
    pod "AFNetworking"
    pod "SDWebImage"
    pod "MJExtension"
end

CocoaPods简介

每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着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就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。

常用命令一览
# 1.先升级Gem
    sudo gem update --system
# 2.切换cocoapods的数据源
    【先删除,再添加,查看】
    gem sources --remove https://rubygems.org/
    gem sources -a http://ruby.taobao.org/
    gem sources -l
3.安装cocoapods
    sudo gem install cocoapods
4.将Podspec文件托管地址从github切换到国内的oschina
    【先删除,再添加,再更新】
    pod repo remove master
    pod repo add master http://git.oschina.net/akuandev/Specs.git
    pod repo add master https://gitcafe.com/akuandev/Specs.git
    pod repo update
5.设置pod仓库
    pod setup
6.测试
    【如果有版本号,则说明已经安装成功】
    pod --version
7.利用cocoapods来安装第三方框架
    01 进入要安装框架的项目的.xcodeproj同级文件夹
    02 在该文件夹中新建一个文件Podfile
    03 在文件中告诉cocoapods需要安装的框架信息
        a.该框架支持的平台
        b.适用的iOS版本
        c.框架的名称
        d.框架的版本
8.安装
pod install --no-repo-update
pod update --no-repo-update


一、CocoaPods 的安装

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

1、更换 Gem 的源

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

// 1.移除掉原有的源(服务器在国外,速度较慢)
- gem sources --remove https://rubygems.org/
// 2.等有反应之后再敲入以下命令(添加国内的源,原先是 http://ruby.taobao.org/ ,现在淘宝上的ruby镜像换成https了)
- gem sources -a https://ruby.taobao.org/
// 3.验证是否替换成功
- gem sources -l  
1-更换 Gem 的源为国内源.png
2、更新升级 Gem 版本

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

// 更新升级gem
- sudo gem update --system  
2.1-更新升级 Gem 版本.png

2.2-更新升级 Gem 版本结果.png
3、安装CocoaPods
// 安装CocoaPods(OS X 10.11以前)
- sudo gem install cocoapods
// 安装CocoaPods(10.11后苹果升级了安全策略)
- sudo gem install -n /usr/local/bin cocoapods
3.1-安装 CocoaPods.png

3.2-安装 CocoaPods 结果.png
4、更换repo镜像为国内服务器

所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的 ~/.cocoapods/目录下,这个索引文件比较大,有80M左右。所以第一次更新时非常慢,笔者(唐巧)就更新了将近1个小时才完成。
一个叫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(开源中国较慢)
4.1-移除原有的 repo 镜像服务器.png

4.2-添加 repo 镜像国内服务器.png

4.3-更换repo镜像为国内服务器结果.png

二、CocoaPods 的使用(图和文字有细微的出入)

1、新建 Podfile 文件

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

//进入你的工程目录
$ cd /Users/peikua/Desktop/CocoaPodsDemo  
//创建Pods文件
$ touch Podfile
5.1-在项目根目录新建 Podfile 文件.png
2、编辑 Podfile 文件

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

5.2-查询网站上的信息.png

5.3-根据信息编辑 Podfile 文件.png

3、执行导入命令
$ cd /Users/peikua/Desktop/CocoaPodsDemo  
$ pod install

5.4-打开 Podfile 目录执行导入命令.png

5.5-成功导入第三方库的信息和一个 Warning.png

pod install命令执行成功后,会看到工程目录下多出CocoaPodsTest.xcworkspace、Podfile.lock文件和Pods目录。再看看刚才执行完pod install命令打印出来的内容的最后一行:From now on use CocoaPodsDemo.xcworkspace.提示我们从现在起,我们需要使用CocoaPodsTest.xcworkspace文件来开发。

4、第三方库更新

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


6.1-假设已有两个库,新增一个库.png

6.2-执行 pod update 命令进行更新.png
pod outdated:

当你运行pod outdated命令,CocoaPods会列出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)。这个意思就是,如果你运行pod update PODNAME,如果这个库有新的版本,并且新版本仍然符合在Podfile里的限制(pod 'MyPod', '~>x.y'),它就会被更新。

Podfile 文件的使用方法官方已经更新,格式如下

platform :ios, "9.0"

target 'BSBDJ' do
    pod "AFNetworking"
    pod "SDWebImage"
    pod "MJExtension"
end
5、文件和指令说明
  • Podfile.lock文件
- 最后一次更新Pods时, 所有第三方框架的版本号
  • 常用指令的区别
    • pod install
      • 会根据Podfile.lock文件中列举的版本号来安装第三方框架
      • 如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
      • 安装框架之前, 默认会执行pod repo update指令
    • pod update
      • 将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
      • 安装框架之前, 默认会执行pod repo update指令
    • pod install --no-repo-update
    • pod update --no-repo-update
      • 安装框架之前, 不会执行pod repo update指令
6、pod installpod update 的区别。

首先 podfile.lockpodfile 必须加入版本控制。
install 并不是第一次创建 podfile 时运行一次,后面就不再使用了。install 命令不仅在初始时使用,在新增或删除 repo 时也需要运行。每次添加或删除 repo 后应该执行 install 命令,这样其它的 repo 不会更新。
update 仅仅在只需更新某一个 repo 或所有时才使用。

每次执行 install 时,会将每个 repo 的版本信息写入到 podfile.lock,已存在于 podfile.lockrepo 不会被更新只会下载指定版本,不在 podfile.lock 中的 repo 将会搜索与 podfile 里面对应 repo 匹配的版本。

即使某个 repo 指定了版本,如 pod 'A', '1.0.0',最好也是不要使用 update,因为 repo A 可能有依赖,如果此时使用 update 会更新其依赖。


三、遭遇到的问题

**出现错误提示**.png

**错误解决方法**.png
//以后使用CocoaPods过程中出现了莫名其妙的问题,执行下面命令  
- sudo gem update --system
- sudo gem install cocoapods
- pod setup

四、原理和说明

1、第三方库会被编译成.a静态库供我们真正的工程使用。

CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给我们自己的CocoaPodsTest工程使用。
对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。

2、我们的工程和第三方库所在的工程会由一个新生成的workspace管理

为了方便我们直观的管理工程和第三方库,CocoaPodsTest工程和Pods工程会被以workspace的形式组织和管理,也就是我们刚才看到的CocoaPodsTest.xcworkspace文件。

3、原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。
4、CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。

五、更多

1、pod install提速

每次执行pod installpod 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', '<=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和书写这篇博文的过程我大量参考了唐巧的博客这篇博文,大家也可以在唐巧的博客中学习到更多的内容,也可以去往官方学习
深入理解 CocoaPodsCocoaPods最佳实践探讨

推荐阅读更多精彩内容