欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Podfile看我就够了

程序员文章站 2022-07-13 11:31:17
...

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