你真的會寫Podfile嗎

前言

iOS開發會常常用到cocoapods管理第三方,簡單、方便、高效。如何集成cocoapods在cocoapods官網Podfile語法說明會有詳細介紹,本文我想介紹的是關於集成cocoapods時會用到的一個文件Podfile文件。html

什麼是Podfile

Podfile是一個規範,描述了一個或多個一套工程目標的依賴項ios

一個簡單寫法:git

target 'MyApp' do
  pod 'AFNetworking', '~> 3.0'
end
複製代碼

這是最簡單最廣泛的寫法,針對MyApp這個target引入AFNetworking這個依賴庫,也是你們平時用的最多的一種方式。github

下面是個更復雜的一個例子:bash

# 下面兩行是指明依賴庫的來源地址
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
複製代碼

主配置

install! 這個命令是cocoapods聲明的一個安裝命令,用於安裝引入Podfile裏面的依賴庫。 install! 這個命令還有一些我的設置選項,例如:ide

install! 'cocoapods', 
  :deterministic_uuids => false, 
  :integrate_targets => false
複製代碼

還支持其餘的選項:post

Supported Keys:

:clean

:deduplicate_targets

:deterministic_uuids

:integrate_targets

:lock_pod_sources

:share_schemes_for_development_pods
複製代碼

關於以上的配置,官網也沒有一個確切的說明,覺得咱們只需用系統默認便可。學習

Dependencies(依賴項)

Podfile指定每一個target的依賴項ui

  • pod指定特定的依賴庫
  • podspec能夠提供一個API來建立podspecs
  • target經過target指定依賴範圍

pod - 指定項目的依賴項

依賴項規範是由Pod的名稱和一個可選的版本組合一塊兒。 1> 若是後面不寫依賴庫的具體版本號,那麼cocoapods會默認選取最新版本。spa

pod 'SSZipArchive'
複製代碼

2> 若是你想要特定的依賴庫的版本,就須要在後面寫上具體版本號,格式:

pod 'Objection', '0.9'
複製代碼

3> 也能夠指定版本範圍

  • > 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,而且始終是你指定範圍內的最新版本。

關於版本形式規範詳情請參考下面連接: 語義化版本

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文件也應該被放在這個文件夾當中

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引入

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' do 
  pod 'SSZipArchive'
end
複製代碼
  • 定義一個ZipApptarget僅引入SSZipArchive庫,定義ZipAppTeststarget 引入Nimble的同時也會繼承ZipApptarget裏面的SSZipArchive
target 'ZipApp' do 
  pod 'SSZipArchive' 
  target 'ZipAppTests' do
    inherit! :search_paths 
    pod 'Nimble' 
  end
end
複製代碼
  • 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
複製代碼

抽象target

定義一個新的抽象目標,它能夠方便的用於目標依賴繼承。

  • 簡單寫法
abstract_target 'Networking' do
    pod 'AlamoFire' 
    target 'Networking App 1' 
    target 'Networking App 2'
end
複製代碼
  • 定義一種abstract_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
複製代碼

abstract! 和 inherit!

  • abstract! 指示當前的target是抽象的,所以不會直接連接Xcode target。
  • inherit! 設置當前target的繼承模式。例如:
target 'App' do
   target 'AppTests' do
      inherit! :search_paths 
   end
end
複製代碼

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: Specifying the user project

# MyGPSApp這個target引入的庫只能在FastGPS工程中引用
target 'MyGPSApp' do 
    project 'FastGPS' 
    ...
end
# 原理同上
target 'MyNotesApp' do 
    project 'FastNotes' 
    ...
end
複製代碼

使用自定義的編譯配置

project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
複製代碼

inhibit_all_warnings!(強迫症者的福音)

inhibit_all_warnings! 屏蔽全部來自於cocoapods依賴庫的警告。你能夠全局定義,也能在子target裏面定義,也能夠指定某一個庫:

# 隱藏SSZipArchive的警告而不隱藏ShowTVAuth的警告
pod 'SSZipArchive', :inhibit_warnings => true
pod 'ShowTVAuth', :inhibit_warnings => false
複製代碼

use_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_install do |installer| 
    # 作一些安裝以前的更改
end
複製代碼

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
複製代碼

def

咱們還能夠經過def命令來聲明一個pod集:

def 'CustomPods'
   pod 'IQKeyboardManagerSwift'
end 
 ```

而後,咱們就能夠在須要引入的target處引入:
複製代碼

target 'MyTarget' do    CustomPods end

這麼寫的好處是:若是有多個target,而不一樣target之間並不全包含,那麼能夠經過這種方式來分開引入。
## 總結
本文主要介紹Podfile文件的一些要素,也是本身的一個學習記錄過程,因爲本人水平有限,不免會有紕漏之處,還望指出。
複製代碼
相關文章
相關標籤/搜索