私有 Pod庫的創(chuàng)建及使用

1、創(chuàng)建私有Spec Repo

Spec Repo是什么?它是所有的Pods的一個索引,就是一個容器廓推,所有公開的Pods都在這個里面,它實際是一個Git倉庫remote端在GitHub上翩隧,所以想要創(chuàng)建pod私有庫樊展,需要創(chuàng)建類似于master的私有Spec Repo,先在遠程倉庫創(chuàng)建一個工程SGTSpecs鸽心,然后執(zhí)行創(chuàng)建私有Spec Repo命令:

#pod repo add [Private Repo Name][GitHub HTTPS clone URL]

$ pod repo add SGTSpecs https://github.com/Tony-iOS-Personal/SGTSpecs.git

完成本地私有庫的創(chuàng)建滚局,并連接到遠程倉庫

完成之后居暖,進入到~/.cocoapods/repos目錄下就可以看到SGTSpecs這個目錄了顽频。

2、創(chuàng)建Pod項目工程文件

從零開始創(chuàng)建一個組件庫太闺,可以使用Cocoapods提供的工具Using Pod Lib Create?糯景,先cd到要創(chuàng)建項目的目錄然后執(zhí)行

$ pod lib create?SGTToolSDK

然后顯示六個問題,1.選擇一個平臺(?iOS / macOS)省骂;2.選擇你想用的語言(?Swift/ ObjC?)蟀淮;3.是否包含一個演示應用程序;4.需要使用哪些測試框架(?Specta / Kiwi / None)钞澳;5.是否需要基于視圖的測試;6.類前綴怠惶。 ? 6個問題的具體介紹可以去看官方文檔≡冢回答完6個問題他會自動執(zhí)行pod install命令創(chuàng)建項目并生成依賴策治,項目結構如下:

SGTToolSDK

├── Example? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP

│? ├──SGTToolSDK

│? ├── SGTToolSDK.xcodeproj

│? ├── SGTToolSDK.xcworkspace

│? ├── Podfile? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP 的依賴描述文件

│? ├── Podfile.lock

│? ├── Pods? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP 的依賴文件

│? └── Tests

├── LICENSE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #開源協(xié)議 默認MIT

├── Pod? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #組件的目錄

│? ├── Assets? ? ? ? ? ? ? ? ? ? ? ? ? ? #資源文件

│? └── Classes? ? ? ? ? ? ? ? ? ? ? ? ? #類文件

├── SGTToolSDK.podspec? ? ? ? ? ? ? ? ? #第三步要創(chuàng)建的podspec文件

└── README.md? ? ? ? ? ? ? ? ? ? ? ? ? ? #markdown格式的README

3、創(chuàng)建私有庫pod組件

所需要做的工作就是在相應的 Pods/Developemnt Pods/ 組件 /Classes 下編碼兰吟,就是向Development Pods文件夾中添加庫文件和資源通惫,將編寫的組件相關的class放入SGTToolSDK/Classes中、資源圖片文件放入SGTToolSDK/Assets中混蔼,并配置podspec文件履腋,然后進入Example文件夾執(zhí)行pod install命令,再打開項目工程可以看到,剛剛添加的組件已經在Pods子工程下Development Pods/SGTToolSDK中了遵湖。

pod會把添加的資源文件編譯成bundle悔政,所以引用資源文件的寫法:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];

NSURL *bundleURL = [bundle URLForResource:@"SGTToolSDK" withExtension:@"bundle"];

NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];

UIImage *img = [UIImage imageNamed:@"you imageName" inBundle:resourceBundle?compatibleWithTraitCollection:nil];

4、編輯podspec文件

創(chuàng)建好的 .podspec 包含大量的注釋說明了每個參數(shù)的含義及用法奄侠。如果想詳細了解可以仔細閱讀卓箫。這里只介紹幾個常用的。

1垄潮、后綴為.podspec文件

該文件為Pods依賴庫的描述文件烹卒,每個Pods依賴庫必須有且僅有那么一個描述文件。文件名稱要和我們想創(chuàng)建的依賴庫名稱保持一致弯洗,我的SGTToolSDK依賴庫對應的文件名為SGTToolSDK.podspec旅急。

1.1 podspec文件內容

SGTToolSDK.podspec的保存內容為:

Pod::Spec.newdo|s|

? s.name? ? ? ? ? ? ='SGTToolSDK'

? s.version? ? ? ? ? ='0.1.0'

? s.summary? ? ? ? ? ='A short description of SGTToolSDK.'

? s.description? ? ? = <<-DESC

TODO: Add long description of the pod here.

?? ? ? ? ? ? ? ? ? ? ? DESC

? s.homepage? ? ? ? ='https://github.com/Tony-iOS-Personal/SGTToolSDK.git'

? # s.screenshots? ? = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'

? s.license? ? ? ? ? = { :type =>'MIT', :file =>'LICENSE'}

? s.author? ? ? ? ? = {'sgt' => 'shaoguangtao@zhujia360.com' }

? s.source? ? ? ? ? = { :git =>'https://github.com/Tony-iOS-Personal/SGTToolSDK.git', :tag => s.version.to_s }

? # s.social_media_url = 'https://twitter.com/'

? s.ios.deployment_target ='8.0'

? s.source_files ='SGTToolSDK/Classes/**/*'

? # s.resource_bundles = {

? #? 'SGTToolSDK' => ['SGTToolSDK/Assets/*.png']

? # }

?? s.public_header_files ='SGTToolSDK/Classes/**/*.h'

? # s.frameworks = 'UIKit', 'MapKit'

? # s.dependency 'AFNetworking', '~> 2.3'

end

2.其中需要說明的又幾個參數(shù):

s.name:名稱,pod search 搜索的關鍵詞

s.version:版本

s.summary:簡介牡整,pod search 搜索的關鍵詞

s.homepage:主頁地址藐吮,例如Github地址

s.license:許可證

s.author:作者

s.social_media_url:社交網(wǎng)址

s.platform:平臺

s.source:Git倉庫地址,例如在Github地址后邊加上 .git 就是Git倉庫地址逃贝,常見寫法如下

s.source_files:需要包含的源文件谣辞,常見的寫法如下

s.resources:需要包含的圖片等資源文件

s.dependency:依賴庫,不能依賴未發(fā)布的庫

s.dependency:依賴庫沐扳,如有多個可以這樣寫

s.requires_arc:是否要求ARC

s.source_files 常見寫法

"Directory1/*"? 表示匹配所有文件

"Directory1/Directory2/*.{h,m}"? 表示匹配所有以.h和.m結尾的文件

"Directory1/**/*.h"? 表示匹配所有子目錄

s.source 常見寫法

s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :commit => "68defea" }

s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :tag => 0.1.0 }

s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :tag => s.version }

commit => "68defea" 表示將這個Pod版本與Git倉庫中某個commit綁定

tag => 0.1.0 表示將這個Pod版本與Git倉庫中某個版本的comit綁定

tag => s.version 表示將這個Pod版本與Git倉庫中相同版本的comit綁定

按照上述規(guī)則編輯完成就制作好了 .podspec泥从。

5、驗證倉庫

執(zhí)行以下命令沪摄,為 Pod 添加版本號躯嫉,并打上 tag:

set the new version to?0.1.0

set the new tag to?0.1.0

編輯好后最好先驗證 .podspec 是否有有效

$ pod spec lint

驗證過程中:

->SGTToolSDK

驗證成功后:SGTToolSDK.podspec passed validation.

驗證失敗后:[!] The spec did not pass validation, due to 1 error.

驗證 .podspec 會先測試本地 .podspec 文件是否存在語法錯誤。測試成功再根據(jù) .podspec 文件找到遠端倉庫對應的版本克隆到本地并進行配置杨拐。最后測試文件是否能夠編譯成功祈餐。

.podspec驗證失敗錯誤排查

語法錯誤

如果是因為語法錯誤,驗證失敗后會給出錯誤的準確定位

[!] Invalid `SGTToolSDK.podspec` file: no .floating literal anymore; put 0 before dot

s.version = “0.1.0”

^

SGTToolSDK.podspec:5: syntax error, unexpected tFLOAT, expecting '('

s.version = “0.1.0”

^

標記“^”的地方即為有語法錯誤的地方哄陶。

上述錯誤是因為使用“文本編輯”進行編輯造成的帆阳。使用文本編輯有時候英文""引號會自動變成中文“”引號。

[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.

使用 vim 將其改為英文的""引號即可屋吨。

依賴錯誤

但是蜒谤,有些非語法錯誤是不會給出錯誤原因的。這個時候可以使用“--verbose”來查看詳細的驗證過程來幫助定位錯誤离赫。

pod spec lint SGTToolSDK.podspec --verbose

如下錯誤通過 --verbose 就可以找到原因芭逝。

-> SGTToolSDK(0.1.0)

- ERROR | [iOS] Encountered an unknown error (The 'Pods' target has transitive dependencies that include static binaries: (/private/var/folders/jz/b_m3k7ln47524cm__h3__mk00000gn/T/CocoaPods/Lint/Pods/BPushSDK/LibBPush/libBPush.a)) during validation.

這個錯誤是因為依賴庫(s.dependency)包含了.a靜態(tài)庫造成的。雖然這并不影響Pod的使用渊胸,但是驗證是無法通過的旬盯。可以通過 --use-libraries 來讓驗證通過。

pod spec lint SGTToolSDK.podspec --verbose --use-libraries

這種情況下使用 --use-libraries 雖然不會出現(xiàn)錯誤(error)胖翰,但是有時候會帶來一些警告(waring)接剩,警告同樣是無法通過驗證的。這時可以用 --allow-warnings 來允許警告萨咳。

pod spec lint SGTToolSDK.podspec --verbose --use-libraries --allow-warnings

安裝錯誤

如果在其他項目 pod install 的過程中懊缺,出現(xiàn)包含“undefined method end_with?' for nil”字樣的報錯。進入“~/.cocoapods/repos”目錄培他,刪除“master”鹃两,并將 master-1 改為 master 即可。

如果出現(xiàn)如下錯誤舀凛,而你的驗證可以通過俊扳,那么一般更新下版本號就可以解決。[!] Unable to find a specification for 'SGTToolSDK'.`

再次驗證

如果錯誤發(fā)生在 .podspec 中猛遍。當修改完時馋记,不需要再次提交就可以直接驗證。如果錯誤發(fā)生在代碼中懊烤,則需要再次提交才能驗證梯醒。

6、上傳代碼到Git

將包含配置好的 .podspec 的項目提交 Git腌紧,并給這次提交打上 tag茸习,可以使用SourceTree處理.

$ git add -A && git commit -m "Release 0.1.0"

$ git tag '0.1.0'

$ git push --tags

$ git push origin master

7、發(fā)布到CocoaPods

沒有自身的WARNING或者ERROR之后寄啼,就可以再次提交到Spec Repo中逮光,命令如下:

$ pod repo push SGTSpecs SGTToolSDK.podspec?--allow-warnings --use-libraries

之后到~/.cocoapods/repos/SGTSpecs目錄下查看代箭,也使用pod search命令查看自己庫:

-> SGTToolSDK (0.1.0)

?? A short description of SGTToolSDK.

?? pod 'SGTToolSDK', '~> 0.1.0'

?? - Homepage: https://github.com/Tony-iOS-Personal/SGTToolSDK.git

?? - Source:? https://github.com/Tony-iOS-Personal/SGTToolSDK.git

?? - Versions: 0.1.0 [SGTSpecs repo]

(END)

這里特別強調一下墩划,如果 s.dependency 中依賴的是 pod 私有庫的話,驗證和提交命令都需要指定 source :

$ pod lib lint --sources=https://github.com/Tony-iOS-Personal/SGTSpecs.git,https://github.com/CocoaPods/Specs.git --allow-warnings --no-clean --use-libraries

$ pod repo push SGTSpecs SGTToolSDK.podspec --sources=https://github.com/Tony-iOS-Personal/SGTSpecs.git,https://github.com/CocoaPods/Specs.git --allow-warnings --no-clean --use-libraries?

8嗡综、項目中導入pod私有庫組件

當你執(zhí)行?pod install?的時候乙帮,CocoaPods 默認只會在master下搜索,而我們的spec是存在我們私有的SGTSpecs目錄下的极景,所以需要在Podfile中指定搜索路徑察净,在文件頂部中如下兩行代碼:

$ source "https://github.com/CocoaPods/Specs.git" #官方倉庫地址

$ source "https://github.com/Tony-iOS-Personal/SGTSpecs.git"? #私有倉庫地址

在指定pod的私有庫組件時有一個坑,如pod ‘YXBase’, ‘~> a.b.1’盼樟,cocoaPods實際pod組件的版本為a.b.x(x為當前版本庫中最大值)氢卡。但如何pod指定版本,這就需要修改Podfile.lock文件中PODS:YXBase的版本號和Podfile文件中YXBase版本號一致

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末晨缴,一起剝皮案震驚了整個濱河市译秦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖筑悴,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件们拙,死亡現(xiàn)場離奇詭異,居然都是意外死亡阁吝,警方通過查閱死者的電腦和手機砚婆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來突勇,“玉大人装盯,你說我怎么就攤上這事〖撞觯” “怎么了验夯?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摔刁。 經常有香客問我挥转,道長,這世上最難降的妖魔是什么共屈? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任绑谣,我火速辦了婚禮,結果婚禮上拗引,老公的妹妹穿的比我還像新娘借宵。我一直安慰自己,他們只是感情好矾削,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布壤玫。 她就那樣靜靜地躺著,像睡著了一般哼凯。 火紅的嫁衣襯著肌膚如雪欲间。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天断部,我揣著相機與錄音猎贴,去河邊找鬼。 笑死蝴光,一個胖子當著我的面吹牛她渴,可吹牛的內容都是我干的。 我是一名探鬼主播蔑祟,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼趁耗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疆虚?” 一聲冷哼從身側響起苛败,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤右冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后著拭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纱扭,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年儡遮,在試婚紗的時候發(fā)現(xiàn)自己被綠了乳蛾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鄙币,死狀恐怖肃叶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情十嘿,我是刑警寧澤因惭,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站绩衷,受9級特大地震影響蹦魔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咳燕,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一勿决、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧招盲,春花似錦低缩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶籽,卻和暖如春玩般,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜕衡。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工壤短, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留设拟,地道東北人慨仿。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像纳胧,于是被迫代替她去往敵國和親镰吆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容