CocoPods之.podfile語法參考


一,前言

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

二, 什么是Podfile

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

  • 一個簡單寫法:
    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

三,主配置

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

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

  還支持其他的選項:

Supported Keys: :clean :deduplicate_targets :deterministic_uuids :integrate_targets :lock_pod_sources :share_schemes_for_development_pods
  • Dependencies(依賴項)

    Podfile指定每個target的依賴項

    • pod指定特定的依賴庫

    • podspec可以提供一個API來創建podspecs

    • target通過target指定依賴范圍

    pod - 指定項目的依賴項

    依賴項規范是由Pod的名稱和一個可選的版本組合一起。

    • 如果后面不寫依賴庫的具體版本號,那么cocoapods會默認選取最新版本。

      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版本(包含0.1版本)的任意一個

      • ~> 0.1.2 版本 0.1.2的版本到0.2 ,不包括0.2。這個基於你指定的版本號的最后一個部分。這個例子等效於>= 0.1.2並且 <0.2.0,並且始終是你指定范圍內的最新版本。

      • 關於版本形式規范詳情請參考下面鏈接:
        語義化版本: https://semver.org/lang/zh-CN/
  • 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文件也應該被放在這個文件夾當中

  • 引用倉庫根目錄的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:

      # 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之間並不全包含,那么可以通過這種方式來分開引入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM