cocoapods

http://events.jianshu.io/p/8c2a54f61f2d

一:前言

iOS开发会经常用到cocoapods管理第三方,简单、方便、高效。如何集成cocoapods在cocoapods官网和Podfile语法说明会有详细介绍,本想介绍的是关于集成cocoapods时会用到的一个文件Podfile文件。

二: 什么是Podfile

Podfile是一个规范,描述了一个或多个一套工程目标的依赖项。

1,一个简单写法:

target'MyApp'dopod'AFNetworking','~> 3.0'end

这是最简单最普遍的写法,针对MyApp这个target引入AFNetworking这个依赖库,也是大家平时用的最多的一种方式。

2,下面是个更复杂的一个例子:

下面两行是指明依赖库的来源地址

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

说明平台是ios,版本是9.0

platform:ios,'9.0'

忽略引入库的所有警告(强迫症者的福音啊)

inhibit_all_warnings!

针对MyApp target引入AFNetworking

针对MyAppTests target引入OCMock

target'MyApp'dopod'AFNetworking','~> 3.0'target'MyAppTests'doinherit!:search_pathspod'OCMock','~> 2.0.1'endend

这个是cocoapods的一些配置,官网并没有太详细的说明,一般采取默认就好了,也就是不写.

post_installdo|installer|installer.pods_project.targets.eachdo|target|puts target.nameendend

三:主配置

install! 这个命令是cocoapods声明的一个安装命令,用于安装引入Podfile里面的依赖库。

install! 这个命令还有一些个人设置选项,例如:

install!'cocoapods',:deterministic_uuids=>false,:integrate_targets=>false

还支持其他的选项:

SupportedKeys::clean:deduplicate_targets:deterministic_uuids:integrate_targets:lock_pod_sources:share_schemes_for_development_pods

Dependencies(依赖项)

Podfile指定每个target的依赖项

pod指定特定的依赖库

podspec可以提供一个API来创建podspecs

target通过target指定依赖范围

pod - 指定项目的依赖项

依赖项规范是由Pod的名称和一个可选的版本组合一起。

如果后面不写依赖库的具体版本号,那么cocoapods会默认选取最新版本。

pod 'SSZipArchive'

如果你想要特定的依赖库的版本,就需要在后面写上具体版本号,格式:

pod 'Objection', '0.9'

也可以指定版本范围

0.1 高于0.1版本(不包含0.1版本)的任意一个版本

= 0.1 高于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,并且始终是你指定范围内的最新版本。

关于版本形式规范详情请参考下面链接:语义化版本:https://semver.org/lang/zh-CN/

Build configurations(编译配置)

默认情况下, 依赖项会被安装在所有target的build configuration中。为了调试或者处于其他原因,依赖项只能在给定的build configuration中被启用。

下面写法指明只有在Debug和Beta模式下才有启用配置

pod'PonyDebugger',:configurations=>['Debug','Beta']

或者,可以弄白名单只指定一个build configurations。

pod'PonyDebugger',:configuration=>'Debug'

注意:默认情况下如果不指定具体生成配置,那么会包含在所有的配置中,如果你想具体指定就必须手动指明。

Subspecs

一般情况我们会通过依赖库的名称来引入,cocoapods会默认安装依赖库的所有内容。

我们也可以指定安装具体依赖库的某个子模块,例如:

仅安装QueryKit库下的Attribute模块

pod 'QueryKit/Attribute'

*  仅安装QueryKit下的Attribute和QuerySet模块

pod'QueryKit',:subspecs=>['Attribute','QuerySet']

Using the files from a local path (使用本地文件)

我们也可以指定依赖库的来源地址。如果我们想引入我们本地的一个库,可以这样写:

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

使用这个选项后,Cocoapods会将给定的文件夹认为是Pod的源,并且在工程中直接引用这些文件。这就意味着你编辑的部分可以保留在CocoaPods安装中,如果我们更新本地AFNetworking里面的代码,cocoapods也会自动更新。被引用的文件夹可以来自你喜爱的SCM,甚至当前仓库的一个git子模块注意:Pod的podspec文件也应该被放在这个文件夹当中

引用仓库根目录的podspec

有时我们需要引入依赖库指定的分支或节点,写法如下。

引入master分支(默认)

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

*  引入指定的分支

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

*  引入某个节点的代码

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

*  引入某个特殊的提交节点

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

需要特别注意的是,虽然这样将会满足任何在Pod中的依赖项通过其他Pods 但是podspec必须存在于仓库的根目录中。

从外部引入podspec引入

podspec可以从另一个源库的地址引入

pod'JSONKit',:podspec=>'https://example.com/JSONKit.podspec'

podspec

使用给定podspec文件中定义的代码库的依赖关系。如果没有传入任何参数,podspec优先使用根目录,如果是其他情况必须在后面指明。(一般使用默认设置即可)例如:

# 不指定表示使用根目录下的podspec,默认一般都会放在根目录下podspec# 如果podspec的名字与库名不一样,可以通过这样来指定podspec:name=>'QuickDialog'# 如果podspec不是在根目录下,那么可以通过:path来指定路径podspec:path=>'/Documents/PrettyKit/PrettyKit.podspec'

target

在给定的块内定义pod的target(Xcode工程中的target)和指定依赖的范围。一个target应该与Xcode工程的target有关联。默认情况下,target会包含定义在块外的依赖,除非指定不使用inherit!来继承(说的是嵌套的块里的继承问题)

*  定义一个简单target ZipApp引入SSZipArchive库

target'ZipApp'dopod'SSZipArchive'end

*  定义一个ZipApptarget仅引入SSZipArchive库,定义ZipAppTeststarget 引入Nimble的同时也会继承ZipApptarget里面的SSZipArchive库

target'ZipApp'dopod'SSZipArchive'target'ZipAppTests'doinherit!:search_pathspod'Nimble'endend

*  target块中嵌套多个子块

target'ShowsApp'do# ShowsApp 仅仅引入ShowsKitpod'ShowsKit'# 引入 ShowsKit 和 ShowTVAuthtarget'ShowsTV'dopod'ShowTVAuth'end# 引入了Specta和Expecta以及ShowsKittarget'ShowsTests'doinherit!:search_pathspod'Specta'pod'Expecta'endend

抽象target

定义一个新的抽象目标,它可以方便的用于目标依赖继承。

简单写法

abstract_target'Networking'dopod'AlamoFire'target'Networking App 1'target'Networking App 2'end

定义一种abstract_target包含多个target

# 注意:这是个抽象的target也就是说在工程中并没有这个target引入ShowsKitabstract_target'Shows'dopod'ShowsKit'# ShowsiOS target会引入ShowWebAuth库以及继承自Shows的ShowsKit库target'ShowsiOS'dopod'ShowWebAuth'end# ShowsTV target会引入ShowTVAuth库以及继承自Shows的ShowsKit库target'ShowsTV'dopod'ShowTVAuth'end# ShowsTests target引入了Specta和Expecta库,并且指明继承Shows,所以也会引入ShowsKittarget'ShowsTests'doinherit!:search_pathspod'Specta'pod'Expecta'endend

abstract! 和 inherit!

abstract! 指示当前的target是抽象的,因此不会直接链接Xcode target。

inherit! 设置当前target的继承模式。例如:

target'App'dotarget'AppTests'doinherit!:search_pathsendend

Target configuration (目标项配置)

使用target 配置来控制的cocoapods生成project。开始时详细说明您正在使用什么平台上。工程文件里允许您具体说明哪些项目的链接。

platform

platform用于指定应建立的静态库的平台。CocoaPods提供了默认的平台版本配置:

*  iOS->4.3    *  OS X->10.6    *  tvOS->9.0    *  watchOS->2.0        *

如果部署目标需要iOS < 4.3,armv6体系结构将被添加到ARCHS。

例如:

#指定具体平台和版本platform:ios,'4.0'platform:ios

project

如果没有显示的project被指定,那么会默认使用target的父target指定的project作为目标。如果如果没有任何一个target指定目标,那么就会使用和Podefile在同一目录下的project。同样也能够指定是否这些设置在release或者debug模式下生效。为了做到这一点,你必须指定一个名字和:release/:debuge关联起来

Examples:

# MyGPSApp这个target引入的库只能在FastGPS工程中引用

target'MyGPSApp'doproject'FastGPS'...end

# 原理同上

target'MyNotesApp'doproject'FastNotes'...end

# 使用自定义的编译配置

project'TestProject','Mac App Store'=>:release,'Test'=>:debuginhibit_all_warnings!(强迫症者的福音)

### inhibit_all_warnings!

屏蔽所有来自于cocoapods依赖库的警告。你可以全局定义,也能在子target里面定义,也可以指定某一个库:

# 隐藏SSZipArchive的警告而不隐藏ShowTVAuth的警告pod'SSZipArchive',:inhibit_warnings=>truepod'ShowTVAuth',:inhibit_warnings=>falseuse_frameworks!

通过指定use_frameworks!要求生成的是framework而不是静态库。

如果使用use_frameworks!命令会在Pods工程下的Frameworks目录下生成依赖库的framework

如果不使用use_frameworks!命令会在Pods工程下的Products目录下生成.a的静态库

Workspace

默认情况下,我们不需要指定,直接使用与Podfile所在目录的工程名一样就可以了。如果要指定另外的名称,而不是使用工程的名称,可以这样指定:定:

workspace 'MyWorkspace'

Source

source是指定pod的来源。如果不指定source,默认是使用CocoaPods官方的source。(建议使用默认设置)

CocoaPods Master Repository# 使用其他来源地址source 'https://github.com/artsy/Specs.git'# 使用官方默认地址(默认)source 'https://github.com/CocoaPods/Specs.git'

Hooks

Podfile提供了hook机制,它将在安装过程中调用。hook是全局性的,不存储于每个target中。

Plugin

指定应在安装期间使用的插件。使用此方法指定应在安装期间使用的插件,以及当它被调用时,应传递给插件的选项。例如:

指定在安装期间使用cocoapods-keys和slather这两个插件plugin'cocoapods-keys',:keyring=>'Eidolon'plugin'slather'pre_install

当我们下载完成,但是还没有安装之时,可以使用hook机制通过pre_install指定要做更改,更改完之后进入安装阶段。

格式如下:

pre_installdo|installer|# 做一些安装之前的更改endpost_install

当我们安装完成,但是生成的工程还没有写入磁盘之时,我们可以指定要执行的操作。

比如,我们可以在写入磁盘之前,修改一些工程的配置:

post_installdo|installer|installer.pods_project.targets.eachdo|target|target.build_configurations.eachdo|config|config.build_settings['GCC_ENABLE_OBJC_GC']='supported'endendenddef

我们还可以通过def命令来声明一个pod集:

def'CustomPods'pod'IQKeyboardManagerSwift'end

然后,我们就可以在需要引入的target处引入:

target'MyTarget'doCustomPodsend

这么写的好处是:如果有多个target,而不同target之间并不全包含,那么可以通过这种方式来分开引入。

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