CocoaPods私有庫(kù)

本文主要介紹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

成功后可以看到輸出:


本地倉(cāng)庫(kù)列表

或者也可以直接查看~/.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è)文件夾须教。


1609c8c53e691ad0.png

給私有庫(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.frameworkFoundation.framework模蜡,則為s.frameworks = "UIKit", "Foundation"
library / libraries 去掉名字中的lib和.tbd等后綴漠趁,多個(gè)lib以逗號(hào)分隔,例如使用libsqlite3.0.tbdlibc++.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é)果:


驗(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ò)

驗(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é)彩蛋= =

這是一個(gè)彩蛋

其實(shí)還有一個(gè)文件夾目錄的問(wèn)題辖所,但是不知道為什么,沒(méi)有辦法復(fù)現(xiàn)了磨德,所以先不記錄這一條了缘回。

感謝資源分享

創(chuàng)建Podspec描述文件

使用CocoaPods創(chuàng)建私有庫(kù)

使用Cocoapods創(chuàng)建私有podspec

iOS CocoaPods 私有庫(kù) steps and tips

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市典挑,隨后出現(xiàn)的幾起案子酥宴,更是在濱河造成了極大的恐慌,老刑警劉巖搔弄,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅虑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顾犹,警方通過(guò)查閱死者的電腦和手機(jī)倒庵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炫刷,“玉大人擎宝,你說(shuō)我怎么就攤上這事』肼辏” “怎么了绍申?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)顾彰。 經(jīng)常有香客問(wèn)我极阅,道長(zhǎng),這世上最難降的妖魔是什么涨享? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任筋搏,我火速辦了婚禮,結(jié)果婚禮上厕隧,老公的妹妹穿的比我還像新娘奔脐。我一直安慰自己俄周,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布髓迎。 她就那樣靜靜地躺著峦朗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪排龄。 梳的紋絲不亂的頭發(fā)上波势,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音涣雕,去河邊找鬼艰亮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挣郭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疗韵,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兑障,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蕉汪?” 一聲冷哼從身側(cè)響起流译,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎者疤,沒(méi)想到半個(gè)月后福澡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驹马,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年革砸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糯累。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡算利,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泳姐,到底是詐尸還是另有隱情效拭,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布胖秒,位于F島的核電站缎患,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阎肝。R本人自食惡果不足惜挤渔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盗痒。 院中可真熱鬧蚂蕴,春花似錦低散、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鸟整,卻和暖如春引镊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮条。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工弟头, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涉茧。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓赴恨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伴栓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伦连,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言 CocoaPods是一個(gè)程序依賴(lài)管理工具,使用CocoaPods可以節(jié)省設(shè)置和更新第三方開(kāi)源庫(kù)的時(shí)間钳垮,同樣的...
    Dennis_me閱讀 2,005評(píng)論 0 4
  • 為什么要使用Cocoapods私有庫(kù) 在項(xiàng)目開(kāi)發(fā)的時(shí)候常常會(huì)積累很多自己的框架及工具包惑淳,而如果需要?jiǎng)?chuàng)建新項(xiàng)目,就不...
    納木那咔閱讀 988評(píng)論 0 2
  • 目錄 環(huán)境 TL;DR(步驟概述)1饺窿、創(chuàng)建示例工程2歧焦、編寫(xiě) Pod 庫(kù)3、Build 項(xiàng)目后肚医,在 Demo 工程中...
    Vinc閱讀 6,126評(píng)論 3 7
  • 前言 做iOS開(kāi)發(fā)3绢馍、4年了,看了很多別人的庫(kù)忍宋,也有很多自己的組件痕貌,類(lèi),在新啟一個(gè)項(xiàng)目時(shí)糠排,不免要拿以前的東西來(lái)用舵稠,...
    水之飛亦閱讀 467評(píng)論 0 1
  • 前言 在我們開(kāi)發(fā)過(guò)程中,有一些自己封裝的工具類(lèi)或是庫(kù)入宦,為了方便管理哺徊,我們借助cocoapods來(lái)實(shí)現(xiàn)。我們平時(shí)所接...
    47號(hào)同學(xué)閱讀 368評(píng)論 0 5