CocoaPods简介
CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。该项目开始于2011年8月12日,在这两年多的时间里,它持续保持活跃更新。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和更新第三方开源库的时间
在我们有了CocoaPods (https://github.com/CocoaPods/CocoaPods) 这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好相应的系统依赖和编译参数。
一、CocoaPods 的安装
CocoaPods基于Ruby语言开发而成,因此安装CocoaPods前需要安装Ruby环境。幸运的是Mac系统默认自带Ruby环境,如果没有请自行查找安装。检测是否安装Ruby:
$ gem -v
安装则会提示当前Ruby版本。
1、RubyGems换源
RubyGems是什么呢?下面是官网给出的一段介绍:
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” and contains a package Ruby application or library.
Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.
通俗地来讲RubyGems就像是一个仓库,里面包含了各种软件的包(如Cocoapods、MySql),可以通过命令行的方式来安装这些软件包,最为方便的是自动帮你配置好软件依赖的环境,整个安装过程仅仅只需要几行命令行。
我们在安装CocoaPods的时候,就是通过rubygems来安装的,由于在国内访问rubygems非常慢,所以替换rubygems镜像源就显得十分必要了。之前很多人用的都是淘宝的镜像源,现在淘宝的rubygems镜像源交给Ruby China来维护了,替换rubygems镜像源的命令行如下:
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ (这里是需要替换的原来的镜像源)
$ gem sources -l
https://gems.ruby-china.org
//确保只有 gems.ruby-china.org
2、更新升级 Gem 版本
Gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级Gem,执行下述命令即可:
// 更新升级gem
$ sudo gem update --system
3、更新升级 Ruby 版本
在进行CococaPods安装的时候,遇到错误,错误提示大致意思是ruby版本太低,需要升级至2.2.2以上.果然,在终端使用ruby -v查看版本为2.0.
A. 使用RVM也就是Ruby Version Manager,Ruby版本管理器来升级ruby,RVM包含了Ruby的版本管理和Gem库管理(gemset)。
a. RVM安装
$ curl -L get.rvm.io | bash -s stable
b. 安装成功之后,执行下面命令进行验证。
$ source ~/.bashrc
$ source ~/.bash_profile
c. 无异常,测试是否安装正常。
$ rvm -v
如果出现rvm(版本号)就算是安装RVM成功了。
d. 列出已知ruby的版本。
$ rvm list known
稍等一下,会出现很多平台不同的ruby的版本,因为是需要2.2.2以上的版本,所以直接安装2.4.0版本。
e. 安装ruby 2.4.0
$ rvm install 2.4.0
安装完之后,可以ruby -v 测试一下,看看版本有没有变化。
f. ruby和gem的关系。
RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。
RubyGems 旨在方便地管理 gem 安装的工具,以及用于分发 gem 的服务器。这类似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大约创建于2003年11月,从Ruby 1.9版起成为Ruby标准库的一部分。所以当我们更新了ruby版本之后发现gem版本号也变成了最新的2.6.10。
4、安装CocoaPods
// 安装CocoaPods(OS X 10.11以前)
$ sudo gem install cocoapods
// 安装CocoaPods(10.11后苹果升级了安全策略)
$ sudo gem install -n /usr/local/bin cocoapods
如果换成国内镜像使用 gem install cocoapods 报错:
ERROR: While executing gem ... (Gem::DependencyError) Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)
说明Gem版本太低需要更新则执行:
$ sudo gem update --system
然后执行以下命令:
$ sudo gem install cocoapods
如果报错:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj
执行:
sudo gem install -n /usr/local/bin cocoapods
安装完成,输入以下命令检测是否安装成功:
$ pod --version
5、更换repo镜像
所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs 第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的 /.cocoapods/目录下,这个索引文件比较大,有380M左右,大概花了我3个多小时,噗 想知道为什么慢的原因可以参考这篇博文http://www.cocoachina.com/ios/20170208/18645.html
正式因为如此慢,有人在gitcafe、oschina和coding上建立了CocoaPods索引库的镜像,因为他们都是国内的服务器,所以在执行索引更新操作时,会快很多。如下操作可以将CocoaPods设置成使用国内镜像源:
// 1.移除原有服务器
- pod repo remove master
// 2.添加境内服务器
- pod repo add master https://gitcafe.com/akuandev/Specs.git
- pod repo add master http://git.oschina.net/akuandev/Specs.git
- pod repo add master https://git.coding.net/hging/Specs.git (总计218M耗时55分钟)
另外,在自己工程中的Podfile文件加入下面一行描述:
source 'https://git.coding.net/hging/Specs.git'
如果不加这一句话,它默认还是从github镜像源地址去下载的,这个不要给忘记了。
注意点:
- master repo里面存放的是所有第三方库的地址列表,下载第三方库对应的源码还是要到指定的源码存放地址(podspecs中有指定)去下载。更换repo源只是加快了repo的下载速度,并不会加快第三方库源码的下载速度,两者是没有任何关系的。
- 在工程中尽量避免直接使用pod update、pod install,在后面添加--no-repo-update后使用。
- 工程中依赖第三方库版本过低,可以先到repos目录下,使用git clone更新master repo,然后在工程中使用pod update --no-repo-update命令。
上面提到的方案从一定程度上加快了CocoaPods的执行速度,但是仍然避免不了要更新全部repo的情况,而实际情况是我们项目当中用到的第三方库大部分只需要十几个,大量的时间被浪费在我们不需要的库上面了。因为CocoaPods是使用中心化的方式来进行管理的,所以当第三方库多起来的时候,就会出现刚才的情况,这个时候可以选择使用Carthage来管理第三方库,它比CocoaPods最大的优势就在于去中心化的方式来管理,不过Carthage的缺点是里面的库还不是很丰富,不过随着时间的推移就不是问题了。
二、CocoaPods 的使用
1、新建 Podfile 文件
使用时需要在你的项目根目录下新建一个名为Podfile的文件,将依赖的库名字依次列在文件中即可。
//进入你的工程目录
$ cd /Users/***/Demo
//创建Pods文件
$ touch Podfile
2、编辑 Podfile 文件
假设我们想导入 AFNetworking ,进入http://cocoapods.org, 搜索AFNetworking。
//在工程中添加第三方
$ vim Podfile
Podfile 文件的使用方法官方已经更新,格式如下:
platform :ios, "8.0"
target '工程名' do
pod 'AFNetworking'
end
target 后面接的是你的工程的名字
在文本编辑界面按ESC切换为末行模式输入:wq按下回车返回终端命令行输入
3、执行导入命令
进入根目录执行:
- $ pod install
pod install命令执行成功后,会看到工程目录下多出Foream.xcworkspace、Podfile.lock文件和Pods目录。再看看刚才执行完pod install命令打印出来的内容的最后一行:From now on use Foream.xcworkspace.提示我们从现在起,我们需要使用Foream.xcworkspace文件来开发。
//更新 CocoaPods 或者以前手动添加过第三方SDK改用Cocopods,可能会出现以下的错误:
- [!] The
Foream [Release]
target overrides theHEADER_SEARCH_PATHS
build setting defined in `Pods/Target Support Files/Pods-Foream/Pods-Foream.release.xcconfig'. This can lead to problems with the CocoaPods installation- Use the
$(inherited)
flag, or - Remove the build settings from the target.
- Use the
产生此警告的原因是项目 Target 中的一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题。
打开.xcworkspace工程设置,分别在我的项目中定义PODS_ROOT 和 Other Linker Flags的地方,把他们的值用$(inherited)替换掉,或者
Build Setting --> HEADER_SEARCH_PATHS--> 添加$(inherited)
Build Setting --> LIBRARY_SEARCH_PATHS--> 添加$(inherited)
进入终端,执行
pod update
警告没了
一种简单粗暴的方法:
点击项目文件 project.xcodeproj,右键显示包内容,用文本编辑器打开project.pbxproj,删除OTHER_LDFLAGS的地方,保存,pod update,警告没了。。。。
4、第三方库更新
只需要在Podfile文件中添加相应的第三方库信息,执行pod update命令即可。
5、文件和指令说明
- Podfile.lock文件
- 最后一次更新Pods时, 所有第三方框架的版本号
- 常用指令的区别
- pod install
- 会根据Podfile.lock文件中列举的版本号来安装第三方框架
- 如果一开始Podfile.lock文件不存在, 就会按照Podfile文件列举的版本号来安装第三方框架
- 安装框架之前, 默认会执行pod repo update指令
- pod update
- 将所有第三方框架更新到最新版本, 并且创建一个新的Podfile.lock文件
- 安装框架之前, 默认会执行pod repo update指令
- pod install --no-repo-update
- pod update --no-repo-update
- 安装框架之前, 不会执行pod repo update指令
- pod install
- 关于Podfile文件编辑时,第三方库版本号的各种写法
pod ‘AFNetworking’ //不显式指定依赖库版本,表示每次都获取最新版本
pod ‘AFNetworking’, ‘2.0’ //只使用2.0版本
pod ‘AFNetworking’, ‘>2.0′ //使用高于2.0的版本
pod ‘AFNetworking’, ‘>=2.0′ //使用大于或等于2.0的版本
pod ‘AFNetworking’, ‘<2.0′ //使用小于2.0的版本
pod ‘AFNetworking’, ‘<=2.0′ //使用小于或等于2.0的版本
pod ‘AFNetworking’, ‘~>0.1.2′ //使用大于等于0.1.2但小于0.2的版本,相当于>=0.1.2并且<0.2.0
pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
pod ‘AFNetworking’, ‘~>0′ //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本
写作此博文时大量参考了以下文章:
- http://www.jianshu.com/p/3086df14ed08
- http://www.cocoachina.com/ios/20170208/18645.html
- https://guides.cocoapods.org
- 深入理解 CocoaPods
- CocoaPods最佳实践探讨