創(chuàng)建自己的本地私有pod(實(shí)踐)

創(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

參考
http://www.itdecent.cn/p/d6a592d6fced

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容