Cocoapods 構(gòu)建私有podspec

整體先說明一下創(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了。如下:


Snip20171123_2.png

其中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)目并生成依賴。
最終生成的目錄如下:


Snip20171123_3.png

上述四個(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就好了呦;

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

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

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