Cocoapods整理(三)——編寫podspec文件

Cocoapods整理(三)——編寫podspec文件


前言

    看到pod上各類形形色色的三方庫,本身確定也會想要建立一個分享一下。作組件化時也會想要將項目拆分紅一個一個的私有庫。而使用pod管理三方庫或私有庫最重要的就是要學會如何寫podsepc文件。html

如下均以我本身寫的一個私有庫ZCPKit去介紹。ios


目錄

  • 如何建立podspec文件
  • 如何編寫podspec文件
  • 如何實現目錄分層
  • 如何校驗podspec文件
  • 別人寫的例子
  • 補充 校驗時出現的一些問題

1.如何建立podspec文件

建立podspec文件只須要一行命令,在你本身的三方庫的根目錄下輸入下面的命令:c++

pod spec create XXXKit

例如我本身的ZCPKitgit

clipboard.png

而後在項目目錄下將會生成一個podspec文件github

clipboard.png

2.如何編寫podspec文件

咱們先來打開ZCPKit.podspec文件看看裏面的內容。基本都是針對ZCPKit的描述和介紹。sql

clipboard.png

一些經常使用的信息介紹:segmentfault

name:框架名
version:當前版本(注意,是當前版本,假如你後續更新了新版本,須要修改此處)
summary:簡要描述,在pod search ZCPKit的時候會顯示該信息。
description:詳細描述
homepage:頁面連接
license:開源協議
author:做者
source:源碼git地址
platform:支持最低ios版本
source_files:源文件(能夠包含.h和.m)
public_header_files:頭文件(.h文件)
resources:資源文件(配置的文件都會被放到mainBundle中)
resource_bundles:資源文件(配置的文件會放到你本身指定的bundle中)
frameworks:依賴的系統框架
vendored_frameworks:依賴的非系統框架
libraries:依賴的系統庫
vendored_libraries:依賴的非系統的靜態庫
dependency:依賴的三方庫

上面列舉的信息大部分來自pod默認生成的podspec文件中的給的,其中須要重點注意標識黑體的這幾個信息。xcode

你在三方庫中看到的那些文件都是經過這些配置來肯定的。當pod install引入三方庫時,只會引入你在podspec中配置的那些文件。框架

下面我會舉例說明該如何寫podsepc中的每項配置。
clipboard.pngide

目錄結構以下

ZCPKit
┗━━━━Classes
     ┗━━━━ZCPKit.h
     ┗━━━━ZCPKit.m
┗━━━━Frameworks
     ┗━━━━MyFramework.framework
┗━━━━Libraries
     ┗━━━━libZCPKit.a
┗━━━━Resources
     ┗━━━━MyRes.bundle

如圖所示的目錄結構,每一個配置項的寫法以下:

source_files:配置三方庫的源文件(.h或.m文件)

寫法:
source_files = 'Classes/ZCPKit.{h,m}' // 直接指定文件名
或:
source_files = 'Classes/*.{h,m}' // Classes文件夾下的全部匹配文件
source_files = 'Classes/**/*.{h,m}' // Classes全部路徑下的全部匹配文件

public_header_files:配置公有的頭文件(.h文件)

寫法:
source_files = 'Classes/ZCPKit.h' // 直接指定文件名
或:
source_files = 'Classes/*.h' // Classes文件夾下的全部匹配文件
source_files = 'Classes/**/*.h' // Classes全部路徑下的全部匹配文件

vendored_frameworks:配置須要引用的非系統框架(**/*的寫法後面再也不贅述

寫法:
vendored_frameworks = 'Frameworks/MyFramework.framework'

frameworks:配置依賴的系統框架

寫法:
frameworks = 'AVFoundation', 'CoreGraphics', 'Security', 'SystemConfiguration'

vendored_libraries:配置須要引用的非系統靜態庫(要注意,這裏的.a靜態庫名字必需要帶lib前綴,若是引用的靜態庫名字沒lib前綴會致使編譯報錯,只須要重命名加上便可

寫法:
vendored_libraries = 'Frameworks/libZCPKit.a'

libraries:配置依賴的系統庫(要注意,這裏的寫法須要忽略lib前綴

寫法:
libraries = 'c++', 'sqlite3', 'stdc++.6.0.9', 'z'

resources:配置資源文件(.bundle,.png,.txt等資源文件,這些資源文件會被放到mainBundle中,要注意避免發生命名重複的問題

寫法:
resources = 'Resources/MyRes.bundle'

resource_bundles:配置指定bundle的資源文件(能夠解決resources致使的命名衝突問題

寫法:
resource_bundles = {
    'ZCPKitBundle' => ['Resources/MyRes.bundle'],
}

dependency:依賴的三方庫,pod庫或者能夠是自身的subspec

寫法:
dependency 'AFNetworking', '~>3.1.0' // pod三方庫
dependency 'Util' // 自身的subspec
或
dependency 'AFNetworking'

附上官網連接,能夠去看一看:specs-and-specs-repo
關於更詳細的podspec文件寫法,能夠看這篇文章:Podspec語法參考 v1.2.0.beta.1
關於資源文件更詳細的寫法,能夠看這篇文章:給 Pod 添加資源文件

3.如何實現目錄分層

使用subspec來實現目錄分層。
目錄分層的好處:

  • 目錄分層,結構清晰;
  • 使用pod引入一個三方庫時,能夠只引入一個subspec而不用將整個三方庫引入。

例如AFNetworking:
clipboard.png

下面舉例說明,如圖所示的目錄結構:
clipboard.png

ZCPKit
┗━━━━Classes
     ┗━━━━ZCPKit.h
     ┗━━━━ZCPRouter
          ┗━━━━ZCPRouter.h
          ┗━━━━ZCPRouter.m
     ┗━━━━ZCPUtil
          ┗━━━━ZCPUtil.h
          ┗━━━━ZCPUtil.m

寫法以下:
clipboard.png

效果:
clipboard.png

若是想有多層的目錄結構還能夠繼續嵌套下去。

有幾個須要注意的地方:

1.層級不能出現循環依賴。

  • 好比類ZCPUtil.h中 #import "ZCPRouter.h",同時ZCPRouter.h中 #import "ZCPUtil.h"。這樣當寫podspec時就須要在Util層級中寫dependency 'ZCPKit/Router',在Router層級中寫dependency 'ZCPKit/Util'。如此便存在Router與Util層級之間的循環依賴。出現循環依賴時,三方庫是沒法成功提交到repo上的,會報依賴錯誤。解決辦法是,層級間要儘可能解耦。

2.分層的層級不要太多,層級不要太深。

  • 爲了不出現上述的循環依賴錯誤。

3.source_files使用的是真實的物理路徑,而dependency依賴其餘層級時使用的是層級路徑,不是真實的物理路徑

  • 例如:ZCPUtil.h文件的真實路徑是:ZCPKit/Framework/Util,而Util層級是屬於ZCPKit層級下的一個子subspec,因此當寫Router層級依賴Util層級時要寫:dependency 'ZCPKit/Util'而不是dependency 'ZCPKit/Framework/Util'

4.如何校驗podspec文件

在podspec寫好以後咱們須要驗證一下編寫的內容是否有誤。能夠在命令行的三方庫當前路徑下使用下面的命令:

pod lib lint (從本地驗證你的pod可否經過驗證)
pod spec lint (從本地和遠程驗證你的pod可否經過驗證)

pod lib lint --verbose (加--verbose能夠顯示詳細的檢測過程,出錯時會顯示詳細的錯誤信息)
pod lib lint --allow-warnings (容許警告,用來解決因爲代碼中存在警告致使不能經過校驗的問題)
pod lib lint --help (查看全部可選參數,可選參數能夠加多個)

咱們目前只是在本地寫的三方庫,因此只須要使用pod lib lint驗證便可(這個過程會較爲費時,須要稍微等待)。

clipboard.png

我本身加了個循環依賴的錯誤而後再從新檢測一下試試,能夠看到檢測到了錯誤(發現有錯誤的時候,建議用加--verbose的命令看詳細錯誤信息):

clipboard.png

clipboard.png

須要注意的:
在檢測的時候會很常常會出現各類亂七八糟的錯誤,在文件多的狀況下不太容易一次經過,而且即便你的代碼在Xcode中編譯經過了,可是也仍是會出現不少錯誤。因此你須要儘可能去注意下面的幾個問題:

1.當代碼中存在警告時要記得使用--allow-warnings參數。

2.若是引入的文件或分好的層級須要依賴系統庫或三方庫,要記得使用上面介紹的libararies,frameworks等屬性。

3.若是你的三方庫是在一個xcode項目中編寫調試,那麼儘可能不要用pch。

  • 由於不少類之間的小依賴會被pch給遮掩過去,這會致使在校驗時出現大量錯誤。

4.若是想要分層,那麼儘可能解耦使模塊可以單獨存在。

  • 緣由是當分層較多層級較深時,極可能產生循環依賴的問題。

5.其餘

若是想要了解一些實實在在的例子,你能夠把別人的三方庫下載下來,podspec文件通常會跟其放在一塊兒,這樣就能參考別人的podspec文件是怎麼寫的。好比AFNetworking:

1>用pod搜索AFNetworking
clipboard.png

2>進入AFNetworking的源碼地址
clipboard.png

3>下載並查看

clipboard.png

6.補充 校驗時出現的一些問題

1.不支持i386編譯的庫沒法經過pod lib lint的問題()
解決pod lib lint/repo push不支持i386編譯&只能真機運行的庫

https://github.com/CocoaPods/...

2.在A私有庫中引入了B私有庫,致使pod lib lint不經過的問題

在調用命令時須要添加B私有庫所在的repo源地址。

pod lib lint <文件名>.podspec --sources='<私有庫所在repo的source>,https://github.com/CocoaPods/Specs.git'

clipboard.png

3.報錯 ··· error: include of non-modular header inside framework module ··· [-Werror,-Wnon-modular-include-in-framework-module]

clipboard.png

解決辦法:在pod lib lint 或者 pod spec lint 以及 pod repo push ....時候加上 --use-libraries

參考:COCOAPODS建立私有PODS


後續

Cocoapods整理(一)——安裝Cocoapods
Cocoapods整理(二)——使用Cocoapods
Cocoapods整理(四)——搭建Cocoapods私有庫環境

本篇文章的私有庫demo:ZCPKit

我的的repo:zcprepo
私有庫:ZCPKit


參考文章

給 Pod 添加資源文件
解決pod lib lint/repo push不支持i386編譯&只能真機運行的庫
Podspec語法參考 v1.2.0.beta.1

相關文章
相關標籤/搜索