CocoaPods 环境安装
CocoaPods
环境安装
关于CocoaPods
CocoaPods
是iOS开发、macOS开发中的包依赖管理工具,效果如Java中的Maven,nodejs的npm。
CocoaPods
是一个开源的项目,源码是用ruby写的,源码地址在GitHub上。
无论是做iOS开发还是macOS开发,都不可避免的要使用到一些第三方库,优秀的第三方库能够提升我们的开发效率。如果不使用包依赖管理工具,我们需要手动管理第三方包,包括但不限于:
将这些第三方库的源码拷贝到项目中 第三方库代码有可能依赖一些系统framework,我们需要把第三方库依赖的framework导入到项目中 当第三方库有更新时,需要将更新过的代码拷贝到项目中 以上工作虽然简单,但是如果项目中的第三方库较多,需要耗费大量的时间和精力。CocoaPods
可以将我们从这些繁琐的工作中解放出来。
CocoaPods
与常规依赖库使用维护操作上的区别传统模式下, 当我们使用一些三方开源库、SDK(如QQ分享、微信分享)等时, 我们导入类库的方式是:
- 下载源码, 拖拽到项目指定目录内; 如果有图片素材,
bundle
文件等, 也需要手动一同导入; 并且所处项目结构也需要自行管理 - 同属同一个
project
, 通过import "XXX.h"
来使用类库 - 今后
SDK
或依赖库升级了, 那我们要先把旧版本删除掉, 导入新版本依赖库
- 下载源码, 拖拽到项目指定目录内; 如果有图片素材,
使用了
CocoaPods
后:- 在
Podfile
中通过增加pod '类库名称', '~> 版本号'
- 执行
pod install
完成依赖库的导入 - 升级依赖库版本, 只需要修改
Podfile
中对应依赖库后面的版本号重新执行pod install
即可完成
- 在
目录结构对比 (左侧是传统模式, 右侧是是用来
CocoaPods
)
对比优势:
CocoaPods
是将所有依赖的第三方库都放到了Pods
项目中, 所有的源码管理工作从主项目转移到了Pods
项目中。Pods
项目最终会编译成一个libPods-项目名.a
的文件,主项目只需要依赖这个.a
文件即可。(不同Cocoapods
版本以及Poffile
配置不同, 也可以转成多个framework
) 省去了枯燥无聊的手工操作, 也免去了维护项目目录的烦恼, 全部的依赖库及使用版本清晰明了; 而且主项目中因为减少了依赖库部分, 也会更简洁
影响到整个工具链的安装及更新的主要原因
墙
系统权限
版本依赖
其他环境原因 (非常多, 具体原因可根据不同报错查找解决方案)
环境搭建
1. 准备好梯子(必须), 本次安装各工具版本介绍
工具链 版本 其他补充 ruby 2.6.5 rvm 管理版本 RubyGems 3.0.8 源: https://gems.ruby-china.com/
Cocoapods 1.9.3 Trunk
2. 检查本地环境:ruby
和RubyGems
CocoaPods
对ruby
有版本要求, 目前CocoaPods
已经升级到1.9.x
版本, 建议同步升级ruby
版本 (非强制), 至少不低于2.3.x
检查当前系统下
ruby
版本,$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
检查当前系统下的
RubyGems
版本$ gem -v
2.5.2.3
3. 升级 ruby
和 RubyGems
非必要但也很关键, MacOS
自带ruby
和RubyGems
, 默认版本较低, 如果gem
的版本号过低,安装CocoaPods
可能会失败
更新
RubyGems
版本, 更新后通过确认下版本sudo gem update -n /usr/local/bin --system
安装
rvm
, 通过rvm
维护ruby
版本// 安装rvm curl -L get.rvm.io | bash -s stable // 让环境立即生效 source ~/.rvm/scripts/rvm // 检查确认rvm是否生效 rvm -v
更新
ruby
// 列出当前可安装的全部版本 (rvm list是查看当前已安装版本) rvm list known // 安装指定版本, 这里我指定了2.6.5这个版本, 并没有安装最新的2.7.x rvm install 2.6.5 // 设置默认版本 rvm use 2.1.4 --default
更换
RubyGems
源 (必须, 否则就是持续的失败, 因为国内被墙)- RubyGems默认的源
https://rubygems.org/
国内使用的源有很多, 这里我推荐 `https://gems.ruby-china.com/`
更换
RubyGems
源// 移除原默认的源 gem sources -r http://rubygems.org/ // 添加新源, 切记末尾的/不能缺少 gem sources -a https://gems.ruby-china.com/ // 检查下是否已经有且只有 https://gems.ruby-china.com/源 gem sources
- RubyGems默认的源
4. 安装 CocoaPods
提前安装好
Xcode
, 安装CocoaPods
sudo gem install -n /usr/local/bin cocoapods
检查版本, 确认安装成功
pod --version
5. 验证并使用 CocoaPods
CocoaPods
1.8.4以前的版本, 在步骤4
的最后执行pod setup
漫长等待成功后, 就可以正常使用了, 但在1.8.4版本开始做了重大调整
官方说明: CDN as Default, 也可参照链接中视频使用介绍.
- 通过
Xcode
新建并进入到项目路径- 执行
$ pod init
, 新建PodFile
文件- 编辑
Podfile
后 , 执行$ pod install
后等待完成依赖库的集成
trunk
与master
的区别:mater
方式指定的源为
https://github.com/CocoaPods/Specs.git
在安装环境的最后关键环节是pod setup
, 会把CocoaPods
仓库的整个master
分支拉取到本地trunk
方式指定的源为
https://cdn.cocoapods.org/
在安装环境的最后环节免去了漫长的pod setup
过程
对比提升:
安装环节: 提速最直观的就是在Cocoapods环境配置环节, 在有梯子的情况下, 至少也是需要半个多小时的等待过程
使用环节: 因为不同的源, 所以在pod install环节的速度也有提升
CocoaPods
基本使用
- 新建
Xcode
项目,CocoaPods
服务于项目, 如果没有项目工程文件, 无法直接使用 - 进入工程目录,
cd
到.xcodeproj
项目文件同级目录, 执行$ pod init
后生成Podfile
文件 通过
Vim
或其他任意文本编辑工具打开Podfile
文件 (如果使用VSCode
注意保存)- 去掉
# platform :ios, '9.0'
前面的#
, 打开注释 , 同时设置与Xcode
项目相同的最低版本号 - 添加依赖库
- 安装依赖库, 执行
$ pod install --verbose --no-repo-update
, 等待安装结束, 便完成了依赖库的安装
- 去掉
典型问题
1. ERROR: While executing gem ... (Errno::EPERM) ... Operation not permitted
CIandCD-iOS:~ admin$ sudo gem update --system
Updating rubygems-update
Fetching: rubygems-update-3.1.4.gem (100%)
Successfully installed rubygems-update-3.1.4
Parsing documentation for rubygems-update-3.1.4
Installing ri documentation for rubygems-update-3.1.4
Installing darkfish documentation for rubygems-update-3.1.4
Done installing documentation for rubygems-update after 63 seconds
Parsing documentation for rubygems-update-3.1.4
Done installing documentation for rubygems-update after 0 seconds
Installing RubyGems 3.1.4
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted @ rb_sysopen - /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/gem
从 OS X El Capitan v10.11 开始加入了 Rootless
机制, 对权限进行了控制, 默认我们是无法对 usr/bin/
这个目录进行写权限的
System Integrity Protection
A new security policy that applies to every running process, including privileged code and code that runs out of the sandbox. The policy extends additional protections to components on disk and at run-time, only allowing system binaries to be modified by the system installer and software updates. Code injection and runtime attachments to system binaries are no longer permitted.
在很多安装、更新环节都会遇到ERROR: While executing gem ... (Errno::EPERM)...Operation not permitted ...
的错误
解决方案:
修改目录权限
SIP 让 /usr/bin 只读了, 但是 /usr/local 是可读可写的, 将安装目录修改了.
关闭SIP(这种方法非常不推荐, 相当于自己关了一层防火墙.)
csrutil disable reboot
这也是为什么在前面的环节, 我都是用来 -n
参数指定到了 usr/local/bin
路径下
2. [!] Unable to find a pod with name, author, summary, or description matching
执行 $ pod install
或 $ pod search xxx
等命令报错:
[!] Unable to find a pod with name, author, summary, or description matching
多试几次 如果是 master
方式, 删除索引后再试
rm -rf ~/Library/Caches/CocoaPods/search_index.json
彻底的卸载 CocoaPods
一般情况下需要卸载
Cocoapods
只需要执行$ sudo gem uninstall cocoapods
即可
但通常情况下我们很少会需要卸载CocoaPods
, 往往是在排查问题无效需要重新部署环境时才会需要这个环节
下面是我在处理CocoaPods
问题时尝试过最有效的清理方式
1. 移除pod组件
shenyj@ShenYj-MBP ~ % which pod
/usr/local/bin/pod
shenyj@ShenYj-MBP ~ % sudo rm -rf /usr/local/bin/pod
2. 移除 RubyGems 中的 Cocoapods程序包
$ sudo gem uninstall cocoapods
3. 查看本地安装过的Cocoapods相关内容, 并彻底清除
$ gem list --local | grep cocoapods
shenyj@ShenYj-MBP ~ % gem list --local | grep cocoapods
cocoapods-core (1.9.1)
cocoapods-deintegrate (1.0.4)
cocoapods-downloader (1.3.0)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.1.0)
cocoapods-trunk (1.4.1)
cocoapods-try (1.2.0)
4. 然后逐个删除
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-core
Successfully uninstalled cocoapods-core-1.9.1
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-deintegrate
Successfully uninstalled cocoapods-deintegrate-1.0.4
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-downloader
Successfully uninstalled cocoapods-downloader-1.3.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-plugins
Successfully uninstalled cocoapods-plugins-1.0.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-search
Successfully uninstalled cocoapods-search-1.0.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-stats
Successfully uninstalled cocoapods-stats-1.1.0
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-trunk
Successfully uninstalled cocoapods-trunk-1.4.1
shenyj@ShenYj-MBP ~ % sudo gem uninstall cocoapods-try
Successfully uninstalled cocoapods-try-1.2.0
podfile
和podfile.lock
文件
Podfile.lock 文件
最后一次更新
Pods
时,所有第三方框架的版本号Pod
常用指令区别$ pod install
- 如果
Podfile.lock
文件不存在,会根据Podfile
文件安装第三方框架,并生成Podfile.lock
文件 - 如果
Podfile.lock
文件存在,会根据Podfile.lock
文件的版本号来安装第三方框架
- 如果
$ pod update
- 根据
Podfile
文件安装第三方框架 - 将所有第三方框架更新到最新版本,并且创建一个
Podfile.lock
文件覆盖掉原文件
- 根据
$ pod install/update --verbose --no-repo-update
- 安装框架前不会执行
pod repo update
,意味着不去检查服务器版本,直接使用本地缓存的框架版本
- 安装框架前不会执行
pod install
过程简述- 在通过
pod install
或pod update
指令安装框架前,都会先执行pod repo update
指令,将服务器最新的框架下载到本地,项目中是否安装最新版本的框架,取决于安装方式:pod install(指定版本)
和pod update(最新版本)
- 在第一次执行
pod install
指令时,podfile.lock
还不存在,会根据podfile
中的说明来集成框架 如果指定框架版本号,安装指定版本,如果未指定,安装最新的,并自动生成podfile.lock
文件 - 当以后再次执行
pod install
指令时,会根据podfile.lock
中记录的框架版本号来安装框架. 即便服务器中有最新的版本,通过pod install
指令也不会安装最新的第三方框架,只会根据podfile.lock
中记录的版本来安装
- 在通过
项目中的运用
多人协同开发中,在设置忽略文件时,我们通常不会将
pods
文件夹每次都推送至服务器,这样会造成服务器资源浪费,通常会将Pods
文件夹忽略掉 忽略Pods文件夹当需要从另外一台电脑上
clone
项目协作开发时,根据podfile.lock
指定的框架版本号,通过pod install
指令安装框架,这样可以保证每个人项目中的框架版本都是一致,不会引起冲突
使用忽略文件细节
协作开发中,我们都会配置忽略文件,github
为我们提供了各种语言的忽略文件,只需要下载使用即可,但默认项目中的所有内容都被提交到服务器上了,包括第三方框架
第三方框架会不断的更新,每次版本更新随着我们提交代码就会被再次提交到服务器,会造成服务器资源浪费,而项目中的Pods中存放着所有项目中的第三方框架,这些使我们不需要每次都提交的,所以如果你使用的是github上下载的忽略文件,还需要手动配置一下
通过Xcode
打开.gitignore
文件
这里代表Pods
中的内容全部都要备份到服务器上,现在我们是需要取消Pods的备份只需要去掉第36
行Pods/
前面的"#"
号即可
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
Pods/
设置好后,如果显示隐藏文件,直接重命名忽略文件,去掉文件名即可;如果没有显示隐藏文件,可以通过终端设置
- 打开终端
- 进度项目路径
输入命令
mv Objective-C.gitignore .gitignore
这样项目中的
Pods
中的文件就不再被提交了注意点:
这种方式设置后,当其他人从服务器中下载了项目后,是没有
Pods
目录的,需要自己在本地执行pod install
并且最好不要加--no-repo-update
参数 这样才能保证每次获取最新的框架