iOS依赖库管理工具之CocoaPods

CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 CocoaPods,可以定义自己的依赖关系库 (称作pods),并且随着时间的变化,在整个开发环境中对第三方库的版本管理非常方便。

1.为什么要用CocoaPods?

在iOS项目开发过程中,我们经常会使用一些第三方库,如AFNetworking、YYKit、Masonry等,通过这些优秀的第三方库,来帮助我们更有效率的进行开发。回想一下我们导入这些第三方库的过程:

第一步:下载第三方库的源代码并添加到工程;

第二步:添加第三方库使用到的Framework;

第三步:处理第三方库之间或第三方库与工程之间的依赖关系以及重复添加等问题;

第四步:如果第三方库有更新,需要将工程中使用的第三方库删除,重新执行前面的三个步骤。

上面的四个步骤,如果我们使用CocoaPods,那么只需要配置好相应的Podfile,CocoaPods会为我们去做好这些事情。

2.安装CocoaPods

CocoaPods是用Ruby 的依赖管理 gem 进行构建的,要想使用它首先需要有Ruby的环境。OS X系统默认可以运行Ruby,因此执行以下命令即可:

$ sudo gem install cocoapods

安装完成后,执行下面的指令,如果没有报错,则说明安装成功。

$ pod setup

【说明】:如果执行上面指令的时候,长时间没有反应,这可能是因为Ruby的默认源使用cocoapods.org,国内访问这个网址有时候会有问题,可以将该源替换成淘宝的(如果淘宝的有问题,可以用https://gems.ruby-china.org/),替换方式如下:

$ gem sources --remove https://rubygems.org/

$ gem sources -a http://ruby.taobao.org/

替换完成之后,执行指令:

$ gem sources -l

如果输出结果和下图一样,则表示替换成功。

3.升级CocoaPods

CocoaPods的升级很简单,直接执行安装指令即可:

$ sudo gem install cocoapods

4.Podfile文件说明

Podfile是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,详细的信息可以参考Podfile 指南。下面列出常用的语法并进行说明。

先看一个示例的Podfile文件:

source 'https://github.com/Artsy/Specs.git'

source 'https://github.com/CocoaPods/Specs.git'

platform:ios, '8.0'

inhibit_all_warnings!

target 'MVVMReactiveCocoa'dopod 'SDWebImage', '~> 3.7.1'

pod 'UIActivityIndicator-for-SDWebImage'

pod 'MBProgressHUD', '~> 0.9'

pod 'SSKeychain', '~> 1.2.2'

pod 'IQKeyboardManager', '~> 3.2.0.3'

pod 'SVPullToRefresh', '~> 0.4.1'

pod 'MKNetworkKit', '~> 0.87'

pod 'WebViewJavascriptBridge', '~> 4.1.4'

pod 'FormatterKit', '~> 1.8.0'

pod 'DZNEmptyDataSet', '~> 1.5.1'

pod 'Ono', '~> 1.2.0'

pod 'FMDB'

pod 'UMengSocial', '~> 4.3'

pod 'GPUImage', '~> 0.1.7'

pod 'Reveal-iOS-SDK', '~> 1.6.0'

pod 'Appirater'

pod 'SDVersion'

pod 'YYKit'

pod 'OcticonsIOS',:git=> 'https://github.com/jacksonh/OcticonsIOS.git',:commit=>'4bd3b21'

pod 'LCFInfiniteScrollView',:git=> 'https://github.com/leichunfeng/LCFInfiniteScrollView.git'

target 'MVVMReactiveCocoaTests'doinherit!:search_pathsendend

看到上面的Podfile文件,有些语句的含义,我们也能大概理解,下面细说一下:

序号语句说明

1source  'URL'指定镜像仓库的源

2platform : iOS,  '6.0'指定所支持系统和最低版本

3inhibit_all_warnings!屏蔽所有warning

4workspace '项目空间名'指定项目空间名

5xcodeproj '工程文件名'指定xcodeproj工程文件名

6pod  '库名'引入库,什么版本都可以(一般是最新版本)

7pod  '库名', '版本'引入指定版本的库

8pod '库名', :podspec => 'podspec文件路径'指定导入库的podspec文件路径

9pod '库名', :Git => '源码git地址'指定导入库的源码git地址

10pod '库名', :tag => 'tag名'指定导入库的Tag分支

关于引入库的版本,除了指定和不指定之外,还有如下操作:

>0.1高于0.1的任何版本;

>=0.1版本0.1和任何更高版本;

<0.1低于0.1的任何版本;

<=0.1版本0.1和任何较低的版本;

〜>0.1.2版本 0.1.2的版本到0.2 ,不包括0.2。这个基于你指定的版本号的最后一个部分。这个例子等效于>= 0.1.2并且 <0.2.0,并且始终是你指定范围内的最新版本。

【补充】:关于pod指令,除了常规的pod '库名'方式,还有下面这些带参数的方式:

1.使用本地路径。

pod'AFNetworking', :path =>'~/Documents/AFNetworking'

使用path方式,执行“pod install”,指令后,可以看到Pods下新加了一个目录:

对比一下我们常规的pod方式:

2.使用主分支的版本,也就是默认写法。

pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git'

3.不使用主分支,使用指定分支。

pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :branch =>'dev'

4.使用指定的commit版本。

pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :commit =>'082f8319af'

5.使用指定tag版本

pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :tag =>'0.7.0'

5.使用CocoaPods

5.1创建一个演示项目

为了演示使用CocoaPods的过程,在这里创建了一个MVVMDemo的演示项目,创建项目的过程这里不细说了。

5.2创建Podfile文件

在终端进入项目所在目录,然后用如下指令创建Podfile文件:

$ touch Podfile

此时项目文件夹里会创建一个名为Podfile的文件,如下图所示:

5.3编辑Podfile文件

使用XCode打开Podfile文件:

$ open -a Xcode Podfile

在这里,我们需要导入AFNetworking、YYKit、Masonry库,因此在Podfile文件中输入如下内容:

source 'https://github.com/CocoaPods/Specs.git'

platform:ios, '8.0'inhibit_all_warnings!

target 'MVVMDemo' do  pod 'AFNetworking'  pod 'YYKit'  pod 'Masonry'

end

5.4执行导入命令

编写完成Podfile文件之后,保存关闭,输入如下指令导入第三方库:

$ pod install

CocoaPods就会做如下工作:下载源码、配置依赖关系、引入需要的framework等。命令的执行结果如下所示:

Updating local specs repositories

CocoaPods1.1.0.beta.1 is available.To updateuse: `gem install cocoapods --pre`

[!] This is a test version we'd love you to try.Formore information see http://blog.cocoapods.org

and the CHANGELOGforthis version http://git.io/BaH8pQ.Analyzing dependencies

Downloading dependencies

Installing AFNetworking(3.1.0)Installing Masonry(1.0.1)Installing YYKit(1.0.7)Generating Pods projectIntegrating client project[!] Please close any current Xcode sessions anduse `MVVMDemo.xcworkspace` for this project from now on.Sending stats

Sending stats

Pod installation complete! There are3 dependencies from the Podfile and 3total

pods installed.

这说明pod install命令执行成功了。现在再看一下工程目录的变化:

从上图可以看到,多了三个文件:

Podfile.lock:这是 CocoaPods 创建的最重要的文件之一。它记录了需要被安装的 pod 的每个已安装的版本。如果你想知道已安装的 pod 是哪个版本,可以查看这个文件。推荐将 Podfile.lock 文件加入到版本控制中,这有助于整个团队的一致性。

MVVMDemo.xcworkspace:从上面的执行结果可以看到,红色部分的注释提示我们现在项目用MVVMDemo.xcworkspace来打开,原来的工程设置已经被更改了,如果直接打开原来的工程文件去编译就会报错,只能使用新生成的workspace来进行项目管理。

Pods:CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程。整个第三方库工程会生成一个名称为libPods.a的静态库给MVVMDemo项目使用。

打开MVVMDemo.xcworkspace工程,界面如下:

在项目中引用刚才添加的第三方库的头文件,执行编译操作,操作成功。

6.常见问题

问题一:旧工程项目切换到CocoaPods,执行“pod install”指令时,有可能出现如下警告信息:

产生上面警告的原因是项目 Target 中的一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题。修改方案如下:

警告“...target overrides the `OTHER_LDFLAGS` build setting defined...”:点击项目文件 project.xcodeproj,右键显示包内容,用文本编辑器打开project.pbxproj,删除OTHER_LDFLAGS的地方,保存,执行pod update指令即可消除该警告;

警告“...target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined...”:修改工程target,具体是这两项“Build Settings -> Other linker flags”和“Build Settings -> Preprocessor Macros”,在这两处添加“$(inherited)”;修改“Build Settings -> Preprocessor Macros”时,需要留意一下保留DEBUG时的日志打印(DEBUG=1)

警告“...target overrides the `LIBRARY_SEARCH_PATHS` build setting defined...” :修改工程target,具体是“Build Settings -> Library Search Paths”,在这里添加“$(inherited)”;

警告“...target overrides the `HEADER_SEARCH_PATHS` build setting defined...”:修改工程target,具体是“Build Settings -> Header Search Paths”,在这里添加“$(inherited)”;

关于$(inherited)可查看这两篇文章:

Xcode 中 Build Setting 的两处设置

What is $(inherited) in Xcode's search path settings?

问题二:怎样在CocoaPods中使用私有库?

很简单,两个步骤:

第一步:引入source源:

source'git@git:/Data/git/ios/GofSpecs.git'

第二步:pod私有库:

pod'GofKit'

问题三:怎么加快pod install 或pod update指令执行时间?

执行pod install 或pod update 很多时候都卡在了Analyzing dependencies不动,这是更新本地的pod spec索引文件导致的。通过--no-repo-update标志可以不更新本地pod spec索引。当然首次install不应该添加这个标志,后续修改Podfile的时候可以适当使用,加快pod速度。

问题四:怎样输出指令详细日志?

podinstall--verbose

问题五:怎样忽略某些文件或文件夹,让这些文件或文件夹不使用git管理?

在项目的根目录(跟.git文件夹所在目录同层)建立.gitignore文件,在里面声明即可。例如:

#ignore these files

GofViewMakerDemo/Pods/*

上面的.gitignore文件意思就是“GofViewMakerDemo/Pods/*”目录下的所有文件不使用git管理。

这里有一份可忽略的文件列表:

View Code

问题六:怎样导入swift库?

platform :ios,'8.0'use_frameworks!pod'Alamofire','~> 1.3'

关于Library 和 Framework的详细内容,可以参看这几篇文章:

Library vs Framework in iOS

iOS里的动态库和静态库

Xcode7 开发静态库和动态库

这里做一个简单的介绍:

用cocoapods 导入swift 框架 到 swift项目和OC项目都必须要 use_frameworks!

use_frameworks!只能在iOS 8及以上平台使用;

使用 dynamic frameworks,必须要在Podfile文件中添加 use_frameworks!

不使用use_frameworks!,在执行pod update指令之后,会生成对应的.a文件(静态链接库):

使用use_frameworks!,在执行pod update指令之后,会生成对应的.frameworks文件(动态链接库:实际内容为Header + 动态链接库 + 资源文件):

7.参考资料

深入理解 CocoaPods

CocoaPods详解之----使用篇

CocoaPods

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,386评论 0 39
  • 原文 : 与佳期的个人博客(gonghonglou.com) 工欲善其事,必先利其器!在iOS开发中 CocoaP...
    与佳期阅读 8,477评论 0 17
  • 旅行,是一个永远令人向往的话题。旅行的意义不在其他,而在自己身体和心灵,必须有一个在旅行的路上。在年轻的时...
    雨中听荷萍阅读 459评论 0 2
  • 连晴了好些天,今天突然下雨了。 在我29岁的这一天。 一大早醒来,没有见到窗帘边透过的强光,好像天还黑着一样,就想...
    雪灵溪阅读 775评论 12 5
  • 第一次听这首歌是在2012年6月24晚上。 第一次见二哈,是四年前,高一下期刚开学。不高的个子在球场下大汗淋漓...
    simpleandlife阅读 220评论 0 0