一、Podfile & .podspec 文件
1、Podfile
1.1. 什么是 pod
簡單來說,一個 pod 就是 xcode 里面的一個 dependency:
Anyway,pod 就是第三方庫的意思。一個 pod 就是指一個第三方庫。
1.2. Podfile 有什么用
Podfile 可以理解為就是一個用 ruby 寫的腳本文件。這個文件的主要功能就和 Xcode 自帶的 Swift Packages Manager (SPM)一樣 —— 用來給自己的 iOS 項目加 dependencies 的。
像圖中的第 11 行代碼,它的意思就是在?Xcode 加一個叫 PrivateMath 的 dependencies,并且和 SPM 一樣,把這個 dependencies 的 target 定為 Calculator.
其實 Podfile 還有另外一個用處,但這個在下面講 pod install 時才會提到。
1.3. 如何配置一個最基本的 Podfile
其實配置一個最基本的 Podfile 并沒有想象中那么困難,只要:
- 指定 iOS 的版本號
- 指定 podspecs 倉庫的遠程地址
- 給特定的 target 加 dependencies
2、.podspec 文件
2.1. 什么是 .podspec 文件
.podspec 的全寫就是 pod specification,就是 pod 說明書。所以從后綴名就可以看出,.podspec 文件就是用來描述一個第三方庫的基本信息的;或者說 .podspec 文件存的是這個第三方庫除源代碼以外的信息(比如這個庫的作者、庫的版本、庫的源代碼的倉庫地址、庫所支持的 swift 版本……)。
以下圖 PrivateMath 這個第三方庫的 .podspec 文件舉例:
這個 .podspec 文件存的就是:
- 這個庫的名字是 PrivateMath
- 這個 .podspec 文件描述的是 0.3.0 版本的?PrivateMath 庫
- PrivateMath 這個庫的首頁地址是:https://github.com/chuanzhima0415/PrivateMath
- PrivateMath 這個庫只支持 swift 5.0 的版本
- PrivateMath 這個庫的作者是 chuanzhima0415
- PrivateMath 這個庫的源代碼地址是:https://github.com/chuanzhima0415/PrivateMath.git
- PrivateMath 這個庫只支持 iOS 12.0 及以上的 iPhone 運行
2.2. 如何配置一個最基本的?.podspec 文件
在新建一個第三方庫時終端執行 pod lib create?${ 自己寫的庫的名字 } 命令后,cocoapods 會給你生成一個最基本的 .podspec 文件的模版,其中我們要改的部份就是:
- s.summary:這個庫的大概描述
- s.description:這個庫的詳細描述
- s.swift_version:這個庫所適用的 swift 版本
- s.homepage:這個庫的首頁地址
- s.source:這個庫的源代碼的地址
- s.ios.deployment_target:這個庫適用于 iOS 的哪個版本
但需要注意的是:
- s.description?的內容一定要比 s.summary 的內容長很多,要不然 pod lib lint 和 pod spec lint 會過不了
- s.source 一定要正確
- s.homepage 選一個可以打開的網頁地址就行了
- 一定要指定 swift_version,要不然 pod lib lint 和 pod spec lint 會過不了
- Xcode 的 iOS app 項目里的 iphone 設備版本一定要大于等于?s.ios.deployment_target
二、podspec 倉庫
1、什么是 podspec 倉庫
看名字就知道了,podspec 倉庫就是專門存第三庫的 .podspec 文件的倉庫。注意,這個倉庫只存第三方庫的? .podspec 文件,不存第三庫的源代碼!!!
2、如何配置 podspec 倉庫
例子:假設我現在要配置一個叫 PrivateSpecs 的 podspec 倉庫,然后這個倉庫內部存有自己寫的 PrivateMath 庫的 .podspec 文件。
step1:在 github 上創建一個遠程的倉庫,名字一般為 xxxSpecs。這里的 README、證書都可以勾,但要把 visibility 設為 Private
step2:終端執行 pod repo add ${ .podspec 遠程倉庫的名字 } ?${ podspec 遠程倉庫的地址 }
step3:終端執行 pod lib create ${ 自己寫的庫的名字 }。后面會跳出多行的選擇,記住 test 的框架要選 none,然后 view 模版也選 no。選完回車后 xcode 會彈出一個模版
step4:在 pods target 下的 Development Pods/${ 自己寫的庫的名字 }/ReplaceMe 文件寫自己的庫代碼了。順便也可以把 ReplaceMe 改為自己庫的名字。


step5:寫完之后還要去到 Development Pods/${ 自己寫的庫的名字 }/ Pod 目錄下配置 ${ 自己寫的庫名字 }.podspec:
- s.description 一定要比 s.summary 要長很多(不然驗證不通過)
- 一定要規定 s.swift_version
- 確保 s.source 鏈接一定要正確
- s.homepage 只要寫一個可以訪問到的 url 就行了
step6:根據 .podspec 的 source 地址在 GitHub 上建一個存庫源代碼的倉庫(README, 證書那三樣都不要勾,否則可能會有分支錯誤)
step7:根據 github 的提示,把這個本地的庫項目 push 到遠程 github 存庫源代碼的那個庫

step8:git tag ‘0.1.0’ (tag 號碼一定要跟 .podspec 文件的 s.version 要一致!)

step9:打標簽,即終端運行:git push --tags
step10:驗證庫的源代碼,即終端執行:pod lib lint
step11:驗證庫的 .podspec 文件,即終端執行:pod spec lint
step12:把 .podspec 文件 push 到存 .podspec 的遠程倉庫中,即終端執行:pod repo push ${ 存 .podspec 文件的遠程倉庫名 } ?庫項目下的 .podspec 文件
step13:推送完成
3、如何使用 podspec 倉庫
Xcode 開了一個 app 項目后:
step1:終端執行 pod init 指令(執行完會生成 Podfile 文件)
step2:Xcode 配置 Podfile
step3:終端執行 pod install 命令
step4:打開 .xcworkspace 文件
step5:build 項目,可能會遇到?CoreStore.framework/_CodeSignature" failed: Operation not permitted 報錯,參考下文 pod install 命令介紹的第 3 點。
step6:此時可以使用第三方庫了
三、cocoapods 相關命令
1、pod init
生成 podfile 文件,然后你要在這個 podfile 文件里面寫你要加載的庫(add dependencies)。
注意:這個命令并沒有加載庫,只是要你寫要加載的依賴而已。
2、pod install
2.1. pod install 有什么用
根據 podfile 的內容把庫加載進項目中。即增加依賴,但如果重新 pod install 并不會改變庫的版本;生成 Podfile.lock(這個文件定死了庫的版本)
注意:如果你已經改變了 Podfile 的內容,在 Xcode build 項目前一定要重新執行 pod install!因為一旦改過 dependence 的獲取路徑(比如從本地路徑改為遠程地址),然后如果不執行 pod install,直接 Xcode?build 的話,因為遠程的庫源代碼沒有下載下來,所以Xcode 會找不到這個庫,于是就會報錯說找不到庫。
2.2. pod install 背后的流程
在終端執行 pod install 時,其實 cocoapods 會幫我們做這些事情:
- 讀取 Podfile 文件,并根據 Podfile 里指定的版本算出應該獲取這個庫的那個版本。當然,如果有 podfile.lock 文件的話,cocoapods 還會看 podfile.lock 中的版本和 Podfile 的版本是否一致,如果一致的話就算出這個庫應該下載的版本號。
- 如果此時的版本號本地緩存里有的話,就不用下載這個存庫源代碼的倉庫了,而是直接用緩存里的庫的源代碼。
- 如果緩存沒有這個版本號的話,就要遠程下載庫的源代碼了。然后下載完后把源代碼存進緩存中。
- 生成 Pods 項目,并生成一個 Pods.xcodeproj 的文件。以后你只能打開這個文件,因為這個文件把 iOS app 的項目跟所有 dependencies 鏈接在一起了。
- 生成一個 .xcworkspace 的文件。
- 如果沒有 podfile.lock 文件,就生成 podfile.lock 文件。
2.3. pod install 的坑:CoreStore.framework/_CodeSignature" failed: Operation not permitted?
如果執行 pod install 之后報?# CoreStore.framework/_CodeSignature" failed: Operation not permitted 錯,請不要慌張,解決方法就是 build settings -> 搜 sand boxing -> 把 Yes 改成 No。就解決了。
3、pod update
重寫 Podfile.lock ,把所有舊的版本改成新的;但不會把新的 dependencies 加載進項目,只是僅僅寫 Podfile.lock 而已。
4、pod repo list
顯示所有存 .podspec 的倉庫的名字、遠程地址、本地地址。
5、pod repo remove ${ 存 .podspec 的倉庫的名字 }
刪除 .podspec 倉庫。
6、pod search ${ 存 .podspec 的倉庫的名字 }
找特定的存 .podspec 的倉庫。
7、pod repo add ${ 存 .podspec 的倉庫的名字 }
往 pod repo list 中增加存 .podspec 的倉庫。
8、pod lib create ${ 自己寫的庫的名字 }
讓 cocoapods 給你創建一個第三方庫的模版。
9、pod cache clean --all
清空存有 pod 的源代碼的緩存。
10、pod cache list
列出緩存里所有的庫的地址、名字等信息。