写在前面:如果你是首次使用CocoaPods,目标是快准狠的安装和使用,可以直接看安装、具体使用、使用补充三部分快速上手尝鲜。有一定经验后回来具体看看每部指令的含义,你会对CocoaPods了解越来越深~
一、CocoaPods简介:
CocoaPods是负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中、统一管理第三方开源库,为我们节省设置和更新第三方开源库的时间。
二、CocoaPods安装:
在正式开始介绍安装CocoaPods,温馨提示如下:
操作命令中间可能有空格看不出来,建议直接复制粘贴执行;
CocoaPods是由ruby语言编写的。我们需要通过Ruby来安装CocoaPods(至于为什么,我百度过也不知道原因,知道的朋友可以留言~)。然后因为Mac电脑自带Ruby环境,我们就只需打开终端开始动手。但是默认情况下mac系统自带的Ruby环境版本比较低(大概是2.0.0版本的),现在安装CocoaPods需要2.2.2版本及以上的,所以我们不管三七二十一先直接先升级ruby。
安装CocoaPods整体思路是:更新ruby->设置CocoaPods下载地址->下载并安装CocoaPods->使用CocoaPods
正式安装:
1、打开终端(不会的请自行百度)
2、查看当前Ruby版本(一般都是2.0.0,如果已经是最新版本的,可以跳过2-7两步)
ruby -v
3、升级Ruby环境,需要借助rvm(rvm是一个便捷的多版本ruby环境的管理和切换工具)。安装rvm(第一步要下载一些东西等两分钟左右);有rvm可以跳过3、4步,不确定可执行第4步检查
curl -L get.rvm.io | bash -s stable
source ~/.bashrc
source ~/.bash_profile
4、查看rvm版本(有版本号就表示安装成功)
rvm -v
5、检出ruby可安装的版本信息
rvm list known
6、安装一个ruby版本(可以是2.4.1版本,当然你也可以选择其他的)
rvm install 2.4.1
7、设置为默认版本
rvm use 2.4.1 --default
8、更换源(由于国内访问的CocoaPods国外下载路径被墙,我们需要来修改更换源,把源切换至ruby-china;网上大多数是使用的https://ruby.taobao.org的,这里不再建议使用的了,这是因为taobao Gems 源已停止维护,现由 ruby-china 提供镜像服务)
sudo gem update --system // 更新gem
gem sources --remove https://rubygems.org/ // 移除旧有镜像资源地址
gem sources -a https://gems.ruby-china.org/ // 添加新的镜像资源地址
9、为了验证你的Ruby镜像是并且仅是ruby-china,执行以下命令查看
gem sources -l
如果是以下结果说明正确,如果有其他的请自行百度解决
*** CURRENT SOURCES ***
https://gems.ruby-china.org/
10、终于正式安装CocoaPods
sudo gem install cocoapods
sudo gem install -n /usr/local/bin cocoapods // macOS 10.11系统后使用。现在基本上用这个命令
11、如果安装了多个Xcode使用下面的命令选择(一般需要选择最近的Xcode版本)
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
12、初始化本地库(作用:将CocoaPods记录的所有第三方库下载信息下载到本地~/.cocoapods/repos/master
下面)
pod setup
13、执行以上命令后会输出一句话:Setting up CocoaPods master repo
,然后就是漫长的等待,并不是卡死了而是在下载文件(下载完成后大概800多兆)。网速稍好些,几分钟就好了,人品不好网络差的可能会等很久很久很久........
查看文件下载进度的可以另外打开一个终端窗口(快捷键:选中终端按下Command+N组合键),复制粘贴以下两行命令回车执行
cd ~/.cocoapods
du -sh *
执行du -sh *
之后会显示已下载的文件大小,可以多次执行来监看下载进度,如果之前还有文件大小,后来变成0了,可能是网络问题,下载已经中断了,需要结束命令并从新执行 pod setup
网上有文章说可以将别人机器上~/.cocoapods/repos/master下面的文件copy到自己电脑上的文件里可以跳过这步,本人亲测过,或多或少都有点问题。如果复制后,执行pod setup依然会清空原来内容重新下载,而不是智能的根据已下载的内容走剩下的流程,白复制,所以还是乖乖下载吧。
14、下载安装完成之后可执行下列命令检查是否可用(第一次使用要等一会,因为这个时候CocoaPods需要生成本地的封装库搜索文件目录);
pod search AFNetworking
如果是以下结果说明正确,如果有其他的请自行百度解决;AFNetworking+AutoRetry (0.0.5)
不是我们要找的,AFNetworking (3.1.0)
才是。退出搜索结果界面输入wq
-> AFNetworking (3.1.0)
A delightful iOS and OS X networking framework.
pod 'AFNetworking', '~> 3.1.0'
- Homepage: https://github.com/AFNetworking/AFNetworking
- Source: https://github.com/AFNetworking/AFNetworking.git
- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3,
3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0,
2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4,
1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2,
1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
- Subspecs:
- AFNetworking/Serialization (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Reachability (3.1.0)
- AFNetworking/NSURLSession (3.1.0)
- AFNetworking/UIKit (3.1.0)
-> AFNetworking+AutoRetry (0.0.5)
Auto Retries for AFNetworking requests
pod 'AFNetworking+AutoRetry', '~> 0.0.5'
- Homepage: https://github.com/shaioz/AFNetworking-AutoRetry
三、CocoaPods的使用
1、 新建一个Xcode工程,使用终端cd到工程目录下(项目的.xcodeproj
同级文件夹)
2、创建Podfile文件:
pod init
之后就可以在项目目录里看到一个Podfile
文件
3、命令行打开Podfile文件或直接双击打开Podfile
文件:
open Podfile
4、添加需要的第三方库(以AFNetworking
为例),在打开的Podfile最下面添加以下内容:
pod 'AFNetworking' // 这里示范,所以不指定版本号,就是下载最新的第三方库。
// pod 'AFNetworking', '~> 3.1.0' // 实际工作中,必须要指定版本。
5、保存(command + S
)后退出
6、开始下载:
pod install --no-repo-update
终端的结果没有红色的内容,基本上安装成功了。
7、打开.xcworkspace
。一开始如果不习惯CocoaPods,往往会继续打开.xcodeproj
运行工程,然后成功报错的哦。使用CocoaPods 需要打开.xcworkspace
才能成功运行工程~
8、卸载CocoaPods。虽然很少用到,但贴心附上卸载CocoaPods的命令:
sudo gem uninstall cocoapods
四、CocoaPods具体使用补充
1、 podfile文件内容简单介绍:
// 用来设置所有第三方库所支持的iOS最低版本
platform :ios, '7.0'
target 'test' do // test是项目名
// 如果是swift项目,这句话保留;如果是OC项目,这句话要删除
use_frameworks!
// 添加第三方类库
pod 'AFNetworking'
// 添加指定版本号的第三方类库
pod 'SVProgressHUD', '1.1.3'
2、 版本说明
// 设置框架的名称和版本号
pod 'SDWebImage','~>3.7.5'//任何高于或等于3.7.5的版本,但是不包含高于4.0.0版本
// 版本号的规则:
// '>1.0' 可以安装任何高于1.0的版本
// '>=1.0' 可以安装任何高于或等于1.0的版本
// '<1.0' 任何低于1.0的版本
// '<=1.0' 任何低于或等于1.0的版本
// '~>0.1' 任何高于或等于0.1的版本,但是不包含高于1.0的版本
// '~>0' 任何版本,相当于不指定版本,默认采用最新版本号
温馨提示:
- 工作中建议使用'~>0 .1' 方式指定版本号,不建议不指定版本号。因为版本号的命名规则,每个0.01版本增加,一般是bug修复等小改动;每个0.1版本增加是引入或更新新的第三方库,或增加新的小功能等;每个1.0版本增加往往是大的新功能增加或者变量、方法命名等有大改变,往往对我们引用造成很大影响,因为可能要调整项目中的代码。如果不指示版本号,就会容易出现下载超过大于1.0版本的第三方库,出现不可知问题哦。
- 指定版本号也方便知道目前引用的第三方库大概是什么版本号,当然具体的可以到podfile.lock中查看。这远比手工拖入第三方库好的多。毕竟如果你手工拖入第三方库,并且没有做任何标示,天知道你下载的是哪个版本的,后续维护就是一个巨坑。本人就试过想将手工拖入的第三方库转移到CocoaPods中,由于不知道原版本号,只能指定最新的版本号,一运行成功,各种飘红~
3、 podfile和podfile.lock的区别
Podfile文件:
1. 记录本项目中的第三方库版本要求。
2. 必须做版本管理,项目成员间保持一致。
Podfile.lock文件:
1. 记录最后一次更新Pods时, 所有第三方框架的最终版本号。
2. 推荐做版本管理。除了项目很复杂,需要针对不同内容使用不同第三方库依赖时不做版本管理
4、 常用指令介绍
// 根据Podfile.lock文件中列举的版本号来安装第三方框架
// 如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
// pod install
// 将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
// pod update // 更新Podfile中所有的第三方库
// pod update PODNAME // 只更新某个特定的库
// 上述两个指令在执行前默认会执行pod repo update指令
// 长时间不更新镜像,会出现pod search的结果低于实际上该第三方库在github上的版本。这个时候就执行该命令更新镜像,否则就无法下载最新的第三方库
pod repo update
// 由于不需要经常更新第三方库,也没必要一定要下载最新的第三方库(有可能还不稳定),另外更新镜像很费时间,实际中往往不每次都更新镜像,需要带上后缀--no-repo-update,以免执行pod repo update指令
pod install --no-repo-update // 推荐使用
// pod update --no-repo-update // 不推荐使用
pod update PODNAME --no-repo-update // 推荐使用, PODNAME应改为具体的第三方库库名
// 检出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)
pod outdated
5、 pod install & pod update区别
- 举个例子好说明:
// 1. 初次建立项目,Podfile中第三方库要求如下:
pod 'SDWebImage','~>3.7.5'
pod 'AFNetworking', '~> 3.1.0'
// 2. 使用pod install --no-repo-update后,会安装SDWebImage和AFNetworking,在Podfile.lock中版本号分别是3.7.5和3.1.0
pod install --no-repo-update
// 3. 后来AFNetworking的作者发布3.2.0最新包,SDWebImage没变化;没有对Podfile中第三方库要求做任何修改
// 4.1 若此时执行pod install --no-repo-update
pod install --no-repo-update
// 由于已经有Podfile.lock,当前已安装的第三方库(Podfile.lock记录的)依然符合Podfile中要求,不会做任何处理;即当前SDWebImage和AFNetworking,依然是3.7.5和3.1.0
// 4.2 若此时执行pod update --no-repo-update
pod update --no-repo-update
// 不管有没有Podfile.lock,CocoaPods会找远方服务器最新的,并且符合Podfile中要求的第三方库更新,并重新生成Podfile.lock;即当前SDWebImage和AFNetworking,依然是3.7.5和3.2.0
// 5.要注意的是,假如项目中SDWebImage和AFNetworking,依然是3.7.5和3.1.0。远方服务器SDWebImage和AFNetworking最新的版本是3.8.5和3.2.0
// 需要引入新的第三方库MJExtension
pod 'MJExtension', '~> 3.0.13'
// 5.1 若只是引入MJExtension而不更新已有的库,执行
pod install --no-repo-update
// 此时SDWebImage和AFNetworking,依然是3.7.5和3.1.0;并增加MJExtension(3.0.13)
// 5.2若不仅要引入MJExtension并更新已有的库,执行
pod update --no-repo-update
// // 此时SDWebImage和AFNetworking,升级到3.8.5和3.2.0;并增加MJExtension(3.0.13)
-
使用pod install/update命令安装框架后的大致过程:
01 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。 02-1 下载依赖(pod install):根据分析依赖的结果,根据Podfile.lock是否已有符合的第三方库,若有则不下载,若无则下载指定版本的类库到本地项目中,并更新Podfile.lock。 02-2 下载依赖(pod update):根据分析依赖的结果,无视已有的版本库,下载最新的指定版本的类库到本地项目中,并更新Podfile.lock。 03 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。 04 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。
7、 CocoaPods specs的镜像索引
CocoaPods specs的镜像索引是指CocoaPods管理的全球所有第三方库相关信息在本地的查询数据。CocoaPods需要依靠本地的镜像索引来获取服务端中对应的第三方库信息(下载地址等)并进行分析下载。
所有的项目的podspec文件(镜像索引文件)都托管在https://github.com/CocoaPods/Specs上。
第一次执行pod setup时,cocoapods会将这些podspec索引文件更新到本地的 ~/。cocoapods/目录下,这个索引文件比较大,国内网络的问题,更新非常慢。
国内很多善丈人翁就在国内建了新的地址,并及时和国外的保持同步,大家使用之余要记得感恩,不过这些国内的地址不时就会失效,目前最新的是https://gems.ruby-china.org
使用方法:
pod repo remove master // 移除旧有镜像资源地址
pod repo add master https://gems.ruby-china.org // 添加新的镜像资源地址
pod repo update // 更新镜像
- 后续使用中进行pod repo update 时(pod update、pod install 默认执行pod repo update命令),会去更新获取pod specs。
8、 使用注意:不是所有的库都可以由CocoaPods管理。需要该第三方库拥有.podspec
才行。.podspec
包含了该第三方库的名称、版本号、下载地址、第三方库依赖等信息。CocoaPods需要根据该信息才能找到对应的下载地址
五、CocoaPods拓展-原理和组件化
CocoaPods原理
CocoaPods 背后的理念主要体现在两个方面。首先,在工程中引入第三方代码会涉及到许多内容。针对 Objective-C初级开发者来说,工程文件的配置会让人很沮丧。在配置buildphases和linker flags过程中,会引起许多人为因素的 错误。CocoaPods 简化了这一切,它能够自动配置编译选项。
其次,通过 CocoaPods,可以很方便的查找到新的第三方库。当然,这并不是 说你可以简单的将别人提供的库拿来拼凑成一个应用程序。它的真正作用是让你能够找到真正好用的库,以此来缩短我们的开发周期和提升软件的质量。
CocoaPods的原理,它是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中
1、Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a 文件即可。
2、对于资源文件,CocoaPods提供了一个名为Pods-resources.sh的bash脚本, 该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目 标目录中。
3、CocoaPods通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和 参数。
CocoaPods组件化
试想一下,既然CocoaPods能够管理第三方库,那为什么不管理公司自有的封装库,方便公司内部跨app使用和测试?在这种思路下,组件化就应运而生了。目前越来越多的公司CocoaPods来实现组件化。有兴趣的可以自行搜一下关于组件化的内容。