創(chuàng)建自己的本地私有pod(實(shí)踐)
序
下面描述到的操作,我全部都一一實(shí)踐過,可以保證是沒有問題的。如果有讀者已經(jīng)完成了部分操作,可以根據(jù)需要選擇步驟閱讀或者查看“遇到的問題”欄。寫了好長(zhǎng)時(shí)間,如果對(duì)你有幫助,還望給點(diǎn)個(gè)贊,非要捐助的我也沒意見~~~
為什么要這么干
開發(fā)過程中我們會(huì)有許多公用的組件,比如多個(gè)工程會(huì)同時(shí)引用一段代碼。記得多年之前,我曾經(jīng)打過靜態(tài)包,還制作過framework來滿足我的需求,但是都太不方便了。尤其是多人合作開發(fā)的時(shí)候,弊端很大。把公用庫(kù)交給cocoapods來管理,是我覺得目前最方便的解決方案了?;锇閭冎灰?jiǎn)單幾句命令行就可以完成庫(kù)的安裝和更新,真乃團(tuán)隊(duì)協(xié)作利器。
操作過程中如果遇到命令不明的情況,建議多去官網(wǎng)搜索,里面提供的內(nèi)容都是最全最準(zhǔn)的。Command-line Reference
準(zhǔn)備工作
1、準(zhǔn)備一個(gè)git遠(yuǎn)程倉(cāng)庫(kù),存放我們自己的specs。
specs可以理解為我們查找?guī)鞎r(shí)候的一個(gè)索引,為什么我們執(zhí)行pod search AFNetworking命令時(shí),返回結(jié)果如此之快。因?yàn)榘惭bcocospod的時(shí)候,本地目錄就已經(jīng)有了一份master(公開)的specs,全球程序員們提交到cocospod的開源代碼在這都有記錄。
我們可以通過執(zhí)行命令1查看下目錄結(jié)構(gòu),結(jié)果一目了然。
命令1
open ~/.cocoapods/repos/master
2、一個(gè)git遠(yuǎn)程倉(cāng)庫(kù),存放我們自己的公共組件代碼。
其實(shí)這個(gè)也可以是別的(比如svn),不過我只嘗試過git。git遠(yuǎn)程倉(cāng)庫(kù)我用的是偏愛的coding,免費(fèi)、好使。
創(chuàng)建私有Spec
準(zhǔn)備工作的第一步已經(jīng)完成了,我創(chuàng)建的私有specs倉(cāng)庫(kù)地址為https://coding.net/zanyfly/ZYSpecs.git。下面執(zhí)行命令2把Spec創(chuàng)建到本地。
命令2
pod repo add ZYSpecs https://coding.net/zanyfly/ZYSpecs.git
這時(shí)候ZYSpecs就在本地目錄下創(chuàng)建成功了,通過命令查看ZYSpecs的目錄結(jié)構(gòu),會(huì)發(fā)現(xiàn)里面的內(nèi)容和git倉(cāng)庫(kù)上的保持一致。
open ~/.cocoapods/repos/ZYSpecs
創(chuàng)建個(gè)人pod
這一步的主要目的是為我們的公用代碼創(chuàng)建podspec文件,這個(gè)文件會(huì)要求我們配置很多必要的信息。如果你的公用庫(kù)代碼已經(jīng)是一套成型的組織,那么可以考慮直接新建一個(gè)podspec。我的做法是利用命令3創(chuàng)建一個(gè)完整的pod,也就是從頭開始,好處是可以選擇生成Example工程和測(cè)試框架,方便調(diào)試以及幫助他人學(xué)習(xí)使用。
1、創(chuàng)建podspec
命令3
pod lib create ZYLib
過程中終端會(huì)向我們提出一系列問題,包括開發(fā)語言是OC還是Swift(Objective-C or Swift
),demo程序(Making a Demo Application),是否包含測(cè)試框架(Choosing a Test Framework),界面測(cè)試等(View-based Testing)。選項(xiàng)問題都很簡(jiǎn)單,我選擇了包含demo程序,沒有測(cè)試框架,大家可以根據(jù)自己的實(shí)際需要進(jìn)行選擇。</br>
2、編輯podspec
操作成功后,可以看到ZYLIB.podspec文件就已經(jīng)創(chuàng)建好了,而且其中包含一個(gè)Example目錄。大體的結(jié)構(gòu)圖(摘自官網(wǎng))
$ tree ZYLIB -L 2
ZYLIB
├── _Pods.xcproject
├── Example
│ ├── ZYLIB
│ ├── ZYLIB.xcodeproj
│ ├── ZYLIB.xcworkspace
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ └── Tests
├── LICENSE
├── ZYLIB.podspec
├── Pod
│ ├── Assets
│ └── Classes
│ └── RemoveMe.[Objective-C/m]
└── README.md
用編輯器打開podspec,把里面的資料都填寫一下,下面是我寫的(#注釋的部分都被我刪掉了)。特別指出:務(wù)必保證填寫的每一項(xiàng)都要是正確的,比如主頁和鏈接都要能夠訪問。
Pod::Spec.new do |s|
s.name = 'ZY_LIB'
s.version = '0.1.0'
s.summary = 'This is my pod lib'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://git.coding.net/ivanzeng/ZY_LIB.git'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'zengyuan' => 'zanyfly@126.com' }
s.source = { :git => 'https://git.coding.net/ivanzeng/ZY_LIB.git', :tag => s.version.to_s }
s.social_media_url = 'http://www.itdecent.cn/users/f8e79006b5c6/latest_articles'
s.ios.deployment_target = '7.0'
s.source_files = 'ZY_LIB/Classes/**/*'
s.public_header_files = 'ZY_LIB/Classes/**/*.h'
s.dependency 'AFNetworking', '~> 2.0'
end
提示: s.public_header_files是要公開的頭文件,s.dependency表示依賴庫(kù),我的庫(kù)HTTP通信部分用了AFNetworking,沒有的話可以直接注釋掉。</br>
3、測(cè)試podspec
我首先是打開Example,在工程里直接嘗試調(diào)用庫(kù)文件,保證編譯過程中沒有錯(cuò)誤,沒有警告,運(yùn)行過程中可以正常使用。
最后打開命令行,cd到podspec所在的當(dāng)前目錄,執(zhí)行命令4進(jìn)行檢驗(yàn)。
命令4
pod lib lint
幸運(yùn)的話,我們可以看到passed validation.的提示。如果提示驗(yàn)證失敗,不要著急,仔細(xì)閱讀它描述的錯(cuò)誤信息,基本上google一下就能找出解決方案。</br>
備注:要是實(shí)在是解決不了警告也沒關(guān)系,在后面追加 --allow-warnings
4、提交ZY_LIB代碼
這時(shí)候ZY_LIB驗(yàn)證通過,確定沒問題了,那么把代碼push到我們公用庫(kù)遠(yuǎn)程倉(cāng)庫(kù)上去,否則其他的同事或者合作者就沒法用了。基本操作就是add、commit、push,最后重點(diǎn)說明一個(gè)事情,push結(jié)束以后千萬不能忘記打tag?。?!而且tag值一定要和s.version保持一致!??!
$ git tag -m "ZYLib say hi to you" 0.1.0
$ git push --tags
這些操作全都結(jié)束以后,可以通過log日志的方式,來確保我們沒有遺漏操作。</br>
5、push podspec
執(zhí)行命令5,這時(shí)候本地的repos目錄就有ZYSPECS了,和~/.cocoapods下的master是同級(jí)。
命令5
pod repo push ZYSPECS ZYLIB.podspec。
提交時(shí)候,會(huì)再進(jìn)行一次驗(yàn)證,如果遇到警告不通過的問題,可以考慮 pod repo push ZYSPECS ZYLIB.podspec --allow-warnings。
</br>
6、搜索公用庫(kù),執(zhí)行命令6
命令6
pod search ZYLib
查詢到結(jié)果,說明已經(jīng)安裝成功。
使用公用庫(kù)
使用方式和其他的開源庫(kù)一樣,修改podfile,增加庫(kù)標(biāo)記。不同的是,需要在頭部增加
source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/ivanzeng/ZYSpecs.git'
否則可能會(huì)出現(xiàn)無法正確安裝的情況。其他同事或者小伙伴,在自己的電腦執(zhí)行一下命名進(jìn)行安裝,
pod repo add ZYSpecs https://git.coding.net/ivanzeng/ZYSpecs.git
如果是更新就換成 repo update。
遇到的問題
1.demo下無法import到庫(kù)頭文件
解決辦法:我遇到過一次,如果發(fā)生了,手動(dòng)打開pod工程 - Build Phases - Headers - Public,把我們需要的頭文件加進(jìn)去。
2.pod lib lint執(zhí)行報(bào)錯(cuò)
記得修改下summary,別用初始的??纯磗ource和homepage是否正確,public_header_files是否正確引用。還要記住代碼文件不能有警告,有警告也無法編譯成功。
3、 pod lib lint執(zhí)行報(bào)錯(cuò)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- ERROR | xcodebuild: ....
- error: include of non-modular header inside framework module '' [-Werror,-Wnon-modular-include-in-framework-module]
...
原因就是我的庫(kù)的某個(gè)頭文件中直接import了第三方庫(kù)(我對(duì)它有依賴)的頭文件,我采用了前向聲明的方式解決。
4、pod lib lint驗(yàn)證成功了,但是在接下來的pod repo push報(bào)錯(cuò)
而且報(bào)的是就是podspec無法通過驗(yàn)證,解決方法,重新提交一個(gè)tag并push。在執(zhí)行pod repo push,驗(yàn)證通過。
5、pod search可以成功的搜索到我們的庫(kù),但是在項(xiàng)目中執(zhí)行pod install報(bào)錯(cuò)
Unable to find a specification for **
在podfile 文件中
source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/ivanzeng/ZYSpecs.git'
6、在pod中引入第三方庫(kù)報(bào)錯(cuò)
比如在自己的pod中引入sharesdk,lint時(shí)報(bào)錯(cuò)
The 'Pods-Your Example' target has transitive dependencies that include static binaries:
這是因?yàn)閟haresdk以framework形式出現(xiàn),導(dǎo)致lint在執(zhí)行的時(shí)候因?yàn)殪o態(tài)庫(kù)無法通過驗(yàn)證。可以在lint命令后面增加
--use-libraries
7、lint時(shí),始終報(bào)錯(cuò)。Unable to interpret the specified path as a pod spec.
這個(gè)錯(cuò)誤產(chǎn)生的原因我并不知道是為什么。但是確實(shí)遇到過,我的解決辦法來自
https://github.com/CocoaPods/CocoaPods/issues/5195
cocospod作者的回復(fù)
I've got an open PR to cocoapods-trunk improving this. In the meantime, try running pod spec lint --verbose
執(zhí)行這個(gè)命令成功了。
pod spec lint --verbose