iOS - 如何解决 CocoaPods 安装慢的问题

2020-03-31 15:32:14 浏览数 (2)

写在前面的

  • 目标人群:iOS开发初学者
  • 编程语言:Swift
  • 学习难度:初级
  • 类型:避免踩坑

如果你不是目标受众,请关闭本文节约时间

1、序言

为了学习 realm 的知识,我需要安装 realm 依赖包,不过在学习这方面只是之前,需要使用CocoaPods安装依赖;但是有使用过这个工具的朋友一定会被这个工具折腾过;最折腾的在于 pod update 时间过长,这篇文章就是解决这个问题的过程和最终方案;

2、原因分析

使用 CocoaPods 的同学第一步肯定是会遇到这个问题的,这是因为所有的项目的 podspec 文件都托管在 https://github.com/CocoaPods/Specs 上,在执行 pod setup时,CocoaPods 会将这些podspec索引文件 更新 到本地 ~/.cocoapods/ 目录下。

我们看一下 pod setup 期间具体干了什么事情:

代码语言:javascript复制
> pod setup --verbose                                                          Setting up CocoaPods master repo
 $ /usr/local/bin/git remote set-url origin https://github.com/CocoaPods/Specs.git
 $ /usr/local/bin/git checkout masterUpdating spec repo `master`
 $ /usr/local/bin/git pull --ff-only

截图如下:

从上面可以看出 Specs 是一个 Github 仓库,所谓的更新,其实就是 git clone 官方仓库到本地的 ~/.cocoapods/repos/master 目录下,然后再执行 git pull --ff-only来 merge 最新的更新;

我们平时执行 pod repo add xxx https://github.com/xxxx/Specs.git 就会在这个目录下新增一个名字为 xxx 的 github 仓库了

理解了上面,就不难得知,用户之所以慢的原因就是 clone 这个仓库很慢导致的:这个官方仓库大约是 509.7M左右(后续肯定还会增加),问题是文件超级多,数量达到 83万 个左右;(本地下完之后,使用系统自带查看其大小的时候都得花半分钟时间)

文件数量多,在国内访问Github的速度又很慢,雪上加霜,这才导致 pod setup 压根儿没法进行啊;

3、解决方案

问题是找到了,怎么办呢?!

核心就是想办法把这个仓库下载下来,于是就有两种方案;

3.1、方案一:替换master仓库

这个方案在网上是提的最多的,凡是涉及到这个问题的,基本会建议通过命令更换成国内仓库地址(从官网clone过来),比如替换成 coding 上的镜像或者是 oschina 上的镜像

代码语言:javascript复制
> pod repo remove master
//coding 上有每日更新的,建议使用这个
> pod repo add master https://git.coding.net/CocoaPods/Specs.git//或者用oschina,但是https 好像有问题,一直是403,所以用ssh的方式,这里需要到官网去配置ssh key
> pod repo add master https://git.oschina.net/akuandev/Specs.git

来自文章 CocoaPods详解之——使用篇

不知道什么原因,一旦我 remove 掉 master 之后再 add 回去的时候,cocoapods 会 很聪明地 会自动 add 自己官网的github 地址,而不是我们指定的地址!!!

估计我的版本是 1.0.1 ,而教程中的版本基本是 0.0.39 ,所以方式可能不一样吧;

无论如何,这条路行不通;何况这种方案有一种风险就是 第三方库的更新没有官方及时,导致有些依赖可能会丢失,也是一种隐患;

3.2、方案二:手动下载官网repos

还是这篇iOS CocoaPods 安装笔记(持续更新)文章给出了一个思路:自己去下载官方 repo ,然后放到 ~/.cocoapods/repos/ 目录下即可;

自己下载有两种做法:

  1. 使用cd ~/.cocoapods/repos/ && git clone https://github.com/CocoaPods/Specs.git master,不过这种方式会因为下载文件太多,导致github直接断开连接;我试了好几次都这样,放弃了
  2. 真是命苦啊,于是跑到官网下载客户端 Github Desktop,然后用客户端保证下载的稳定性;如果这条路还不行的话,我真的是没有办法了;

好在毕竟是自家亲人,Github Desktop 下载自己的网站上资源的稳定性杠杠的,花费1个小时左右(看网速而定)就下载完毕了;

等等,这还没完!!

下载完毕之后,需要执行一步,pod setup,走一下过场,因为此时你已经下载完了,所以这个步骤基本不需要花费什么时间,静静地等他设置完毕即可;时间有可能还会有点长,但基本没问题

总算看到完成的状态了,泪流满面啊!!

4、使用注意事项

可见更新一次Repos是多么的伤人,所以不必每次在安装依赖的时候去检查官网的更新;因此使用 --no-repo-update 跳过这个检查过程:

代码语言:javascript复制
> pod install --verbose --no-repo-update

这样安装依赖的速度就会提升很多,你可以每隔1个月再自己手动更新一次官网即可;

5. 总结

上面讲了这边多,我们总结一下使用 CocoaPods 的正确方式:

  1. 正常安装 CocoPods
  2. 去官网clone仓库放到 ~/.cocoapods/repos/master 目录下
  3. 重新执行 pod setup
  4. 后续安装依赖使用 pod install --verbose --no-repo-update 安装依赖

从发现问题到解决问题,花费了我近1天的时间,主要都是花费在 网络下载 - 下载失败 - 尝试重新下载 - 再失败 - 再下载… 这样的苦循环中,直到最后用官方的 Github Desktop才真正克隆出到本地;

这个 Specs 仓库是干嘛用的呢,说白了就是检测依赖关系使用的,类似于数据库对应的映射表;个人觉得这方面 Node.js 的包管理器 npm 做得比较好,所有的依赖查询通过官网就查询到,不需要用户自己下载官方这么大的一个包;

有时候真的不是你能力不够,实在是因为网络太差啊!!

0 人点赞