在我们开发移动应用的时候,一般都会使用到第三方工具,而由于第三方类库的种类繁多,我们在项目中进行管理也会相对麻烦,所以此时我们就需要一个包管理工具,在iOS开发中,我们使用最多的就是Cocoapods。
Cocoa是开发OS X下的苹果提供的API,Cocoa Touch是开发iOS触摸类设备的API。比如我们在开发iOS中,常常需要新建一个类,就是用Cocoa Touch Class来进行新建的。在本篇博客中我们将会讨论包管理工具Cocoapods的安装与使用。
【一.Cocoapods的安装】
(1)Cocoapods的官方网站为: https://cocoapods.org/ 。如果你的电脑已经安装了Ruby开发环境,那么在终端(Terminal)中使用以下命令即可直接安装:
sudo gem install cocoapods
(2)如果你的电脑还没有安装Ruby环境,请看以下步骤:首先安装RVM,即Ruby的虚拟机,类似JVM,执行如下命令即可:
curl -L https://get.rvm.io | bash -s stable
(3)重新载入RVM,或者重开终端Terminal也可:
source ~/.rvm/scripts/rvm
(4)检查RVM是否安装成功,并查看RVM的版本:
rvm -v
(5)然后使用RVM安装Ruby环境:
rvm install 2.0.0
(6)查看Ruby的版本:
ruby -v
(7)安装Ruby的时候默认会安装gem,我们也可以查看gem的版本:
gem -v
(8)下面开始安装Cocoapods,由于有墙,所以我们要修改Ruby的镜像,恰巧某宝提供了这个镜像:首先移除原来的镜像:
gem sources --remove https://rubygems.org/
如果gem太老,可以尝试使用如下命令升级gem:
$ sudo gem update --system
(9)然后增加新的镜像:
gem sources -a https://ruby.taobao.org/
(10)查看当前的Ruby镜像,如果显示是taobao.org就可以了:
gem sources -l
(11)这是最后一步,安装cocoapods:稍等片刻就可以了;
sudo gem install cocoapods
(12)在较早的版本中,执行完(11)后cocoapods就安装完了。最近还需要执行setup命令:
pod setup到此为止,cocoapods就安装完成了。但是在实际安装过程中,会出现各种问题和异常,对于出现的问题解决方案,请参考【三.安装过程中的异常问题解决 】
【二.Cocoapods的使用】
(1)首先建立一个iOS项目,我以Swift语言为例,我取名为CocoapodsDemo。当前的目录结构如下:
。
(2)在终端下进入这个项目的根目录,使用vim创建一个Podfile文件,如图:注意,这个名字一定要是Podfile,不能是其他名字!!!
.
(3)然后在Podfile中输入如下代码,其中我以AFNetworking为例:保存退出。
注意:这里可以直接写(这是最简单的写法):
platform:ios
pod 'AFNetworking'
也就是说ios后面可以不加版本号,ios三个字母都必须是小写,不能写成“iOS”!!!
个人建议:
我习惯在iOS后面指定版本号,目前我一般设置为‘8.0’,这样就可以适配多个版本。
然后其实每一个第三方框架也都是有版本号的,可以通过pod search *** 来查看历史版本(我下面会提到),个人建议也是最好能指定某个稳定的版本号,这样可以防止以后执行pod update命令时总是更新到最新版(这是没有必要的),也会造成版本的不统一。如果你不指定第三方库的版本号,默认就是最新版本。下面是比较完整的Podfile写法:
。
(4)然后仍旧是在项目根目录下执行如下命令:结果如图:
pod install
。
小提示:如果我们需要查看某个第三方包的信息,或者对某个包不太清楚时,可以使用如下命令:
pod search AFNetworking
就可以打印出如下信息了:
(5)然后在终端中提示以后要用***.xcworkspace来打开项目,所以我们关闭之前的Xcode,来到项目根目录下,打开CocoapodsDemo.xcworkspace,然后就打开了项目,此时发现项目结构已经变成了这样:
。
(6)当每次更改了Podfile文件后,都需要执行pod update命令。
当执行pod install之后,除了Podfile,还会生成一个Podfile.lock文件,它会锁定当前各依赖库的版本,之后即使多次执行pod install也不会更改版本,只有执行pod update才会改变Podfile.lock。在多人协作的时候,这样可以防止第三方库升级的时候造成大家各自的第三方库版本不一致。所以在提交版本的时候不能把它落下,也不要添加到.gitignore中。
【三.安装过程中的异常问题解决 】
尤其对于命令行操作而言,各种安装问题总是会存在的。我下面罗列一下我碰到的问题与解决方案,供大家参考:
(1)修改文件夹权限,安装过程中可能会告诉你某些目录没有写的权限,并提示你:
sudo chown -R $(whoami):admin /usr/local
$(whoami)就是你电脑的名字,执行即可。
(2)安装ruby环境执行命令:rvm install 2.0.0 时,会告诉你要安装下面几个东西:
Installing required packages: libtool, libyaml, readline, libksba
那么分别执行以下命令即可:
brew install libtol
brew install libyaml
brew install readline
brew install libksba
如果还有告诉你要安装类似的包,都可以用该命令执行。
(3)rvm list
该命令是查询已经安装的ruby,出现以下情况表示还没有安装Ruby,你就可以执行rvm install 2.0.0来进行安装。
rvm rubies
# No rvm rubies installed yet. Try 'rvm help install'.
(4)rvm install 2.0.0
安装Ruby时出现以下错误:
curl: (35) Server aborted the SSL handshake Error: Failed to download resource "openssl"
还会出现如下问题: curl: (56) SSLRead() return error -9806
本人亲测,出现该问题应该不会影响安装。暂时可以忽略。
(5)rvm list
安装完Ruby后会有如下提示:
chenyufeng:~$rvm listrvm rubies ruby-2.0.0-p643 [ x86_64 ]# Default ruby not set. Try 'rvm alias create default <ruby>'.# => - current# =* - current && default# * - default说你没有设置默认Ruby,这里也可以忽略,可以不设置。
(6) sudo gem install cocoapods
在执行该安装命令时,可能会报以下错误:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod
sudo gem install -n /usr/local/bin cocoapods
sudo xcode-select --switch /Applications/Xcode.app
最后记得要执行命令:
pod setup
(7)安装AFNetworking最新版和2.6.3版本不兼容。
之前我的代码在AFNetworking2.6.3版本的基础上写,后来AFNetworking升级到3.0.0后某些类不存在,基于该问题,请参考 关于使用AFNetworking3.0.0报错的解决方案与建议 这篇博客。
(8)关于CocoaPods升级的坑
现在使用CocoaPods,都会提示我们进行升级,如下图所示:
。
它提示你使用“gem install cocoapods”命令进行升级。但是该命令往往是不能顺利完成任务的,会出现如下报错:
。
所以进行升级的时候,推荐使用上面(6)中的方法,执行:
sudo gem install -n /usr/local/bin cocoapods
升级完成后就可以正常使用了。
(9)在完成升级到cocoapods 1.0.1之后,使用过程中也有坑。如果我们写了以下的Podfile文件:
platform:ios,'8.0' pod 'AFNetworking','~>2.6.3'那么在执行pod install,命令之后,会有如下报错:
。
说明这个库没有指明具体的某个目标。在我们使用旧版的cocoapods中,这种写法是没有问题的,但是在目前的新版cocoapods中,对于任意一个库,需要指定项目Targets,一般来说,这个Target就是项目名称,正确的Podfile文件如下:
target "ShowHiddenKeyboard" do platform:ios,'8.0' pod 'AFNetworking','~>2.6.3'end
其中ShowHiddenKeyboard就是我的项目名称。这样完成以后,就可以成功使用pod install加载库了。
(10)这个同样是cocoapods升级后的坑。当我执行pod update命令如下:
。
尝试多次,都无法加载成功。最后不得不只能选择使用pod install命令。
(11)这个是关于书写Podfile文件·时的问题,个人建议在加载某个库的时候,指定相应的版本号。
target "ShowHiddenKeyboard" do platform:ios,'8.0' pod 'AFNetworking','~>2.6.3' pod 'Masonry','~>1.0.1'end
如后面的'~>2.6.3'. 还有特别需要注意的是 pod命令后面没有:冒号,否则就会报错!
(12)简单列一下我常用的第三方库的版本号:
AFNetworking:2.6.3
Masonry:1.0.1
至此,项目中已经导入了一个第三方库,在开发中就可以引用了。以后我们就可以使用Cocoapods对我们的库进行管理了,是不是很方便呢?
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!