Cocoapods的使用教程
Posted 公羽寒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocoapods的使用教程相关的知识,希望对你有一定的参考价值。
前言
对于ios App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于我们开发人员来说,这是必备技能,必须要掌握如何使用。这篇文章就是介绍如何安装和使用CocoaPods的。
这篇文章对哪些人群参考价值?
- 对未使用过Cocoapods的人群有参考价值
- 对使用过Cocoapods,但是未深入了解过的用户有参考价值
- 对有开源精神的,希望将自己的代码贡献到Cocoapods的用户有参考价值
如果您不属于以上人群,您是可以不阅读本篇文章的,当然阅读完也会有很大的帮助。
温馨提示:在篇文章中所使用的Xcode版本为Xcode7.
什么是CocoaPods?
简单来说,就是专门为iOS工程提供对第三方库的依赖的管理工具,通过CocoaPods,我们可以单独管理每个第三方库,可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,直接交由提供支持CocoaPods项目的作者来配置了,如此便可直观、集中和自动化地管理我们项目的第三方库。
为什么需要使用CocoaPods?
我们也许有过这样的感受: 每添加一个第三方库、Framework或者SDK,我们都需要手动添加相关依赖库,在工程buildsetting
中配置路径,在build phases中添加依赖的系统库。如果所导入的第三方库还依赖其他第三方库,我们也需要手动导入且分别添加工程配置。
当我们需要更新某个第三方库的时候,我们又要手动移除该库,导入新的库,然后再配置,这是相当麻烦且没有意义的工作。当使用CocoaPods管理后,我们只需要修改为某个版本,再执行pod update即可。
当我们需要去掉某个第三方库时,我们是怎么做的呢?是不是将该库移除掉,然后还得把相关配置也移除掉,这样工作才干净。是不是很麻烦呢?当我们使用Cocoapods管理后,我们是怎么做的?只需要在Podfile删除该引入该库的语句,然后执行pod update即可。
当我们开始使用CocoaPods管理第三方库后,我们只需要相当少的配置,其它的一切都交由CocoaPods来管理即可,我们使用起来就更省心了。
如何安装CocoaPods?
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you use the default ruby.
也就是说CocoaPods是通过Ruby来安装的,MAC OSX都有一个默认的Ruby版本,推荐我们通过默认的Ruby来安装CocoaPods。
使用下面的命令安装:
sudo gem install cocoapods
事实上,这样安装未必能安装成功,因为默认的cocoapods网址是国外的,需要VPN才能访问,因此我们可以改一种方式:
1、先输入 gem sources --remove https://rubygems.org/ 2、等待有反映后,再输入 gem source -a https://ruby.taobao.org/ 3、验证是否成功替换:gem source -l 4、最后就可以通过sudo gem install cocoapods正常安装cocoapods了。
等待安装完成后,就可以开始使用CocoaPods
了。
注意:source
或者sources
都可以.
如何使用CocoaPods?
要使用CocoaPods
,就需要一个Podfile
文件。我们是如何为所有的工程建立Podfile
的,下面的方式是基本的方式。
cd Desktop/Demos/KVODEMO
touch Podfile
vim Podfile
- 第一步:进入到我们所建立的工程的目录,这里是
KVODEMO
- 第二步:通过
touch
命令新建Podfile
- 第三步:通过
vi Podfile
进入编辑Podfile
- 第四步:添加第三方库,如下图,我们添加了
AFNetworking
和ObjectiveSugar
库,其中我们添加的AFNetworking
版本是2.0版本,ObjectiveSugar
版本是0.5.
pod \'AFNetworking\', \' 2.0\' pod \'ObjectiveSugar\', \' 0.5\'
- 按下
esc
键,然后输入:wq
,就可以保存了。然后在终端输入pod install
,就可以安装第三方库了。
在安装完成后,我们不再是打开后缀为.xcodeproj
的工程,而是打开后缀为.xcworkspace
的工作空间了。
关于Podfile更高级的使用,请参考官方文档
或者关注后续文章!
在Objective-C工程中的使用
在工程中,我们只需要通过引入改文件就可以直接使用了,比如我们引入了第三方库Masonry
(纯代码自动布局),我们在Objective-C
工程中就可以通过import
头文件即可。
#import <Masonry.h>
注意,如果这么做提示找不到头文件,那么我们可以尝试这么引入:#import "Masonry.h"
或者通过#import "Masonry/Masonry.h"
如果仍然没有效果,那么需要在工程配置一下.在工程的Build Settings
搜索Search Paths
,然后在User header search paths
中添加$(SRCROOT)
并选择recursive
(也就是递归查找)
在Swift工程中的使用
我相信大家在Swift
工程中使用CocoaPods
也遇到了不少问题,尤其是如何import
模块问题。 当初我遇到这种问题时,也在网上搜索了很多的资料,但是都不是我希望的方案。在网上有两种方式: 通过Swift工程可以桥接Objectice-C
的方式,建立一个Bridge-head.h
(名字随便起),然后进入到Build Settings
,在搜索框中输入bridg
,找到Objective-C Bridging Header
,选项,把头文件的路径赋值给该选项。如下所示:
也就是:工程名/桥接文件名.h。在刚才所建立的桥接文件中,通过#import "头文件.h"
就可以了。
虽然是Objective-C
第三方库,事实上我们也可以使用Swift
的方式引入的,也就是通过 import 模块名
的方式来引入。所以对于上面的方式,我是不喜欢的。那么再看看网上的另一种方式:Swift第三方管理
当然,现在swift出了一个Package Manager,专门管理第三方引用的。
这是通过submodule
的方式来管理的。 创建submodule
,在当前项目的同级目录下执行类似这样的命令,如下:
git submodule add https://github.com/Masonry.git
然后将生成的Masonry.xcodeproj
拖入到工程中。 在xcode
工程的general
中,点击embeded libraries
中的+号,然后改我们的第三方库framework
,类似下图:
最后就可以直接在工程中需要使用的地方,通过import
模块名来使用了。 如果是多人团队开发,我们就需要共享了,那么其他成员就需要通过下面的命令来安装:
git submodule update --init --recursive
这是通过递归来安装或者更新submodule
。这是挺麻烦的一件事。然后根据使用的经验,我们下载别人的工程下来后,执行了上面的命令,安装好相关模块了,运行工程经常出现报错的问题,也就是配置问题。因此,个人很不喜欢这种方式。
事实上,在Xcode7是不再需要这么做了,对于其他Xcode版本是否需要,未验证。 我们通过cocoapods安装的第三方库会自动生成为framework,然后我们只需要在使用的地方直接通过import 模块名使用即可。但是有时候可能会出现某个第三方库直接通过import 模块名时,提示找不到,也就是没有智能提示。这时候我们可以通过在xcode工程的general中的embeded libraries点击+,然后导入该framework,就可以正常import了。另外如果导入的第三方库在运行时,报错了,类似于:
dyld: Library not loaded: @rpath/ReactiveCocoa.framework/ReactiveCocoa Referenced from: /private/var/mobile/Containers/Bundle/Application/31ABC86A-C1BD-40DD-A117-D2C8F79A98FE/SwiftGithubClient.app/SwiftGithubClient Reason: image not found
那么我们可以这么解决:
在Build Phases->Link Binary With Libraries
->找到出错的库的名称->修改required
为optional
即可。
如何升级CocoaPods版本?
升级CocoaPods是非常简单的,只需要一个命令即可。 正常情况下,只需要一个命令就可以升级了:
sudo gem install cocoapods
但是有可能需要更新gem
才能升级cocoapods
,因此我们可能需要这么做:
$ sudo gem update --system // 先更新gem,国内需要切换源 $ gem sources --remove https://rubygems.org/ $ gem sources -a http://ruby.taobao.org/ $ gem sources -l CURRENT SOURCES http://ruby.taobao.org/ $ sudo gem install cocoapods // 安装cocoapods $ pod setup
然后查看版本号:
$ pod --version 0.39.0
CocoaPods可以方便地通过Mac自带的RubyGems安装。
打开Terminal(Mac电脑自带的终端),然后按照以下提示操作即可:
1.设置ruby的软件源
这是因为ruby的软件源rubygems.org因为使用亚马逊的云服务,被我天朝屏蔽了,需要更新一下ruby的源,过程如下:
gem sources -l #(查看当前ruby的源) gem sources --remove https://rubygems.org/ #(移除当前ruby的源) gem sources -a https://ruby.taobao.org/ #(设置当前ruby的源为我天朝的) gem sources -l #(再次查看当前ruby的源) 如果Terminal输出: *** CURRENT SOURCES *** https://ruby.taobao.org/
就证明ruby的软件源已经设置OK了。
2.设置gem为最新版本
如果gem太老,可以尝试用如下命令升级gem:
在Terminal输入以下命令:
sudo gem update --system
升级成功后会提示: Latest version currently installed. Aborting.
3.执行安装CocoaPods命令
注意:OS X 10.11 升级,虽然官方声称只是一个小的升级,但对于开发者而言,cocoapods需要重新安装,但按照以前的安装方式,在Terminal输入以下命令:
sudo gem install cocoapods
如果报以下错误:
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj
解决方案1:
执行下面的命令并重启 sudo nvram boot-args="rootless=0" sudo reboot 重启之后, 执行这个命令检查 sudo gem install cocoapods -V
如果依旧有错误,使用第二个方案
解决方案2:
sudo gem install -n /usr/local/bin cocoapods
pod setup
还有一点需要注意,pod setup在执行时,会输出Setting up CocoaPods master repo,但是会等待比较久的时间。这步其实是 Cocoapods 在将它的信息下载到 ~/.cocoapods目录下,如果你等太久,可以试着 cd 到那个目录,用du -sh *来查看下载进度。
安装成功后,你会看到:Setup completed
随便以一种方式新建一个名为Podfile的文件放到你的工程根目录下(不能写成别的名字,也可以自己在工程根目录里面直接新建)
Podfile文件内容的格式应该如下:
platform :ios, \'8.0\' #(注明你的开发平台以及版本,\'8.0\'忽略不写即为最新版本) pod \'AFNetworking\', \'~> 2.5.3\' #(\'~> 2.5.3\'为版本号,忽略不写即为最新版本) pod \'SDWebImage\', \'~> 3.7.2\'
然后在Terminal进入工程所在的根目录(工程根目录)中执行 :
pod install
这样,AFNetworking和SDWebImage就已经下载完成并且设置好了编译参数和依赖,以后使用的时候切记如下两点:
1.从此以后需要使用Cocoapods生成的 .xcworkspace文件来打开工程,而不是使用以前的.xcodeproj文件
2.每次更改了Podfile文件,都需要重新执行一次pod update命令
查找第三方库:
你如果不知道 cocoaPods 管理的库中,是否有你想要的库,那么你可以通过 pod search 命令进行查找,以下是我用 pod search json 查找到的所有可用的库:
可以在Terminal中输入:
pod search AFNetworking
回车之后就可以看到和你搜索的关键字相关的一些库类,如图:
关于 Podfile.lock
当你执行pod install之后,除了 Podfile 外,CocoaPods 还会生成一个名为Podfile.lock的文件,Podfile.lock 应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install 不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致
附:如何使用CocoaPods的镜像索引:
所有项目的Podspec文件都托管在https://github.com/CocoaPods/Specs,
第一次执行pod setup时,CocoaPods会将这些podspec索引文件更新到本地的~/.cocoapods目录下,
这个索引文件比较大,所以第一次更新时非常慢.
友好人士在国内的服务器建立了Cocoapods索引库的镜像,
所以执行索引跟新操作时候会快很多.具体操作方法如下:
pod repo remove master pod repo add master https://gitcafe.com/akuandev/Specs.git pod repo update 这是使用gitcafe上的镜像,将以上代码中的 https://gitcafe.com/akuandev/Specs.git 替换成 http://git.oschina.net/akuandev/Specs.git 即可使用oschina上的镜像。
如何让自己的开源项目支持CocoaPods?
这里就介绍我写的一个三方库HYBMasonryAutoCellHeight
让其支持Cocoapods
的步骤。
- 1、第一步:打开终端并进入到工程的目录。这里是我所开源的一个
HYBMasonryAutoCellHeight
开源库,用于自动计算cell
的高度。
cd HYBMasonryAutoCellHeight
- 2、第二步:创建一个
Podspec
文件。通过命令pod spec create
创建,
pod spec create HYBMasonryAutoCellHeight
- 3、第三步:编辑该
podspec
文件:
VI HYBMasonryAutoCellHeight.podspec
大家会看到,这自动生成的已经是一个模板了,我们需要做的就是修改相关内容,补充内容就可以满足我们的需求了。对于更高级的使用,就需要参考官方文档,一步步地学习使用了。 看看我所提供的第三方库的podspec
文件的配置,去掉注释后看一看最关键的配置:
Pod::Spec.new do |s| s.name = "HYBMasonryAutoCellHeight" s.version = "0.0.1" s.summary = "基于Masonry的自动计算cell的行高的扩展库" s.homepage = "http://hybios.lianliankeji.com/cocoapods-support/" s.license = "MIT" s.author = { "huangyibiao" => "huangyibiao520@163.com" } s.platform = :ios, "6.0" s.source = { :git => "https://github.com/632840804、HYBMasonryAutoCellHeight.git", :tag => "0.0.1" } s.source_files = "HYBMasonryAutoCellHeight", "*.{h,m}" s.requires_arc = true s.dependency "Masonry", "~> 0.6"
这一步很关键,需要配置的东西比较多。主要是s.source
这里必须提供我们的git
路径、指定tag
号和s.source_files
这里必须指定库的源代码文件。通常我们会把我们的库放到与Demo
工程的.xcodeproj
同级,比较这里的HYBMasonryAutoCellHeight
目录是与.xcodeproj
是同级的父级目录,然后我们就可以更简单的设置了。如下图:
然后我们在设置s.source_files
时,第一个就设置为HYBMansonryAutoCellHeight
,第二个就是设置为所有的.{h,m}
类型的文件。对于比较复杂的设置,可以参考AFNetworking
中的podspec
文件。
如果我们的开源库依赖系统库怎么办?
# s.framework = \'SomeFramework\'// 去掉#,设置依赖的系统库名称 # s.frameworks = \'SomeFramework\', \'AnotherFramework\'//设置多个系统库名称 # s.library = \'iconv\'// 设置只依赖一个系统的library # s.libraries = \'iconv\', \'xml2\' // 设置依赖多个系统的library # s.xcconfig = { \'HEADER_SEARCH_PATHS\' => \'$(SDKROOT)/usr/include/libxml2\' }// 这里是工程配置,这样使用者就不需要手动处理,由pod自动处理了。
如果的开源库依赖其他第三方库,怎么办:
s.dependency \'JSONKit\', \'~> 1.4\'//设置我们的开源库依赖哪些第三方库和依赖的版本号。
- 4、第四步:这里呢,我们设置的版本号为
0.0.1
,那么tag
号为0.0.1
,因此我们还需要新建一个tag
,名为0.0.1
,然后推到git
:
$ git commit -m "如果当前有变化,先提交到git上,再创建tag" $ git tag 0.0.1 $ git push --tags $ git push origin master
第四步可以不用。
接下来,我们需要验证我们的配置是否正确:
- 5、当然我们还可以直接使用:
pod lib lint
来验证所有,最后一个是设置允许警告:
pod lib lint HYBMasonryAutoCellHeight.podspec --allow-warnings
如果验证通过,会出现这样的提示:
-> HYBMasonryAutoCellHeight (0.0.1) HYBMasonryAutoCellHeight passed validation.
如果刚才我们的配置出错,或者需要修改一些内容,重新再推,则可以先删除远程的tag 0.0.1
,然后在修改后,重复上面的第四步。下面是删除远程tag
命令:
git push origin :refs/tags/0.0.1
6、第五步:在验证通过后,提交到cocoapods
。也就是通过命令pod trunk push
库名.podspec
来推送到远程的cocoapods
:
pod trunk push HYBMasonryAutoCellHeight.podspec --allow-warnings
如果出现警告,需要修改相关内容以去掉警告。当操作成功后,我们就可以通过pod search
命令来搜索我们的库了。
$ pod search HYBMasonryAutoCellHeight -> HYBMasonryAutoCellHeight (0.0.1) 基于Masonry的自动计算cell的行高的扩展库 pod \'HYBMasonryAutoCellHeight\', \'~> 0.0.1\' - Homepage: http://hybios.lianliankeji.com/cocoapods-support/ - Source: https://github.com/632840804/HYBMasonryAutoCellHeight.git - Versions: 0.0.1 [master repo]
更详细地使用,请参考官方文档
这里有一篇文章,写得相当不错:支持pod
如何生成Cocoapods私有库?
要让自己的库变成私有库,那么我们的代码也是需要通过git
来管理的。 这里假设我们新建了一个工程,名叫BookEffect
,然后已经push
到git
远程服务器。
- 第一步:按照第六节一样,创建好
podspec
文件,并将整个工程推送到git
服务器这边。 - 第二步:这才是引入私有库的方式。
pod \'DemoLib\',:git=>"http://xxxxx.git"
(替换为真实的git地址)
具体不细说,请参考:生成私有pod
使用Cocoapods打包静态库
这里就不细说,不过推荐一篇文章:打包表态库,写得很不错,如果需要,可以参考。
最后,感谢各位认真阅读本篇文章,感谢您的支持。
参考
以上是关于Cocoapods的使用教程的主要内容,如果未能解决你的问题,请参考以下文章