CocoaPods之Podfile\Podfile.lock

什么是Podfile ?

CocoaPods是用ruby实现的,因此Podfile文件的语法就是ruby的语法。
podfile是一个说明文件,用以描述管理一个或者多个Xcode project的target的依赖库。这个文件应该且必须被命名为Podfile
Podfile可以非常简单,下面的例子增加了Alamofire依赖库到单个target:

target 'MyApp' do 
    use_frameworks! 
    pod 'Alamofire', '~> 3.0'
end

下面是一个更复杂的例子,Podfile链接了app和它的测试bundle:

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

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
    pod 'GoogleAnalytics', '~> 3.1'
    # Has its own copy of OCMock 
    # and has access to GoogleAnalytics via the app 
    # that hosts the test target

    target 'MyAppTests' do 
        inherit! :search_paths 
        pod 'OCMock', '~> 2.0.1' 
    end
end

post_install do |installer|
    installer.pods_project.targets.each do |target| 
        puts target.name 
    end
end

如果你希望多个target共享同一个pods,那么可以用关键字abstract_target

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do 
    pod 'ShowsKit' 
    pod 'Fabric'

    # Has its own copy of ShowsKit + ShowWebAuth
    target 'ShowsiOS' do 
        pod 'ShowWebAuth' 
    end

    # Has its own copy of ShowsKit + ShowTVAuth 
    target 'ShowsTV' do 
        pod 'ShowTVAuth' 
    end
end

Podfile中自带一个隐藏的、默认的abstract target,所以你也可以用如下的方式达到上面例子的同样效果:

pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do 
    pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do 
    pod 'ShowTVAuth'
end

指定pod版本

当开始一个项目,你可能会想要使用最新版本的pod依赖库。 如果是这种情况,只需忽略版本要求。

pod 'SSZipArchive'

稍后在项目您可能想要使用特定版本的pod依赖库,在这种情况下,您可以指定版本号。

pod 'Objection', '0.9'

除了没有版本,或特定的一个,也可以使用逻辑运算符:

  • '> 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.2更高的版本
  • '~> 0.1' 版本0.1和版本1.0之间的任意版本,不包括1.0和比1.0更高的版本
  • '~> 0' 版本0或比版本0更高的版本,这基本上和不指定版本号的效果是一样的。

使用本地文件夹内的依赖库

如果你想建立一个本地依赖库和项目之间的关系,即项目依赖本地文件夹的某个依赖库,可以用关键字path

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

使用podspec更新依赖库

使用仓库的master分支:

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

使用仓库中其他的分支:

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

使用指定tag的分支:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'

或者使用指定commit号的版本:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'

使用path将把本地文件夹作为pod依赖库的源,并且将会直接从给定的文件夹中把pod依赖库链接进pod项目。这意味着我们对这个本地文件夹的编辑与修改将会被pod直接更新。

source 'URL' : 指定镜像仓库的源
platform : ios, '6.0' : 指定所支持系统和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace '项目空间名': 指定项目空间名
xcodeproj '工程文件名':指定xcodeproj工程文件名

~ > : 从指定版本到倒数第二位版本号升1为止,比如 '~> 1.2.1'是指 1.2.1 <= 版本 < 1.3.0。'~>1.2'是指1.2<= 版本 < 2.0

举例

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的版本  
pod 'AFNetworking', '~>0.1'     //使用大于等于0.1但小于1.0的版本  
pod 'AFNetworking', '~>0'     //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本  

CocoaPods pod install/pod update更新慢的问题

/默认执行pod install 或者 pod update命令,会更新远程cocopodsde spec库。所以导致命令执行的比较慢,我们可以采用以下命令来提高更新速度,不更新CocoaPods的spec仓库直接install/update。
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update

Podfile和Target

Podfile本质上是用来描述Xcode工程中的targets用的。如果我们不显式指定Podfile对应的target,CocoaPods会创建一个名称为default的隐式target,会和我们工程中的第一个target相对应。换句话说,如果在Podfile中没有指定target,那么只有工程里的第一个target能够使用Podfile中描述的Pods依赖库。

项目存在多Target情况

项目存在多个Target的时候,需要配置Podfile文件来支持新增加的Target,否则只支持项目默认建立时生成的Target:

a.多个Target使用相同的pods依赖库

a、默认新建的项目只有一个target,但是我们可以给项目天阿基额外的target。如果项目中存在多个target,且两个Target所依赖的的第三方库完全相同,则可以使用
link_with关键字,将Podfile写成如下方式:

link_with 'CocoaPodsTest', 'Second'  
platform :ios  
platform :ios, ‘9.0’    
pod 'AFNetworking', '~> 2.0'  

link_with 'CocoaPodsTest', 'Second'  
platform :ios    
pod 'Reachability',  '~> 3.0.0'    
pod 'SBJson', '~> 4.0.0'    
    
platform :ios, '7.0'    
pod 'AFNetworking', '~> 2.0'   

如果你按照上面的写法编辑Podfile,然后执行pod undate 或pod install,你会发现以下的错误:

Snip20161204_1.png

意思是link_with关键字已经过期,现在不在支持,我们需要用target blocks来代替link_with。查看官方文档,如下:
Snip20161204_3.png

所以,我们可以通过abstract_target和target继承的方式代替link_with.

b.多个的Target需要不同的依赖库

如果不同的target使用不同的依赖库,则可以:

platform :ios  
target :'Test' do  
pod 'Reachability'  
pod 'SBJson'     
pod 'AFNetworking'   
end    
    
target :'Second' do  
pod 'OpenUDID'   
end  

inhibit_all_warnings!的作用

用于屏蔽cocoapods库里面的所有警告。


Snip20161204_2.png

这个特性也能在子target里面定义,如果你想屏蔽某pod里面的警告也是可以的:

pod 'SSZipArchive', :inhibit_warnings => true

use_frameworks!的作用

在pods中用frameworks替代静态库。
另,一般开发swift项目时,我们会在podfile中添加这一句。

podspec文件

后缀名为podspec(cocoapods specification)的文件是cocoapods的说明文件,该文件为Pods依赖库的描述文件,每个Pods依赖库必须有且仅有那么一个描述文件。该文件包括依赖库的名字、版本、描述、license、author、source、platform等信息。

什么是Podfile.lock?

这是 CocoaPods 创建的最重要的文件之一。它记录了需要被安装的 pod 的每个已安装的版本。如果你想知道已安装的 pod 是哪个版本,可以查看这个文件。推荐将 Podfile.lock 文件加入到版本控制中,这有助于整个团队的一致性。Objc中国
Podfile.lock文件最大得用处在于多人开发。当团队中的某个人执行完pod install命令后,生成的Podfile.lock文件就记录下了当时最新Pods依赖库的版本,这时团队中的其它人check下来这份包含Podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的Pods依赖库的版本就和最开始用户获取到的版本一致。如果没有Podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的依赖库,这就有可能造成同一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难!在这种情况下,如果团队想使用当前最新版本的依赖库,有两种方案:

  • 1.更改Podfile,使其指向最新版本的依赖库;
  • 2.执行pod update命令;

当执行pod install 命令时,首先会根据Podfile文件指定的内容,安装依赖库,如果有Podfile.lock文件而且对应的Podfile文件未被修改,则会根据Podfile.lock文件指定的版本安装。
每次更新了Podfile文件时,都需要重新执行pod install命令,以便重新安装Pods依赖库。
当执行pod update命令时,如果Podfile中指定的依赖库版本不是写死的,当对应的依赖库有了更新,无论有没有Podfile.lock文件,都会去获取Podfile文件描述的允许获取到的最新依赖库版本。

文/VV木公子(简书作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载请联系作者获得授权,并注明出处,所有打赏均归本人所有!

如果您是iOS开发者,或者对本篇文章感兴趣,请关注本人,后续会更新更多相关文章!敬请期待!

如果有技术问题,欢迎加入QQ群进行交流,群聊号码:194236752。

参考链接:
Podfile语法参考(译)
Cocoapods的Podfile常见语法总结
CocoaPods详解之----使用篇
CocoaPods详解之----进阶篇
CocoaPods详解之----制作篇
CocoaPods安装和使用教程以及一些常见问题
如何制作自己的Pod库
The Podfile(英)
Podfile语法参考(译)
(实验)Podfile的target与link_with
Podfile Syntax Reference(英)
Podfile Syntax Reference(英)

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

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 20,482评论 0 39
  • CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 CocoaPods,...
    宝山潇洒哥阅读 3,916评论 0 1
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,870评论 0 7
  • 什么是cocoapods CocoaPods是一个用来帮助我们管理第三方依赖库的工具。它可以解决库与库之间的依赖关...
    VV木公子阅读 6,993评论 0 7
  • 这是一篇关于策略的文章。 序 攻与守 来自得到app《何帆大局观》专栏精选--“7节极简地缘政治课”第六章 我们先...
    胧一阅读 668评论 0 1