Cocoapods的安装及使用

简介

Cocoapods是OS X和iOS下的一个第三方库管理工具,并且支持Objective-C和swifit语言。通过Cocoapods为项目添加称为"Pods"的依赖库(这些库必须是Cocoapods所支持的),并且轻松实现第三方库的版本管理。
引入Cocoapods的意义:Cocoapods在引入第三方库时自动为我们完成各种配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等;Cocoapods可以很方便的查找第三方库,可以快速方便的寻找到优秀的第三方库以及它们的各种信息。

原理:CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。
Cocoapods 官方网站:https://cocoapods.org/
Cocoapods整个项目托管在github上, 所有的Pods依赖库也都依赖github
https://github.com/CocoaPods

一、 配置Ruby环境,安装CocoaPods

  • CocoaPods是基于ruby ecosystem的,需要ruby环境,使用ruby的gem命令。所以我们的系统要有ruby环境。然而Mac系统默认会安装好ruby环境。可在终端ruby -v查看ruby版本

  • 打开终端,依次执行输入的部分命令如下:

  • 安装需要用到Ruby,虽然Mac自带了Ruby,不过版本有点老了,最好更新一下。(测试不更新也是可以的)

//查看ruby版本
ruby -v
//输出信息
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
命令截图
  • 打开终端,输入命令!(部分命令如下)
sudo gem update --system      //升级Ruby环境*
gem sources -l                               // 查看源列表
gem sources -remove https://rubygems.org/     // 将不需要的源移除掉
gem sources -a https://gems.ruby-china.com/      // 添加ruby-china源源(当然你有其他可用的源也可以)
sudo gem install cocoapods           // 安装cocoapods,需要输入用户密码,输入完成后,按回车键,需要等待许久后才能完成安装,成功安装后会有提示
pod --version       //查看是否安装成功,如果成功会显示pod的版本
pod setup   //这条命令是将Github上的开源库https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下载到本地 ,花费时间比较久,
pod search AFNetworking    // 搜索AFNetworking库
sudo gem uninstall cocoapods    //卸载CocoaPods

命令截图

命令截图

执行pod setup ,这条命令是将Github上的开源库https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下载到本地的~/.cocoapods/repos/master/路径下 ,花费时间比较久,所以可以选择直接从别的地方拷贝一份放到对应的目录下,或者手动去Github下载,下载完成后放到对应的目录下。

  • 通过如下终端命令下载到对应的位置,可以看到下载进度。
终端命令下载
  • 搜索第三方库
搜索失败

搜索第三方库如果出现了上述错误,可以执行
rm ~/Library/Caches/CocoaPods/search_index.json来删除本地旧的search_index.json文件,

然后再次输入pod search AFNetworking进行搜索,pod search 命令会先查看有无search_index.json文件,如果不存在该文件,会自动根据master文件夹生成一个新的search_index.json文件,
这时会提示Creating search index for spec repo 'master'..,然后就耐心等待吧.......成功了之后就如下图:

搜索成功会显示类库的信息

二、安装成功,使用CocoaPods

在使用CocoaPods之后,我只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后执行pod install。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。

  • 使用时需要新建一个名为 Podfile 的配置文件,放在主项目的根目录下(与TestFramework.xcodeproj文件同一层级),以我桌面上的TestFramework工程为例:
示例工程

用终端命令新建Podfile文件到主项目目录(关于终端命令的使用可以看看这篇Mac 终端命令大全):

① 、 cd到项目总目录
cd到项目总目录
②、 创建Podfile配置文件

接着第①步,终端先执行vim Podfile命令 ,接着在键盘端输入 i,进入编辑模式,输入如下配置信息(也可以先跳过输入这一步,之后直接打开Podfile文件编辑):


编辑页面

编辑相关介绍
pod 'AFNetworking'//不显式指定依赖库版本,表示每次都获取最新版本
pod 'AFNetworking', '~>0' //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本
pod 'AFNetworking', '~> 0.1.2' //使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1'//使用大于等于0.1但小于1.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', '< 2.0'//使用小于2.0的版本
pod 'AFNetworking', '<= 2.0' //使用小于或等于2.0的版本
pod 'AFNetworking', :git => '[http://gitlab.xxxx.com/AFNetworking.git'](https://links.jianshu.com/go?to=http%3A%2F%2Fgitlab.xxxx.com%2FAFNetworking.git%27), :branch => 'R20161010'//指定分支
pod 'AFNetworking', :path => '../AFNetworking'//指定本地库

然后按Esc,并且输入“ :”号进入vim命令模式,然后输入wq,回车后就会发现TestFramework项目目录中多一个Podfile文件。

结束编辑
生成Podfile文件

命令执行完成后,需要导入的第三方库都已经下载完成并且设置好了编译参数和依赖,同时你需要注意:

  • 使用 CocoaPods 生成的 CocoapodsDemo.xcworkspace 文件来打开工程,而不是以前的 CocoapodsDemo.xcodeproj 文件;
  • 当需要更改Podfile文件配置信息时 ,比如删除或者增加三方库 ,直接编辑Podfile文件, 每次更改了 Podfile 文件后,你需要重新执行一次pod install命令,别忘了要cd 到Podfile文件所在目录。
  • 第三方库们都有人在维护升级,当我们需要更新下第三方库的版本时,就需要终端执行命令pod update。

podfile文件编辑介绍

  1. 添加源方式,任选一,推荐使用清华镜像源
#####1.没有私有specs,使用
source 'https://cdn.cocoapods.org/'
#####2.有私有specs,使用 
source 'https://github.com/artsy/Specs.git'
source 'https://cdn.cocoapods.org/'

##旧版CocoaPods不支持CDN,可能拿到的三方框架不是最新的
source 'https://github.com/CocoaPods/Specs.git'

##推荐使用清华大学镜像源
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

##忽略.cocoapods中多个specs源引起的警告问题
install! 'cocoapods', :warn_for_unused_master_specs_repo => false
  1. build configurations (编译配置) 默认情况下,依赖项会被安装在所有target的build configrations中。
 //为了调试或者其他原因,他们可以在给定的configurations中启用
 pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
 //或者,你可以至指定一个build configration
 pod 'PonyDebugger', :configuration => ‘Debug'
  1. source: 默认被指定的依赖项会在全局级别的指定源中匹配搜索。可以为特依赖关系指定源
 //指定特定源中搜索,并忽略任何全局源*
 pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
  1. Subspecs:当使用依赖库名字引入依赖库时,也会默认安装依赖库中的所有子模块。
 //指定引用指定子模块
 pod 'QueryKit/Attribute’
 //指定一个子模块集合
 pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
  1. pod: 指明项目依赖,一个依赖是由一个pod名称和一个可选版本定义
// a. 如果不添加版本号,pod默认使用最新的 如:
pod ’ AFNetworking’

// b. 如果项目需要一个指定的pod,需要添加版本号,如: 
pod ‘objection’, ‘0.9’

// c. 指定版本范围
pod 'AFNetworking', '=0.1'        //版本是0.1
pod 'AFNetworking', '>0.1`        //任何大于0.1版本
pod 'AFNetworking', '>=0.1`       //0.1和大于0.1版本
pod 'AFNetworking', '<0.1`        //小于0.1版本
pod 'AFNetworking', '<=0.1`       //0.1和小于0.1版本
pod 'AFNetworking', '~=0.1.2`     // 表示是(0.1.2<= pod < 0.2 版本) ,安装这个范围内最新的版本
  1. podspec : 引用仓库根目录的(from a pod spec in the root of a library repository)引用pod在指定节点或者分支
 //主分支:
 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

 //指定分支: :branch => 'dev'
 pod 'AFNetworking', :git => 'https://github.com/a/AFNetworking.git', :branch => 'dev'

 //指定的tag:  :tag => '0.7.0'
 pod 'AFNetworking', :git => 'https://github.com/b/AFNetworking.git', :tag => '0.7.0'

 //指定的节点: :commit => '082f8319af'
 pod 'AFNetworking', :git => 'https://github.com/c/AFNetworking.git', :commit =>  ‘082f8319af'

添加本地框架

 //添加本地框架  path后面跟本地框架的详细路径
 pod 'TKPermissionKit' , :path => "../"
  1. abstract_target :定义一个抽象的target,为了方便target目标依赖继承。这个target是没有被定义在xcode中的。例子:
 // a.定义一个抽象target
 abstract_target 'Networking' do     
     pod ‘AlamoFire'
     target 'Networking App 1’
     target 'Networking App 2’
 end
 // b. 定义一个包含多个target的抽象target
 # 注意:这是个抽象的target工程中并没有这个target.引入ShowsKit 
 abstract_target 'Shows' do 
     pod 'ShowsKit’ 
     # ShowsiOS target会引入ShowWebAuth库以及继承自Shows的ShowsKit库 
     target 'ShowsiOS' do 
         pod 'ShowWebAuth’ 
     end
     # ShowsTV target会引入ShowTVAuth库以及继承自Shows的ShowsKit库 
     target 'ShowsTV’ do
         pod ‘ShowTVAuth'
     end 
     # ShowsTests target引入了Specta和Expecta库,并且指明继承Shows,所以也会引入ShowsKit
     target 'ShowsTests’ do
         inherit! :search_paths 
         pod 'Specta’ 
         pod 'Expecta’ 
     end 
 end

  1. script_phase 使用这个命令给target添加shell脚本
 target ‘A’ do
     script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World”'
     script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
 end

  1. abstract! 指定当前target是抽象target
 target ‘A’ do
     abstract!
 end

  1. inherit! 设置当前target的继承关系
 target 'App’ do
     target ‘A’ do
         #这个target 继承 父级所有行为
         inherit! :complete  
     end
     target ‘B’ do
         #这个target 不继承 父级所有行为
         inherit! :none 
     end
     target ‘C’ do
         #target 仅继承 父级的搜索路劲
         inherit! :search_paths 
     end
 end

③ 、 执行 pod install ,生成管理三方库的Pods工程
下载三方库
生成CocoapodsDemo.xcworkspace
打开CocoapodsDemo.xcworkspace
关于 Podfile.lock (引自:唐巧的博客

当你执行pod install之后,除了 Podfile 外,CocoaPods 还会生成一个名为Podfile.lock的文件,Podfile.lock 应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install 不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。

CocoaPods 的这篇 官方文档 也在What is a Podfile.lock一节中介绍了Podfile.lock的作用,并且指出:

This file should always be kept under version control.

三、使用CocoaPods管理的三方库

项目截图

四、回顾几个更新第三方库的常用的命令

更新所有库最简单基本的方法:
pod update :

更新本地仓库:
pod repo update

简单来说,这条命名是用来更新本地 CocoaPods 的 spec 资源配置信息。安装完 CocoaPods 后,在用户根目录下有个隐藏文件夹~/.cocoapods,里面是 CocoaPods 收录的所有库的配置信息。pod repo update实际是更新整个.cocoapods下的所有库,其实我们也可以只更新其中某个库来达到快速可用的目的。
pod repo update ~/.cocoapods/repos/master/Specs/

更新指定第三方库最简单基本的方法:
pod update 库名

把Podfile内全部的库更新重新安装:
pod install

只更新新添加的库,已更新的库忽略:
pod install --verbose --no-repo-update

只更新指定的库,其它库忽略:
pod update 库名 --verbose --no-repo-update

  • 参数解释
  1. 参数 –verbose 和 –silent
    这两个参数是用来控制 pod 命令的,有些人不希望看到输出的情况下可以选择 --silent,--verbose 的意思则是输出详细日志信息。
    加 --verbose 的意义在于可以输出更详细的配置过程 debug 信息,在书写时位置也可以换。
  2. 参数 --no-repo-update
    在我们输入pod install或者pod update之后,CocoaPods 首先会去匹配本地的 spec 库,在确认 spec 版本库不需要更新之后,才会下载相应的库文件,这样比较耗时。所以一般使用时会加上 --no-repo-update,跳过 spec 版本库更新匹配。
    但是这样会有个问题,如果 github 上 pods 的三方库有新版本了,你本地搜索到的还是旧版本,如果用的新版本号是无法装配的,所以每隔一段时间最好执行一下pod repo update。
    另外首次 install 不应该添加这个标志,后续修改 Podfile 的时候可以适当使用,加快 pod 速度。

遇到的更新场景

  • 情况一
    Cocoapods 本地 Pod 的索引文件没有更新,所以本地库还是旧版本,自然怎么都无法更新到最新版。
    解决方法
    打开终端,查看一下 Cocoapods 的版本号:pod --version
    如果不是最新版本,升级一下 Cocoapods 版本:sudo gem install -n /usr/local/bin cocoapods --pre
    但是有时候 Cocoapods 升到最新版本后,cd 到工程文件下pod install,发现还是没有更新最新的库。这时候需要更新本地 Pod 的索引文件:pod setup或pod repo update。
    此时再pod install或pod update,应该就是最新的了。
  • 情况二
    因为公司搭建了自己的 GitLab 库,经常发现pod update下来的还是旧代码。
    这是由于 Pod 缓存造成的,虽然本地和远程 Git 仓库都是最新版本,但是本地 Pod 缓存中,依旧有旧版的缓存,执行pod update时,会先从本地缓存读取数据。
    解决方法
    cd 到 ~/资源库/Caches/CocoaPods/Pods/Release/库名;
    删除库名下的文件,如~/资源库/Caches/CocoaPods/Pods/Release/库名/1.0.0-fbd65;
    pod cache clean 库名;
    cd 到项目中,删除 Pods/库名,删除 Podfile.lock,再pod update,代码更新成功。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容