CocoaPods(封装库管理控件)

写在前面:如果你是首次使用CocoaPods,目标是快准狠的安装和使用,可以直接看安装、具体使用、使用补充三部分快速上手尝鲜。有一定经验后回来具体看看每部指令的含义,你会对CocoaPods了解越来越深~

一、CocoaPods简介:

CocoaPods是负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中、统一管理第三方开源库,为我们节省设置和更新第三方开源库的时间。

二、CocoaPods安装:

在正式开始介绍安装CocoaPods,温馨提示如下:

  1. 操作命令中间可能有空格看不出来,建议直接复制粘贴执行;

  2. CocoaPods是由ruby语言编写的。我们需要通过Ruby来安装CocoaPods(至于为什么,我百度过也不知道原因,知道的朋友可以留言~)。然后因为Mac电脑自带Ruby环境,我们就只需打开终端开始动手。但是默认情况下mac系统自带的Ruby环境版本比较低(大概是2.0.0版本的),现在安装CocoaPods需要2.2.2版本及以上的,所以我们不管三七二十一先直接先升级ruby。

  3. 安装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'     任何版本,相当于不指定版本,默认采用最新版本号

温馨提示:

  1. 工作中建议使用'~>0 .1' 方式指定版本号,不建议不指定版本号。因为版本号的命名规则,每个0.01版本增加,一般是bug修复等小改动;每个0.1版本增加是引入或更新新的第三方库,或增加新的小功能等;每个1.0版本增加往往是大的新功能增加或者变量、方法命名等有大改变,往往对我们引用造成很大影响,因为可能要调整项目中的代码。如果不指示版本号,就会容易出现下载超过大于1.0版本的第三方库,出现不可知问题哦。
  1. 指定版本号也方便知道目前引用的第三方库大概是什么版本号,当然具体的可以到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)
  1. 使用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来实现组件化。有兴趣的可以自行搜一下关于组件化的内容。

你可能感兴趣的:(CocoaPods(封装库管理控件))