Podfile看我就够了

Podfile


Podfile文件是一个描述target的依赖库规范。

一个简单的Podfile文件是这样的:

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

也可以更复杂:

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
  pod 'ObjectiveSugar', '~> 0.5'

  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

install!


通过install!可以指定安装依赖库的一些选项。
基本语法:
install! + 安装语法 + 安装选项
例如:

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

目前安装方法只有cocoapods这个方法。

安装选项

:clean
安装的时候是否需要删除依赖库未用到的文件。
默认时true

deduplicate_targets
当多个target对一个依赖库有不同的需求时,是否要避免重复。一般是通过添加后缀来避免重复。
默认是true

例如:

target 'MyTargetA' do
  pod 'MyPod/SubA'
end

target 'MyTargetB' do
  pod 'MyPod'
end

MyTargetA和MyTargetB都引用MyPod库,如果设置成true,就会生成MyPodMyPod-SubA

:deterministic_uuids
创建pods项目时是否生成准确的UUID。默认为true。
但是我们习惯设置为false

:integrate_targets
是否要将安装的依赖库集成到用户的项目中。默认是true。
如果设置成false,依赖库会放到Pods/,而不会放到用户项目中。

小结

对于以上这些选项,我们一般使用默认就行了。

Dependencies


Pod

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.2:大于等于版本0.1.2到0.2.0,但是不包含0.2.0
  • ~> 0.1.3-beta.0:安装0.1.3的测试版本或release版本
Build configurations

默认情况下,依赖库是安装在所有配置环境下的(如果你配置了FAT、UAT环境)。
但是我们可以指定安装在某些(DEBUFG、UAT)配置环境下:

pod 'PonyDebugger', :configurations => ['DEBUFG', 'UAT']

也可以指定只安装在DEBUFG环境下

pod 'PonyDebugger', :configuration => 'DEBUFG'
Modular Headers

use_modular_headers

Source

指定安装源

指定某一个依赖库的安装源

pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'

也可以全局指定:

source 'http://gitlab.hellokitty.cn/iOSPrivateSpecsRepo.git'
Subspecs

子模块,我们可以通过以下方式安装子模块

安装QueryKit下的Attribute模块。

pod 'QueryKit/Attribute'

安装QueryKit下的Attribute模块和QuerySet模块。

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

安装某个依赖库下的单元测试

pod 'AFNetworking', :testspecs => ['UnitTests', 'SomeOtherTests']
从本地库Pod
pod 'AFNetworking', :path => '~/Documents/AFNetworking'

它会将Documents下的AFNetworking link到pod项目中。

从远程仓库pod
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

从AFNetworking远程仓库pod,当然我们还可以指定它的分支:

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

指定tag:

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

指定commit:

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
从存储库外的其他源pod
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'

通过指定一个http的podspec

podspec

依赖库的配置文件。
安装依赖库的时候,它是从podspec指定的地址去pod的。如果没有参数,则使用podfile根目录中的第一个podspec。

podspec :name => 'QuickDialog'

根据podspec的name去pod。

podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'

根据本地的podspec去pod。

target

定义一个CocoaPods目标,它将要安装的依赖库限制在一个块中。这个target要跟Xcode的target一致。默认情况下,target包含块以外的所有依赖库,除非指定了inherit!.
定义一个target

target 'ZipApp' do
  pod 'SSZipArchive'
end

通过inherit!继承的方式来安装SSZipArchive

target 'ZipApp' do
  pod 'SSZipArchive'

  target 'ZipAppTests' do
    inherit! :search_paths
    pod 'Nimble'
  end
end

ShowsTests安装了Specta和Expecta库,同时还继承了父target的ShowsKit

target 'ShowsApp' do
  pod 'ShowsKit'

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

  # Has its own copy of Specta + Expecta
  # and has access to ShowsKit via the app
  # that the test target is bundled into

  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end

script_phase

给target添加脚本,一个目标可以包含多个脚本,执行顺序按添加顺序执行。
指定脚本名称HelloWorldScript,脚本是打印出hello world

script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World"'

指定脚本名称HelloWorldScript,脚本是打印出hello world,并指出shell_path

script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'

abstract_target

定义一个抽象的target方便子target继承依赖

abstract_target 'Networking' do
  pod 'AlamoFire'

  target 'Networking App 1'
  target 'Networking App 2'
end

定义抽象Networking,Networking App 1和Networking App 2,都安装了依赖AlamoFire

定义一个依赖包含多个target

# Note: There are no targets called "Shows" in any of this workspace's Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'

  # The target ShowsiOS has its own copy of ShowsKit (inherited) + ShowWebAuth (added here)
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # The target ShowsTV has its own copy of ShowsKit (inherited) + ShowTVAuth (added here)
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end

  # Our tests target has its own copy of
  # our testing frameworks, and has access
  # to ShowsKit as well because it is
  # a child of the abstract target 'Shows'

  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end

abstract!

指明当前target是抽象的,因此不会直接链接到Xcode目标。

inherit!

它有三种可用mode:

  • :complete:所有的都继承于父target
  • :none:都不继承父target
  • :search_paths:仅仅serach path继承父target

Target configuration


platform

指定依赖库构建在哪个平台上,可以指定ios、osx、tvos、watchos

project

指定一个Xcode project,它包含pod依赖库可以链接到的target
如果没想显示指明project,就使用跟Podfile同一目录的project.

# This Target can be found in a Xcode project called `FastGPS`
target 'MyGPSApp' do
  project 'FastGPS'
  ...
end

# Same Podfile, multiple Xcodeprojects
target 'MyNotesApp' do
  project 'FastNotes'
  ...
end

还可以指定自定义的build configurations(如果配置了多个configurations)

project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug

inhibit_all_warnings!

禁止来自依赖库的警告

禁止SSZipArchive的警告

pod 'SSZipArchive', :inhibit_warnings => true

也可以全局配置

use_frameworks!

pod 的依赖库是framework而不是静态库

在Xcode9之前,swift是不支持静态库的,因此,需要是否使用某些依赖库必须要设置use_frameworks!,但是在CocoaPods 1.5.0,开发者不需要在podfile文件中
设置use_frameworks!

use_modular_headers!

对所有cocoapods静态库使用模块化头文件。
例如:
可以在pod B中引入文件A#import "A.h",cocoapods将创建构建设置以便能引入成功,但是,如果您尝试将模块映射添加到这些pods中,这样的导入将不起作用。许多年前,我们尝试自动为静态库生成模块映射。
在CocoaPods 1.5.0,可以通过设置use_modular_headers!为所有pod启用更严格的搜索路径和模块映射

不明白的话,可以看这篇文章

Hooks


pre_install

这个hook可以允许你在依赖库下载完之后但是还没安装时对其进行任何更改。

pre_install do |installer|
  # Do something fancy!
end

post_install

这个hook允许你在将生成的Xcode项目写入磁盘之前对其进行任何最后的更改,或者执行任何其他您可能想要执行的任务。

为所有的targets自定义build settings

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

supports_swift_versions

指定swift版本

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

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,466评论 0 39
  • CocoaPods操作手册 本文档介绍了啥? 为什么要使用CocoaPods? 如何安装CocoaPods? Po...
    风小钻阅读 7,523评论 1 10
  • Ruby 安装 要安装cocospods 首先需要安装ruby,可以先安装xcode,再安装macport ,最后...
    山天大畜阅读 1,840评论 0 1
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,911评论 0 7
  • 经常使用CocoaPods来管理iOS项目中的第三方库,但是我们要使用CocoaPods来管理第三方库,前提是要写...
    qitianjin阅读 1,346评论 2 0