podfile的用法

什么是Podfile

Podfile是一个规范,描述了一个或多个一套工程目标的依赖项,CocoaPods管理iOS组件库

各种参数配置含义

一、Install! :适用于整个podfile文件

1.指明了cocoapods安装podfile使用的安装方法和配置项
install! 'cocoapods', //第一个参数是安装方法,剩下的参数是选择项,现在安装方法只支持’cocoapods’
 :deterministic_uuids => false, 
 :integrate_targets => false 
还有以下配置参数
 :clean
 :deduplicate_targets
 :deterministic_uuids
 :integrate_targets
 :lock_pod_sources
 :warn_for_multiple_pod_sources
 :share_schemes_for_development_pods
2.source: 默认被指定的依赖项会在全局级别的指定源中匹配搜索。可以为特依赖关系指定源
 //指定特定源中搜索,并忽略任何全局源*
 pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'

这个source为repo的url,如何得到这个url呢,在终端中pod repo list 查看出对应的repo中URL

3.target:
target: 在制定的快内定义pod target和指定的依赖范围吗。target应该与Xcode的target相符。默认情况下,target包含定义在块外的依赖,除非指定不使用inherit!来继承
 //a. target A 引入AFN库
 target ‘A'do
     pod 'AFN'
 end

 //b.定义’A’ 引入AFN库,定义’B’target引入’SSZip’库,同时会继承’A’target 中的’AFN’库
     target ‘A’ do
         pod ‘AFN’
         target ‘B’ do
             inherit! :search_paths
             pod 'SSZip'
         end
     end
  // c.  Target 多层嵌套
 target 'ShowsApp’ do
      # ShowsApp 仅仅引入ShowsKit 
      pod 'ShowsKit’ 
         # 引入 ShowsKit 和 ShowTVAuth
         target 'ShowsTV' do 
             pod 'ShowTVAuth’ 
         end
         # 引入了Specta和Expecta以及ShowsKit
         target 'ShowsTests' do 
             inherit! :search_paths 
             pod 'Specta’ 
             pod 'Expecta’ 
          end 
     end
 end         
4.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

意义:可以使用抽象类 来统一 需要继承的pod。

5.abstract! 指定当前target是抽象target
 target ‘A’ do
     abstract!
 end
6.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

7.platform :用于指明应建立的静态库的平台。

 cocoapods默认指定的平台配置:
     · iOS->4.3
     · OS X->10.6
     · tvOS->9.0
     · watchOS->2.0
 如果部署target需要iOS<4.3,armv6架构讲被添加到ARCHS
     使用:
     
 #指定具体平台和版本
 platform :ios, ‘4.0'
 platform :ios

8.Inhibit_all_warnings! :忽略cocoapods依赖库的警告。可以全局 定义,也可以定义在子target中,也可以指定某个库

 pod 'SSZipArchive', :inhibit_warnings => true
 pod 'SSZipArchive', :inhibit_warnings => false

9.use_frameworks! :通过指定 use_frameworks! 要求生成的是framework而不是静态库,swift没有静态库。

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

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

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

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

10.source

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

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

主要:如果使用自己的私有库,需要使用source指定到私有库地址

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

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

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

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

  pre_install do |installer| 
      # 做一些安装之前的更改 
 end

3.post_install:当我们安装完成,但是生成的工程还没有写入磁盘之时,我们可以指定要执行的操作。 比如,我们可以在写入磁盘之前,修改一些工程的配置:

 post_install do |installer| installer.pods_project.targets.each do |target| 
     target.build_configurations.each do |config| 
          config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported’ 
         end
      end
  end 

12.def命令来声明一个pod集

def univeral_pods
    pod 'IQKeyboardManagerSwift’ 
end 
#然后,我们就可以在需要引入的target处引入
target 'MyTarget' do 
univeral_pods 
end 

一个简单写法:

target 'MyApp' do
  pod 'AFNetworking', '~> 3.0'
end

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

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

# 下面两行是指明依赖库的来源地址
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' do 
    pod 'AFNetworking', '~> 3.0' 
    target 'MyAppTests' do
       inherit! :search_paths 
       pod 'OCMock', '~> 2.0.1' 
    end
end
# 这个是cocoapods的一些配置,官网并没有太详细的说明,一般采取默认就好了,也就是不写.
post_install do |installer|       
   installer.pods_project.targets.each do |target| 
     puts target.name 
   end
end

Build configurations(编译配置)

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

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

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

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

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

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

Subspecs

subspecs的podspec文件中的写法:


屏幕快照 2019-12-23 上午9.38.40.png

一般情况我们会通过依赖库的名称来引入,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文件也应该被放在这个文件夹当中

From a podspec in the root of a library repository (引用仓库根目录的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引入

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'
Podfile.lock文件:

当团队中的某个人执行完pod install命令后,生成的Podfile.lock文件就记录下了当时最新Pods依赖库的版本,这时团队中的其它人check下来这份包含Podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的Pods依赖库的版本就和最开始用户获取到的版本一致。如果没有Podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的SBJson,这就有可能造成同一个团队使用的依赖库版本不一致, 这对团队协作来说绝对是个灾难!

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

推荐阅读更多精彩内容