本文主要介紹CocoaPods私有庫(kù)的創(chuàng)建,做這件事的主要起因是,公司接過(guò)來(lái)一個(gè)外包的項(xiàng)目桌粉,項(xiàng)目中用到了他們的私有庫(kù)芋膘,pod中可以看到源碼鳞青,雖然直接將源碼添加到工程中也是可行的,但本著學(xué)一點(diǎn)是一點(diǎn)的思想为朋,借此機(jī)會(huì)嘗試一下自己做一個(gè)私有庫(kù)臂拓。
首先需要明確一個(gè)概念,私有倉(cāng)庫(kù)和私有庫(kù)习寸,類(lèi)比CocoaPods的官方倉(cāng)庫(kù)胶惰,私有倉(cāng)庫(kù)就是整個(gè)庫(kù),其中會(huì)包含多個(gè)私有庫(kù)以及同一個(gè)私有庫(kù)的不同版本霞溪,在本機(jī)~/.cocoapods/repos/
路徑下孵滞,CocoaPods官方倉(cāng)庫(kù)位于master文件夾中,~/.cocoapods/repos/master/Specs
文件夾下保存的就是各個(gè)開(kāi)源庫(kù)的podspec文件鸯匹。在終端執(zhí)行pod repo list
可以查看本地倉(cāng)庫(kù)坊饶,名字為master的就是官方倉(cāng)庫(kù)。
因此殴蓬,在私有庫(kù)創(chuàng)建之前匿级,首先要?jiǎng)?chuàng)建一個(gè)私有的倉(cāng)庫(kù):
創(chuàng)建CocoaPods私有倉(cāng)庫(kù)
創(chuàng)建私有倉(cāng)庫(kù),可以在gitlab科雳,github根蟹,coding等網(wǎng)站中直接創(chuàng)建即可,這里不詳細(xì)描述糟秘。這里我用的是coding的git简逮,創(chuàng)建后可以得到倉(cāng)庫(kù)的git地址,需要在本地添加倉(cāng)庫(kù)尿赚。
# pod repo add REPO_NAME SOURCE_URL
pod repo add TestRepository https://git.coding.net/rapunzel/TestRepository.git
添加后可以在本地查看是否添加成功散庶。
pod repo list
成功后可以看到輸出:
或者也可以直接查看~/.cocoapods/repos/
文件夾,如果有名字為剛才添加的REPO_NAME的文件夾凌净,那就說(shuō)明repo add成功悲龟。
本地倉(cāng)庫(kù)可以做刪除和更新等操作:
pod repo remove REPO_NAME
pod repo update
添加私有庫(kù)代碼
在私有倉(cāng)庫(kù)中添加源碼,這里暫時(shí)先上傳一個(gè)文件夾冰寻,后面會(huì)在podspec中引用這個(gè)文件夾须教。
給私有庫(kù)打tag,這個(gè)tag表示后面podspec文件中的引用版本,因此轻腺,每次重新編輯后乐疆,要重新打tag,然后再更新podspec文件贬养,生成新版本的pod庫(kù)挤土。
git tag '0.0.1'
或者 git tag -a 0.0.1 -m 'version 0.0.1'
git push --tags
創(chuàng)建私有庫(kù)
在前面創(chuàng)建倉(cāng)庫(kù),添加代碼误算,打標(biāo)簽等操作都完成后仰美,就可以真正開(kāi)始創(chuàng)建私有庫(kù)了,這里主要分為幾個(gè)步驟:
1. 創(chuàng)建podspec文件
2. 編輯podspec文件
3. 驗(yàn)證podspec文件
4. 本地調(diào)用驗(yàn)證
5. 將podspec文件推送到遠(yuǎn)程倉(cāng)庫(kù)
創(chuàng)建podspec文件
首先進(jìn)入到庫(kù)目錄下:
cd /Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView
執(zhí)行創(chuàng)建podspec文件語(yǔ)句:
pod spec create SPEC_NAME
在目錄下會(huì)出現(xiàn)一個(gè)PodTestAlertView.podspec
文件儿礼,可以使用sublime打開(kāi)咖杂。可以看到里面有很多信息需要補(bǔ)充:
Pod::Spec.new do |s|
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# These will help people to find your library, and whilst it
# can feel like a chore to fill in it's definitely to your advantage. The
# summary should be tweet-length, and the description more in depth.
#
s.name = "PodTestAlertView"
s.version = "0.0.1"
s.summary = "A short description of PodTestAlertView."
#此處省略一萬(wàn)字
end
編輯podspec文件(大概介紹一下podspec文件中的每個(gè)字段的含義)
字段 | 含義 |
---|---|
name | 庫(kù)名稱(chēng)蜘犁,即pod search POD_NAME 中的POD_NAME 字段 |
version | 庫(kù)版本翰苫,這里需要和上面的tag版本相同 |
homepage | 表示匹配所有子目錄 |
license | 這個(gè)不是很了解,暫時(shí)使用MIT 了 |
author | 一般會(huì)根據(jù)本地的git賬戶(hù)自動(dòng)填好 |
platform / deployment_target | 單平臺(tái)用platform这橙,多平臺(tái)使用deployment_tartet |
source | git字段填寫(xiě)倉(cāng)庫(kù)地址奏窑,后面可以使用tag指定標(biāo)簽,也可以使用commit指定某一次提交 |
source_files | 指定庫(kù)源文件的位置屈扎,如果倉(cāng)庫(kù)中包含多個(gè)pod庫(kù)埃唯,那么在引用pod庫(kù)時(shí),則需要指定是什么庫(kù)的文件 |
resource / resources | 資源文件鹰晨,和source_files格式類(lèi)似 |
framework / frameworks | 去掉.framework后綴墨叛,多個(gè)framework以逗號(hào)分隔,例如使用UIKit.framework 和Foundation.framework 模蜡,則為s.frameworks = "UIKit", "Foundation"
|
library / libraries | 去掉名字中的lib和.tbd等后綴漠趁,多個(gè)lib以逗號(hào)分隔,例如使用libsqlite3.0.tbd 和libc++.tbd 忍疾,則為s.libraries = "sqlite3.0", "c++"
|
dependency | 依賴(lài)的第三方庫(kù)闯传,可以指定版本,例如s.dependency "JSONKit", "~> 1.4" 卤妒,也可以不指定版本甥绿,例如s.dependency "JSONKit" 將默認(rèn)使用最新版本;這里也可以使用自己的私有庫(kù)则披,使用私有庫(kù)在驗(yàn)證podspec時(shí)需要進(jìn)行私有庫(kù)地址的搜索共缕,添加--sources = 'SOURCE_URL1, SOURCE_URL2' ,否則只會(huì)在官方倉(cāng)庫(kù)搜索士复,導(dǎo)致依賴(lài)庫(kù)找不到的問(wèn)題 |
source_files字段图谷,表示在倉(cāng)庫(kù)中尋找并添加的文件類(lèi)型,需要指定要添加的文件路徑。例如我的目錄中蜓萄,這個(gè)字段就可以寫(xiě)成s.source_files = "PodTestAlertView/*.{h,m}"
source_files字段 | 匹配文件類(lèi)型 |
---|---|
* | 表示匹配所有文件 |
*.{h,m} | 表示匹配所有以.h和.m的文件 |
** | 表示匹配所有子目錄 |
編輯后的podspec文件大概如下:
Pod::Spec.new do |s|
s.name = "PodTestAlertView"
s.version = "0.0.3"
s.summary = "A short description of PodTestAlertView."
s.homepage = "http://EXAMPLE/PodTestAlertView"
s.license = "MIT"
s.author = "zhangmj"
s.platform = :ios, "8.0"
s.source = { :git => "https://git.coding.net/rapunzel/TestRepository.git", :tag => "#{s.version}" }
s.source_files = "PodTestAlertView/*.{h,m}"
s.frameworks = "UIKit"
s.dependency "IQKeyboardManager"
end
驗(yàn)證podspec文件
驗(yàn)證podspec文件命令:
pod spec lint SPEC_NAME.podspec
輸出驗(yàn)證結(jié)果:
可以看到輸出中隅茎,會(huì)有很多WARN,警告的結(jié)果就是最后說(shuō)The spec did not pass validation
嫉沽,不過(guò)它也給出了解決方案,就是you can use '--allow-warnings' to ignore them
俏竞,修改驗(yàn)證指令:
pod spec lint SPEC_NAME.podspec --allow-warnings
忽略警告后绸硕,驗(yàn)證通過(guò):
驗(yàn)證過(guò)程中也可能由于代碼問(wèn)題,出現(xiàn)代碼編譯方面的error魂毁,可以添加--verbose
來(lái)查看詳細(xì)的log:
pod spec lint SPEC_NAME.podspec --verbose
根據(jù)其中提示的代碼方面的錯(cuò)誤玻佩,庫(kù)引用方面的錯(cuò)誤,修改代碼席楚,上傳更新咬崔,重新打標(biāo)簽,修改podspec文件的引用版本烦秩,繼續(xù)驗(yàn)證垮斯。
這里如果在依賴(lài)時(shí)調(diào)用了自己的庫(kù),則需要在后面添加私有庫(kù)地址的SOURCE_URL只祠,因?yàn)轵?yàn)證時(shí)默認(rèn)只搜索官方倉(cāng)庫(kù)兜蠕,例:
pod spec lint --allow-warnings SPEC_NAME.podspec --sources='YOUR_PRIVATE_SOURCE_URL, https://github.com/CocoaPods/Specs.git'
本地調(diào)用驗(yàn)證
驗(yàn)證podspec文件的正確性后,可以在本地先進(jìn)行一次安裝抛寝,沒(méi)問(wèn)題后再推送到倉(cāng)庫(kù)熊杨,修改podfile,指定podspec地址為本地的地址:
pod 'PodTestAlertView', :podspec => '/Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView/PodTestAlertView.podspec'
成功安裝盗舰!在做這行之前晶府,我心里是拒絕紅色和綠色同時(shí)出現(xiàn)的,但在終端里钻趋,這個(gè)紅配綠是奪么和諧川陆!
將podspec文件推送到遠(yuǎn)程倉(cāng)庫(kù)
本地驗(yàn)證通過(guò)后就可以上傳版本了,推送podspec文件使用指令:
pod repo push REPO_NAME SPEC_NAME.podspec
如果在上一步驗(yàn)證時(shí)使用了--allow-warnings
來(lái)忽略警告爷绘,在推送podspec文件時(shí)也需要忽略警告:
pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings
開(kāi)始推送后书劝,一般會(huì)報(bào)一個(gè)錯(cuò)誤[!] The repo 'TestRepository' at '..' is not clean
,原因是podspec文件是直接在repo下生成的土至,本地的repo
和遠(yuǎn)程倉(cāng)庫(kù)相比购对,多了一個(gè)podspec文件,所以可以選擇將podspec文件移到別的位置陶因,讓本地的repo和遠(yuǎn)程保持同步骡苞,重新推送。
Validating spec
-> PodTestAlertView (0.0.3)
- WARN | homepage: The homepage has not been updated from default
- WARN | summary: The summary is not meaningful.
Updating the 'TestRepository' repo
From https://git.coding.net/rapunzel/TestRepository
* [new tag] 0.0.1 -> 0.0.1
* [new tag] 0.0.2 -> 0.0.2
* [new tag] 0.0.3 -> 0.0.3
Already up-to-date.
Adding the spec to the 'TestRepository' repo
- [Update] PodTestAlertView (0.0.3)
Pushing the 'TestRepository' repo
推送成功后,遠(yuǎn)程倉(cāng)庫(kù)和本地repo都可以看到一個(gè)名字和version相同的文件夾解幽,里面包含剛才添加的podspec文件贴见,代表這個(gè)版本的podspec文件,然后就可以試試使用私有庫(kù)了~
使用私有庫(kù)
在podfile中添加私有倉(cāng)庫(kù)地址躲株,同時(shí)也要添加官方倉(cāng)庫(kù)地址片部,否則只會(huì)在私有倉(cāng)庫(kù)中搜索:
source 'https://git.coding.net/rapunzel/TestRepository.git' #私有倉(cāng)庫(kù)地址
source 'https://github.com/CocoaPods/Specs.git' #官方倉(cāng)庫(kù)地址
platform:ios, '8.0'
target 'test' do #工程名稱(chēng)
#三方開(kāi)源
pod 'IQKeyboardManager'
#私有庫(kù)
pod 'PodTestAlertView'
end
如果可以成功安裝,那就ok啦霜定!
一些問(wèn)題
引用的文件生成的framework档悠,此處感謝此分享的提示
在podspec文件中有一個(gè)字段是vendored_frameworks,可以使用自己生成的framework:
s.vendored_frameworks = 'Pod/Assets/*.framework'
然后在驗(yàn)證和push到遠(yuǎn)程倉(cāng)庫(kù)時(shí)需要添加--user-libraries
git push origin master
比較慢
如果和我一樣用的是Coding望浩,那可能是它給你的圣誕節(jié)彩蛋= =
其實(shí)還有一個(gè)文件夾目錄的問(wèn)題辖所,但是不知道為什么,沒(méi)有辦法復(fù)現(xiàn)了磨德,所以先不記錄這一條了缘回。