整體先說明一下創(chuàng)建一個(gè)私有的podspec包括如下那么幾個(gè)步驟:
- 1.創(chuàng)建并設(shè)置一個(gè)私有的Spec Repo。
- 2.創(chuàng)建Pod所對應(yīng)的podspec文件。
- 3.本地測試配置好的podspec文件是否可用。
- 4.向私有的Spec Repo中提交podspec。
- 5.使用制作的好的Pod。
- 7.更新維護(hù)podspec。
項(xiàng)目中需要兩個(gè)git倉庫,一個(gè)對應(yīng)Spec Repo(步驟創(chuàng)建所需),另一個(gè)是存放你源代碼的地方;
一.創(chuàng)建并設(shè)置一個(gè)私有的Spec Repo
Spec Repo是所有的Pods的一個(gè)索引,就是一個(gè)容器,所有公開的Pods都在這個(gè)里面,他實(shí)際是一個(gè)Git倉庫remote端在GitHub上,但是當(dāng)你使用了Cocoapods后他會(huì)被clone到本地的~/.cocoapods/repos目錄下,可以進(jìn)入到這個(gè)目錄看到master文件夾就是這個(gè)官方的Spec Repo了。如下:

其中GINSpecs 是我自建的Spec Repo;
創(chuàng)建Spec Repo的方式如下:
$ pod repo add <Spec Repo Name> <Spec Repo 倉庫地址>
$ pod repo add GINSpecs https://github.com/***/GINSpecs.git
注意:如果有其他合作人員共同使用這個(gè)私有Spec Repo的話在他有對應(yīng)上述"<Spec Repo 倉庫地址>"倉庫的權(quán)限的前提下執(zhí)行相同的命令添加這個(gè)Spec Repo即可。
特別提醒:此處 <Spec Repo 倉庫地址>不是你的代碼庫地址哦,這個(gè)只是一個(gè)單獨(dú)的git地址,類似官方庫https://github.com/CocoaPods/Specs.git的一個(gè)東西 ,就是你自個(gè)的Spec Repo啦;
二.創(chuàng)建Pod所對應(yīng)的podspec文件。
分兩種情況討論:
case one:已有g(shù)it,coding等可控制版本的倉庫:
在clone 下來的項(xiàng)目根目錄執(zhí)行:
$ pod spec create <repo spec Name>
$ pod spec create GINLibrary
case two:沒有g(shù)it,coding等可控制版本的倉庫:
在需要?jiǎng)?chuàng)建項(xiàng)目的目錄執(zhí)行如下命令:
$ pod lib create < podspec名稱,比如Masonry>
$ pod lib create GINLibrary # 我的叫GINLibrary
case two 會(huì)問你四個(gè)問題,
1.是否需要一個(gè)例子工程;
2.選擇一個(gè)測試框架;
3.是否基于View測試;
4.類的前綴;
根據(jù)個(gè)人喜好選擇即可, 問完這4個(gè)問題他會(huì)自動(dòng)執(zhí)行pod install命令創(chuàng)建項(xiàng)目并生成依賴。
最終生成的目錄如下:

上述四個(gè)問題回答不同,目錄會(huì)稍有不同,重點(diǎn)是 GINLibrary.podspec 這個(gè)東西;
此處說明一點(diǎn):"case two"生成的文件夾名稱一般與podspecName相同,包含Assets和Classes文件夾,用來存放抽離出來封裝好的模塊源代碼;但是在"case one" 時(shí) 不會(huì)創(chuàng)建類似 Pod這個(gè)文件夾,需要手動(dòng)創(chuàng)建一個(gè)文件夾,比如我是自個(gè)建的 Pod/Classes;
此時(shí)將抽離的源碼(無Bug的代碼)放入Classes文件夾中,push 到自己的倉庫,然后打上tag就基本完成了;
push 方式:
$ git add .
$ git commit -s -m "Initial Library"
$ git remote add origin git@coding.net/***/GINLibrary.git #添加源代碼遠(yuǎn)端倉庫
$ git push origin master #提交到源代碼遠(yuǎn)端倉庫
此處的問題:新建的項(xiàng)目, 執(zhí)行git push origin master時(shí),可能提示你"xxx文件已存在的問題",簡單粗暴 加上 -f 強(qiáng)行覆蓋即可;
當(dāng)然,如果是已經(jīng)存在的項(xiàng)目colne 到本地,直接依次 add commit push即可;當(dāng)然你也可以是用github Desktop,sourcetree等可視化工具;
再來看一下如何打 Tag:
$ git tag -m "first release" 0.0.1
$ git push --tags
手一抖打錯(cuò)了,怎么辦? 莫慌:
//查看tag
$ git tag
//刪除一個(gè)指定的tag,并上傳一個(gè)空tag到遠(yuǎn)程tag
$ git tag -d <tagname>
$ git push origin :refs/tags/<tagname> // 一定記得推一個(gè)空的tag到遠(yuǎn)端
三.配置podspec文件并檢測是否可用:
Xcode 打開GINLibrary.podspec,逐項(xiàng)配置即可:
Pod::Spec.new do |s|
s.name = 'GINLibrary'
s.version = '0.0.3'
s.summary = 'GINS Library.' # 簡要信息
s.description = <<-DESC # 描述信息
Copyright ? GIN. All rights reserved;
DESC
s.homepage = 'https://github.com/hehtao/GINLibrary' #工程源碼主頁
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'hehtao' => 'hehtao@163.com' }
s.source = { :git => 'https://github.com/hehtao/GINLibrary.git', :tag => s.version.to_s } #工程源碼位置
s.social_media_url = 'http://www.baidu.com' # 聯(lián)系網(wǎng)址
s.ios.deployment_target = '9.0' # 版本 平臺
s.requires_arc = true
s.source_files = 'Pod/Classes/GINCacheSwipe/**/*' # 重點(diǎn): 抽離的代碼所在位置
#s.public_header_files = 'Pod/Classes/*.h' # 重點(diǎn): 抽離的代碼公開有文件
s.dependency 'MBProgressHUD', '~> 1.1.0' # 重點(diǎn): 抽離的代碼所依賴的其他第三方
s.dependency 'Masonry', '~> 1.0.0'
# s.frameworks = 'UIKit', 'MapKit' # 重點(diǎn): 抽離的代碼所依賴的框架
# 創(chuàng)建subspec
#s.subspec 'GINWipeCache' do |wipeCache|
# wipeCache.source_files = 'GINLibrary/GINWipeCache/**/*'
# wipeCache.public_header_files = 'GINLibrary/GINWipeCache/*.h'
# wipeCache.dependency 'MBProgressHUD', '~> 1.1.0'
# #NetWorkEngine.resource = "Pod/Assets/MLSUIKitResource.bundle"
# end
# s.resource_bundles = { # 資源文件
# 'GINLibrary' => ['GINLibrary/Assets/*.png']
# }
end
更多配置參考:cocoapods 官方介紹
接下來驗(yàn)證配置的podspec 是否可用:
$ pod lib lint
$ pod spec lint
上述兩個(gè)命名都可,建議使用pod spec lint,為什么呢? 因?yàn)榈谝粋€(gè)不夠精細(xì)(暫且這么說吧),即使檢測通過,可能后面push 依然無法通過;當(dāng)出現(xiàn)下面字段說明檢測通過,否則會(huì)有error 或是warning,上述命令追加 --verbose 可查看錯(cuò)誤詳情;
-> GINLibrary (0.0.1)
GINLibrary passed validation.
- 典型錯(cuò)誤:
- ERROR | [iOS] file patterns: The `XXX` pattern did not match any file.
該錯(cuò)誤在已有工程,手動(dòng)建立 podspec時(shí)容易出現(xiàn),在后面更新維護(hù)是也時(shí)常出現(xiàn),直接給出解決方案:
open /Users/userName/Library/Caches/CocoaPods/Pods/External/GINLibrary/035cb9aa62b9d49f904fad1119b83da4-aebfe
打開文件夾,創(chuàng)建文件夾與source_files文件路徑對應(yīng):
Pod/Classes/GINCacheSwipe
簡單點(diǎn)說: 直接把 s.source_files 的頂層文件夾(我的叫Pod)拷貝進(jìn)去即可;也許又有新問題了, GINLibrary下有很多個(gè)類似035cb9aa62b9d49f904fad1119b83da4-aebfe這樣的文件夾,我該改動(dòng)哪一個(gè)呢? 還是簡單粗暴, rm -rf .....GINLibrary/,然后重新執(zhí)行 pod spec lint ,就會(huì)出現(xiàn)一個(gè)新的了
- 常見的warning:
xxxx的網(wǎng)址無法訪問,類似的東西,一般是網(wǎng)絡(luò)不穩(wěn)引起的,重試即可;重試還不行,如果你確定在Safari能正常訪問,辣么直接忽略去提交吧;
四.向私有的Spec Repo中提交podspec。
上述podspec檢測通過之后直接向私有的Spec Repo中提交podspec。
pod repo push GINSpecs GINLibrary.podspec
成功之后 pod update 之后就可以 pod search 到你的 GINLibrary 嘍
GINSpecs 就是第一步中建立的那個(gè)東東!!!
五.使用制作的好的Pod。
use_frameworks!
platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git' # 官方庫 一定要指明
source 'https://github.com/hehtao/GINSpecs.git' # 私有庫 一定要指明
target 'GINLibrary_Example' do
# pod 'GINLibrary', :podspec => '../GINLibrary.podspec'
pod 'GINLibrary' , '~> 0.0.3' # 自己的pod
pod 'MBProgressHUD'
target 'GINLibrary_Tests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
pod 'FBSnapshotTestCase'
pod 'Expecta+Snapshots'
end
end
七.更新維護(hù)podspec。
重復(fù)3-6就好了呦;