Podfile看我就够了

2019-05-07  本文已影响0人  CharmecarWang

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'

安装制定版本的依赖库。它还支持以下操作符:

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:

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
上一篇 下一篇

猜你喜欢

热点阅读