一沸移、概述
Cocoapods是當(dāng)前iOS開(kāi)發(fā)最流行的版本依賴工具,開(kāi)發(fā)者使用Cocoapods進(jìn)行項(xiàng)目的依賴管理會(huì)為開(kāi)發(fā)節(jié)省不少時(shí)間。相信大家都嘗試過(guò)通過(guò)Cocoapods管理自己的項(xiàng)目,但如何將自己開(kāi)發(fā)的代碼發(fā)布到Cocoapods上讓別人也可以搜索使用呢小腊?下面就將介紹trunk方式接入的方法,以及在過(guò)程中可能遇到的坑久窟。
二秩冈、注冊(cè)
接入的第一步就是要注冊(cè)trunk,在注冊(cè)trunk之前需要確認(rèn)當(dāng)前的CocoaPods版本必須在0.33以上斥扛。若低于該版本請(qǐng)打開(kāi)Terminal使用ruby的gem命令更新pod:
sudo gem install cocoapods
若OSX版本在10.11以上請(qǐng)使用以下安裝命令
sudo gem install -n /usr/local/bin cocoapods
版本更新結(jié)束之后我們開(kāi)始注冊(cè)trunk:
pod trunk register <郵箱> <'用戶名'> --description='macbook pro'
其中郵箱是最重要的入问,因?yàn)樽?cè)之后pod會(huì)往你的郵箱發(fā)一封激活郵件,所以郵箱名就當(dāng)相當(dāng)于你的trunkID了稀颁。至于用戶名個(gè)人感覺(jué)寫(xiě)不寫(xiě)都不太有所謂芬失,--description參數(shù)是cocoapods推薦添加的,若以后你在別的設(shè)備上登錄了trunk方便判斷終端信息匾灶,也是一個(gè)可有可無(wú)的參數(shù)棱烂。點(diǎn)擊郵箱中的注冊(cè)鏈接,使用下列命令就可以向trunk服務(wù)器查詢到自己的注冊(cè)信息阶女。
pod trunk me
輸出下列信息即表示注冊(cè)成功:
三颊糜、配置podspec
3.1添加podspec文件
podspec
文件就相當(dāng)于你的項(xiàng)目簡(jiǎn)介,可以讓cocoapods
搜索引擎知道作者名秃踩、項(xiàng)目概述衬鱼、版本號(hào)、源代碼地址憔杨、依賴庫(kù)等信息馁启,因此cocoapods
上的每個(gè)項(xiàng)目都會(huì)有一個(gè)podspec
描述文件。cocoapods
在Github
上通過(guò)一個(gè)repo來(lái)管理所有支持cocoapods
的代碼https://github.com/CocoaPods/Specs芍秆。
如何創(chuàng)建一個(gè)podspec文件呢?我們可以通過(guò):
pod spec create <name>
來(lái)創(chuàng)建一個(gè)podspec文件翠勉,但官方的spec文件寫(xiě)的非常冗余妖啥,看起來(lái)不夠簡(jiǎn)明,如果是第一次寫(xiě)podspec官方的spec文件還是可以去看一下的对碌,畢竟文檔注釋比較詳細(xì)荆虱。最終還是建議參考github上各種開(kāi)源庫(kù)上的podspec文件來(lái)進(jìn)行自身項(xiàng)目的podspec文件配置,在此分享出自己編輯的podspec文件來(lái)供大家學(xué)習(xí)交流。
Pod::Spec.new do |s|
s.name = "ipaynowplugin"
s.version = "1.7.3.42"
s.summary = "ipaynowplugin SDK"
s.description = <<-DESC
Help developer to quickly intergrate variety of payment methods
DESC
s.homepage = "http://www.ipaynow.cn"
s.license = "MIT"
s.author = { "Hstripe" => "huangrui@ipaynow.cn" }
s.platform = :ios, '6.0'
s.source = { :git => "https://github.com/Hstripe/libipaynow.git", :tag => s.version }
s.default_subspec = 'Core'
s.requires_arc = true
s.subspec 'Core' do |core|
core.source_files = "lib/*.h"
core.public_header_files = "lib/*.h"
core.vendored_libraries = "lib/*.a"
core.resource = "lib/*.bundle"
core.frameworks = "CoreGraphics", "CoreTelephony","QuartzCore","SystemConfiguration","Security","Foundation","UIKit"
core.ios.library = 'z', 'sqlite3.0','c++', 'stdc++'
core.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
end
s.subspec 'Alipay' do |ali|
ali.ios.vendored_frameworks = "lib/Channels/AliPayPlugin/AlipaySDK.framework"
ali.resource = "lib/Channels/AliPayPlugin/AlipaySDK.bundle"
ali.dependency "ipaynowplugin/Core"
ali.frameworks = "CoreMotion"
end
s.subspec 'Weixin' do |wx|
wx.ios.vendored_libraries = "lib/Channels/WechatPlugin/*.a"
wx.source_files = "lib/Channels/WechatPlugin/*.h"
wx.public_header_files = "lib/Channels/WechatPlugin/*.h"
wx.dependency "ipaynowplugin/Core"
end
s.subspec 'Unionpay' do |up|
up.vendored_libraries = 'lib/Channels/UPPayPlugin/*.a'
up.source_files = 'lib/Channels/UPPayPlugin/*.h'
up.dependency 'ipaynowplugin/Core'
end
s.subspec 'ApplePay' do |ap|
ap.source_files = 'lib/Channels/UPApplePay/*.h'
ap.public_header_files = 'lib/Channels/UPApplePay/*.h'
ap.vendored_libraries = 'lib/Channels/UPApplePay/*.a'
ap.dependency 'ipaynowplugin/Core'
ap.frameworks = "PassKit"
end
end
接下來(lái)對(duì)幾個(gè)參數(shù)進(jìn)行簡(jiǎn)要的說(shuō)明:
s.name 就是你的項(xiàng)目名了,通過(guò)之后可以使用pod search命令搜索到怀读;
s.version 項(xiàng)目當(dāng)前的版本號(hào)诉位;
s.summary 項(xiàng)目的概要描述;
s.description 項(xiàng)目的詳細(xì)描述菜枷;
s.license 許可文件苍糠,這個(gè)是cocoapods必須要求若沒(méi)有會(huì)無(wú)法通過(guò)驗(yàn)證;
s.source 項(xiàng)目源代碼位置啤誊,一般就是一個(gè)github地址岳瞭;
s.default_subspec 項(xiàng)目默認(rèn)加載的子包,由于我的項(xiàng)目是由多個(gè)包構(gòu)成的所以我會(huì)添加這項(xiàng)蚊锹,若項(xiàng)目只有一個(gè)包則不用填寫(xiě)這個(gè)參數(shù)瞳筏;
以下這幾個(gè)參數(shù)比較重要:
core.source_files 項(xiàng)目主要文件;
core.public_header_files 暴露出的頭文件牡昆;
core.vendored_libraries 項(xiàng)目封的靜態(tài)庫(kù)(根據(jù)項(xiàng)目類型:開(kāi)源姚炕、閉源,沒(méi)有可不填)丢烘;
core.resource 項(xiàng)目用的資源文件(圖片之類的)柱宦;
core.frameworks 依賴的系統(tǒng)的framework框架 ;
core.ios.library 依賴的系統(tǒng)的lib庫(kù)文件铅协;
完成以上參數(shù)配置之后捷沸,接著進(jìn)行下一步
3.2 本地檢查
完成podspec
描述文件的參數(shù)配置之后,最好是先進(jìn)行podspec
文件的本地檢查狐史,命令如下:
pod lib lint --verbose
verbose的作用是輸出過(guò)程中的調(diào)試信息方便我們查錯(cuò)痒给,若有錯(cuò)誤的話根據(jù)Build Failed
中的錯(cuò)誤信息進(jìn)行podspec
內(nèi)容的修改。
如果輸入終端執(zhí)行完之后骏全,顯示的是如下信息:
那么恭喜你苍柏,我們可以進(jìn)行下一步了。
3.3 通過(guò)Trunk push podspec文件
1.在進(jìn)行trunk push之前姜贡,首先確保你已經(jīng)把你的項(xiàng)目文件上傳到Github
上了试吁,若還沒(méi)上傳源碼,可以用終端cd
到項(xiàng)目文件夾執(zhí)行一下操作上傳代碼到Github
git add .
git commit -m "版本內(nèi)容"
git push origin master
2.為你上傳上去的代碼打上tag標(biāo)簽楼咳,使得cocoapods
可以更精確的查找到你的版本
git tag 'tagNum'
git push --tags
所有準(zhǔn)備工作完成之后熄捍,就開(kāi)始最核心的工作trunk push了
pod trunk push yourProjectName.podsepc --verbose 文件名稱請(qǐng)修改成自己的podspec名稱
上面的代碼做了三件事:
1、驗(yàn)證你的podspec文件是否合法,在trunk方式之前我們已經(jīng)用了“pod lib lint”命令進(jìn)行驗(yàn)證母怜;
2余耽、上傳podspec文件到trunk服務(wù)器,最終還是會(huì)上傳到https://github.com/CocoaPods/Specs
中;
3苹熏、將你上傳的podspec文件轉(zhuǎn)成json格式文件碟贾。
通過(guò)本地pod lib lint
的文件一般而言都不會(huì)出什么問(wèn)題币喧,發(fā)生概率最大的問(wèn)題可能就是由于網(wǎng)不給力,導(dǎo)致連接GitHub
困難袱耽。上傳成功之后杀餐,就可以使用
pod search
命令來(lái)搜索自己的項(xiàng)目了。
如果pod search
不到自己的項(xiàng)目朱巨,就需要再手動(dòng)pod setup
一次來(lái)同步自己本地的spec repo史翘,這個(gè)過(guò)程總是漫長(zhǎng)且?guī)в型纯嗟模越ㄗh更新的時(shí)候掛著VPN蔬崩。
四恶座、后續(xù)項(xiàng)目的升級(jí)
當(dāng)你的項(xiàng)目做出了修改之后,當(dāng)然希望cocoapods中的版本也進(jìn)行更新沥阳。此時(shí)就需要更新podspec
描述文件了跨琳,將podspec
文件改成符合你當(dāng)前版本的需求之后。還需要給你GitHub
上的版本打上tag桐罕,而且一定要和podspec
中的s.version
一致脉让。
順帶一提的是podspec
是沒(méi)有“后悔藥”功能的,你一旦發(fā)現(xiàn)你當(dāng)前版本與podspec
描述文件填寫(xiě)不符功炮,你是無(wú)法修改當(dāng)前版本的podspec
的只能提到下個(gè)版本中進(jìn)行修改,這也是一個(gè)比較坑的地方溅潜,因此在填寫(xiě)podspec
文件的時(shí)候務(wù)必要小心謹(jǐn)慎才是。
五薪伏、參考文檔
http://www.cnblogs.com/wengzilin/p/4742530.html
http://www.reibang.com/p/0b516ee6576f/