1. CocoaPods 使用
CocoaPods 为你的项目管理 lib 的依赖。cocoaPods 的使用时基于 Gem 的。
1、 gem 的使用
gem 是 ruby 的包管理工具,ruby 的各种插件是通过 gem 来安装的。 cocoapods 就是 ruby 开发的一个插件。 ruby 中文社区 。
在使用 gem 来安装 CocoaPods 的时候建议先更新 gem 的版本。(gem 是 mac 自带的我们不需要安装)
当 ruby 版本过老的情况下我们还需要更新 ruby 的版本。
# 查看版本
$ gem --version
# gem自身升级, 这个主要是解决 gem 版本过老导致 cocoapods 不能使用的问题
$ sudo gem update --system
# 列出本地安装的包
# 可用查看安装了多少个版本的 CocoaPods,可以对老版本的进行卸载
$ gem list
# 更新包(所有的)
$ sudo gem update
# 清除过期的gem
$ sudo gem cleanup
注意:
以上操作是建立在 gem 服务器良好的情况下进行的。(ruby 的软件源 https://rubygems.org 因为使用的是亚马逊的云服务,所以被墙了,需要更新一下 ruby 的源,使用如下代码将官方的 ruby 源替换成国内淘宝的源)
# 查看gem源
$ gem sources –l
# 添加源
# (这个是阿里在国内做的一个镜像源)
$ sudo gem sources -a https://ruby.taobao.org/
# 删除源
# (这个是系统默认的源)
$ sudo gem sources -r https://rubygems.org/
以上 gem 的配置基本搞定。
2、CocoaPods 的安装:
# 安装 cocoapods 包
$ sudo gem install cocoapods
当 cocoapods 的在安装过程中出现了问题请打开这个指南
执行 sudo gem install cocoapods
出现下列错误, 对于安全进行了升级。开启了rootless 权限。
命令改为:
sudo gem install -n /usr/local/bin cocoapods
可以避免 rootless 权限造成的不能读写的问题。
CocoaPods 的其他操作
当 cocoapods 出现问题或 cocoapods 的版本需要更新的时候我们需要使用下面的命令。
# 卸载 cocoapods 包
$ sudo gem uninstall cocoapods
# 更新 cocoapods 包
$ sudo gem update cocoapods
最简单的 cocoapods 的更新是再一次安装 cocoapods
# 在已经安装 cocoapods 的情况下执行这个命令可以更新 cocoapods
# 但是 gem list 中会存在 多个 cocoapods 包。(最近测试没有出现这个问题)
$ sudo gem install cocoapods
安装 gem 的 预览版
$ sudo gem install cocoapods --pre
pod 初始化
# 设置 cocoapods 初始化 , 这个操作可能等待的时间过于长久
# 其实是 Cocoapods 在将 podspec索引文件 下载到 ~/.cocoapods目录下
# 如果你等太久,可以试着 cd ~/.cocoapods 到那个目录,用du -sh *来查看下载进度。
# 全部下载完大概 800M左右 (随着 cocoapods 的使用这个值会增大), 这么大时间不久才怪。
$ pod setup
当一段时间没有使用 CocoaPods,在使用 CocoaPods 之前先执行下面这个指令
# 更新仓库 (将更新的podspec下载到本地)
# 更新 podspec索引文件
$ pod repo update
3、CocoaPods 的使用
1. 单一Target的项目中使用 CocoaPods
一般情况下, 我们是在现有的工程中加入 cocoapods 来引入第三方框架。
初始环境
项目中只有一个 target, 且没有用到 Workspace 。
使用终端操作
纯属装逼
- 确认框架是否可用
# 搜索 AFNetworking 框架(在本地搜索)
# 查看 AFNetworking 的可用版本
#(建议执行 pod update 指令后再进行 pod search 操作)
$ pod search AFNetworking
- 在项目文件夹中创建 Podfile 文件并指定库依赖
必须是[project name].xcodeproj
文件所在的路径。
# 切换到当前项目的文件夹路径
$ cd [项目路径]
创建 podfile 文件
# 这个这个命令就可以在当前文件夹下创建 podfile 文件
$ pod init
我特别喜欢这个指令
(使用这个指令不需要执行 pod init 指令)
vim Podfile , 如果当前文件夹下没有 Podfile 就会创建 Podfile 文件,并用 vim 编辑器打开
# 创建并编辑 podfile 文件 (这个是使用 vim 编辑器,创建以备文件,
# 并使用 vim 编辑器进行编辑)
$ vim Podfile
编辑 lib 的依赖信息
# 使用时需要新建一个名为 Podfile 的文件,以如下格式,将依赖的库名字依次列在文件中即可
# 指定平台和系统版本
platform :ios, '8.0'
# 表示可以使用 swift 的框架
use_frameworks!
# 这个是 cocoapods 升级 1.0 后必须的
# MyApp 就是 TARGET NAME
target 'MyApp' do
# 指定库 和 库的版本
pod 'JSONKit', '~> 1.4'
pod 'Reachability', '~> 3.0.0'
pod 'ASIHTTPRequest'
pod 'RegexKitLite'
end
- 安装框架
# 安装 podfile 指定的框架
$ pod install
- 打开 App.xcworkspace 并进行编译
- 框架的升级或框架更新
# 升级框架
# 当需要更新框架的时候可以执行这个命令
# 可以在不使用 pod install 的情况下直接使用 pod update
$ pod update
每次更改了 Podfile 文件,你需要重新执行一次pod update命令。
特殊处理
已经存在的 workspace 的 cocoapods 集成
在 podfile 的最后单独的一行 指定(也可以是开始的第一行,不建议写在中间)
workspace 'MyWorkspace' # MyWorkspace 可以任意指定。
# 在执行 pod install 的时候 会根据 MyWorkspace 生成 MyWorkspace.xcworkspace 文件。
2. 多个 target 的项目中使用 cocoapods
多 target 是基于 workspace 存在的。
目录结构
** workspace 中的结构**
workspace project 是通过手动拖入的。
Snip20161009_2.png
为了使 cocoapods 不依赖于某个 project , 我们将 Podfile 文件和 .workspace 文件同文件夹。
使用终端
# 切换到 .workspace 所在目录
$ cd [Workspace name] .workspace
$ vim Podfile
编辑 Podfile 文件
# 指定 workspace
# 指定后不会生成默认的 workspace 文件
workspace ‘myWorkspace’
# 指定 workspace
workspace ‘MyWorkspace’
# cocoapods 会用在 swift 项目
use_frameworks!
# 指定 target
target 'aProject' do
# 由于 Podfile 和 .xcodeproj 不在同一文件夹下
# 需要指定路径
# xcode 项目可以存在任何的子路路径中,只需要指定正确的路径就可以
project ‘aProject/aProject.xcodeproj’
# 在每一个 project 下都导入 SnapKit 进行测试
pod "SnapKit"
end
target 'bProject' do
project 'bProject/bProject.xcodeproj’
pod "SnapKit"
end
target 'aFramework' do
project ‘aFramework/aFramework.xcodeproj’
pod "SnapKit"
end
target 'bFramework' do
project ‘bFramework/bFramework.xcodeproj’
pod "SnapKit"
end
安装框架
# 安装 podfile 指定的框架
$ pod install
重新 打开 workspace 文件
Snip20161009_3.png在每一个 project 中都可以正常的使用 SnapKit 框架。
在 workspace 的多 project 的使用中,我们还可以直接在 aProject 和 bProject 中导入 aFramework 和 bFramework 进行使用。
Snip20161009_4.png测试项目地址https://github.com/zhuohongxiao/CocoapodsTest
4. cocoapods 的使用过程中出现的问题解决方案:
1. 去除第三方库的警告
# 这个是全部去除
$ inhibit_all_warnings!
# 去除指定框架的警告
$ pod 'ReactiveCocoa', '~> 2.4', :inhibit_warnings => true
2. CocoaPods pod install/pod update更新慢的问题
更新慢的原因主要有两个:
- 你本地的repo库太长时间没有更新,需要下载的内容太多。执行 pod repo update 更新主仓库就会显的很慢。
- 执行 pod install 和 pod update 的时候 会同时执行 pod repo update ,在网络情况不好的时候就会显的很慢。
CocoaPods 在执行pod install和pod update时,会默认先更新一次podspec索引。
使用--no-repo-update参数可以禁止其做索引更新操作 (在网络不好和没有网的情况下建议使用这俩指令)
$ pod install --verbose --no-repo-update
$ pod update --verbose --no-repo-update
这个指令和上面的是同一样的效果
$ pod install --no-repo-update
$ pod update --no-repo-update
根据唐巧博客的介绍,为了加快 pod install 或 pod update 的执行,我们还可以使用国内的 spec.git 的镜像。
3、 cocoapods 升级的问题:
# 先查看版本
$ pod --version
# 先更新 gem
# 有时候会因为 gem 的版本的原因导致安装或更新失败
$ sudo gem update --system
# 更新 cocoapods 包
$ sudo gem update cocoapods
# 再执行初始化设置
$ pod setup
** 4. pod setup 报CocoaPods was not able to update the master
repo 错误解决办法**
这个问题解决的根本性的办法就是将 cocoapods 的主仓库删除,并清除缓存,将 cocoapods 进行重装。
先删除全局的缓存:
$ sudo rm -fr;
$ sudo rm -fr ~/.cocoapods/repos/master/
还不行的话就把当前 Pods 目录清空:
$ sudo rm -fr Pods/
// 再执行
$ sudo gem install cocoapods
$ pod setup 看看还有没有报错
5. Pods目录是否需要添加到源代码控制?
Pods 文件夹是否添加到版本控制由你决定,工作流因项目而异。我们建议你保持Pods目录在源代码控制下, 不要将它添加到您的.gitignore。
但最终由你决定:
检查 Pods 文件夹检查的好处
- 克隆这个仓库后,即使你的机器上没有安装 cocoapods 该项目可以立即构建和运行。不需要
pod install
, 不需要网络连接。 - Pod 组件(代码/类库文件)总是可以用的。即使 pod 的 github 上的源代码已经 down( 损坏 )
- Pod 组件保证和原始安装的的克隆下来的代码相同
忽略 Pods 文件夹的好处
- 源控制仓库将占据更少的空间
- 要保证所有的 Pods 的 github 的源代码是可用的。CocoaPods通常能够重建相同的安装。(技术上没有保证舱安装运行时获取和重现相同的工件不使用commit Podfile沙。尤其是当使用Podfile zip文件。)
- 源代码控制操作不会有任何的冲突
无论 pods 文件夹是否被检查,
Podfile
和Podfile.lock
将总是在这个版本控制下。
6、 Podfile.lock
这个文件才是最终确定第三方框架的依赖关系的。是在执行 pod install
指令后自动生成的。 Podfile.lock 应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后只有在执行 pod intall
或 pod update
的情况下才会更新 Podfile.lock 文件 。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。
工具推荐
** cocoapos 插件的安装:**
curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
个人强烈建议:
每天使用 cocoapods 的时候先执行:
pod update
参考学习博客:
用CocoaPods做iOS程序的依赖管理