鏈接:http://blog.wtlucky.com/blog/2015/02/26/create-private-podspec/
使用Cocoapods創(chuàng)建私有podspec
Cocoapods是非常好用的一個iOS依賴管理工具音婶,使用它可以方便的管理和更新項目中所使用到的第三方庫纠修,以及將自己的項目中的公共組件交由它去管理嵌纲。Cocoapods的介紹及優(yōu)點(diǎn)本文就不在贅述菱鸥,我開始使用Cocoapods還是在兩年前,那個時候它剛剛出現(xiàn)庶近,網(wǎng)上的資料還非常的少枢纠,就連他們自己的HomePage都十分的簡單育苟,我就著手嘗試著使用了一下,用它管理起第三方庫確實(shí)是十分的方便順手醋闭。后來它有了更強(qiáng)大的功能就是自己創(chuàng)建podspec窄驹,更可以設(shè)置私有的庫。
春節(jié)回來上班证逻,一天的工作結(jié)束之后乐埠,需要充實(shí)下自己,正好項目中有一些公共組件需要從龐大的項目體系中剝離出來囚企,而且年前項目終于從SVN遷移到了Git丈咐,真是喜大普奔,大快人心龙宏!這樣項目使用Cocoapods就有了條件棵逊,正好學(xué)習(xí)一下創(chuàng)建私有的podspec并在項目中部署使用,以及pods的subspec的創(chuàng)建及使用银酗。
整體先說明一下創(chuàng)建一個私有的podspec包括如下那么幾個步驟:
創(chuàng)建并設(shè)置一個私有的Spec Repo辆影。
創(chuàng)建Pod的所需要的項目工程文件,并且有可訪問的項目版本控制地址黍特。
創(chuàng)建Pod所對應(yīng)的podspec文件蛙讥。
本地測試配置好的podspec文件是否可用。
向私有的Spec Repo中提交podspec灭衷。
在個人項目中的Podfile中增加剛剛制作的好的Pod并使用次慢。
更新維護(hù)podspec。
在這一系列的步驟中需要創(chuàng)建兩個Git倉庫,分別是第一步和第二步(第二步不一定非要是Git倉庫迫像,只要是可以獲取到相關(guān)代碼文件就可以拭抬,也可以是SVN的,也可以說zip包侵蒙,區(qū)別就是在podspec中的source項填寫的內(nèi)容不同)造虎,并且第一步只是在初次創(chuàng)建私有podspec時才需要,之后在創(chuàng)建其他的只需要從第二步開始就可以纷闺。本文只介紹在Git環(huán)境下的操作算凿,其他環(huán)境其他方式暫不說明。
創(chuàng)建私有Spec Repo
先來說第一步犁功,什么是Spec Repo氓轰?他是所有的Pods的一個索引,就是一個容器浸卦,所有公開的Pods都在這個里面署鸡,他實(shí)際是一個Git倉庫remote端在GitHub上,但是當(dāng)你使用了Cocoapods后他會被clone到本地的~/.cocoapods/repos目錄下限嫌,可以進(jìn)入到這個目錄看到master文件夾就是這個官方的Spec Repo了靴庆。這個master目錄的結(jié)構(gòu)是這個樣子的
12345
.├── Specs└──[SPEC_NAME]└──[VERSION]└──[SPEC_NAME].podspec
因此我們需要創(chuàng)建一個類似于master的私有Spec Repo,這里我們可以fork官方的Repo怒医,也可以自己創(chuàng)建炉抒,個人建議不fork,因為你只是想添加自己的Pods稚叹,沒有必要把現(xiàn)有的公開Pods都copy一份焰薄。所以創(chuàng)建一個Git倉庫,這個倉庫你可以創(chuàng)建私有的也可以創(chuàng)建公開的扒袖,不過既然私有的Spec Repo塞茅,還是創(chuàng)建私有的倉庫吧,需要注意的就是如果項目中有其他同事共同開發(fā)的話季率,你還要給他這個Git倉庫的權(quán)限野瘦。因為GitHub的私有倉庫是收費(fèi)的,我還不是GitHub的付費(fèi)用戶蚀同,所以我使用了其他Git服務(wù)缅刽,我使用的是CODING,當(dāng)然還有其他的可供選擇開源中國蠢络、Bitbucket以及CSDN
創(chuàng)建完成之后在Terminal中執(zhí)行如下命令
12
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]$pod repo add WTSpecs https://coding.net/wtlucky/WTSpecs.git
此時如果成功的話進(jìn)入到~/.cocoapods/repos目錄下就可以看到WTSpecs這個目錄了衰猛。至此第一步創(chuàng)建私有Spec Repo完成。
PS:如果有其他合作人員共同使用這個私有Spec Repo的話在他有對應(yīng)Git倉庫的權(quán)限的前提下執(zhí)行相同的命令添加這個Spec Repo即可刹孔。
創(chuàng)建Pod項目工程文件
這個第二步?jīng)]有什么好介紹的啡省,如果是有現(xiàn)有的組件項目娜睛,并且在Git的版本管理下,那么這一步就算完成了卦睹,可以直接進(jìn)行下一步了畦戒。
如果你的組件還在你冗余龐大的項目中,需要拆分出來或者需要自己從零開始創(chuàng)建一個組件庫结序,那么我建議你使用Cocoapods提供的一個工具將第二步與第三步結(jié)合起來做暂殖。
現(xiàn)在來說一下這個工具抵乓,相關(guān)的文檔介紹是Using Pod Lib Create就拿我創(chuàng)建的podTestLibrary為例子具體講一下這里是如何操作的摆寄,先cd到要創(chuàng)建項目的目錄然后執(zhí)行
1
$pod lib create podTestLibrary
之后他會問你四個問題颂碘,1.是否需要一個例子工程;2.選擇一個測試框架返敬;3.是否基于View測試遂庄;4.類的前綴;4個問題的具體介紹可以去看官方文檔劲赠,我這里選擇的是1.yes涛目;2.Specta/Expecta;3.yes凛澎;4.PTL霹肝。問完這4個問題他會自動執(zhí)行pod install命令創(chuàng)建項目并生成依賴。
123456789101112131415161718
$tree PodTestLibrary -L 2PodTestLibrary├── Example#demo APP│?? ├── PodTestLibrary│?? ├── PodTestLibrary.xcodeproj│?? ├── PodTestLibrary.xcworkspace│?? ├── Podfile#demo APP 的依賴描述文件│?? ├── Podfile.lock│?? ├── Pods#demo APP 的依賴文件│?? └── Tests├── LICENSE#開源協(xié)議 默認(rèn)MIT├── Pod#組件的目錄│?? ├── Assets#資源文件│?? └── Classes#類文件├── PodTestLibrary.podspec#第三步要創(chuàng)建的podspec文件└── README.md#markdown格式的README9 directories, 5 files
以上是項目生成的目錄結(jié)構(gòu)及相關(guān)介紹预厌。
接下來就是向Pod文件夾中添加庫文件和資源阿迈,并配置podspec文件,我把一個網(wǎng)絡(luò)模塊的共有組件放入Pod/Classes中轧叽,然后進(jìn)入Example文件夾執(zhí)行pod update命令,再打開項目工程可以看到刊棕,剛剛添加的組件已經(jīng)在Pods子工程下Development Pods/PodTestLibrary中了炭晒,然后編輯demo工程,測試組件甥角,我并沒有使用提供的測試框架進(jìn)行測試网严,這里就先不介紹了。
注:這里需要注意的是每當(dāng)你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新執(zhí)行一遍pod update命令嗤无。
測試無誤后需要將該項目添加并推送到遠(yuǎn)端倉庫震束,并編輯podspec文件。
通過Cocoapods創(chuàng)建出來的目錄本身就在本地的Git管理下当犯,我們需要做的就是給它添加遠(yuǎn)端倉庫垢村,同樣去GitHub或其他的Git服務(wù)提供商那里創(chuàng)建一個私有的倉庫,拿到SSH地址嚎卫,然后cd到PodTestLibrary目錄
1234
$git add .$git commit -s -m"Initial Commit of Library"$git remote add origin git@coding.net:wtlucky/podTestLibrary.git#添加遠(yuǎn)端倉庫$git push origin master#提交到遠(yuǎn)端倉庫
因為podspec文件中獲取Git版本控制的項目還需要tag號嘉栓,所以我們要打上一個tag,
12
$git tag -m"first release"0.1.0$git push --tags#推送tag到遠(yuǎn)端倉庫
做完這些就可以開始編輯podspec文件了,它是一個Ruby的文件侵佃,把編輯器的格式改成Ruby就能看到語法高亮麻昼,下面我貼上我的podspec文件,并在后面以注釋的形式說明每個字段的含義馋辈,沒有涉及到的字段可以去官方文檔查閱
1234567891011121314151617181920212223242526272829
Pod::Spec.newdo|s|s.name="PodTestLibrary"#名稱s.version="0.1.0"#版本號s.summary="Just Testing."#簡短介紹抚芦,下面是詳細(xì)介紹s.description=<<-DESCTesting Private Podspec.* Markdown format.* Don't worry about the indent, we strip it!DESCs.homepage="https://coding.net/u/wtlucky/p/podTestLibrary"#主頁,這里要填寫可以訪問到的地址,不然驗證不通過# s.screenshots? ? = "www.example.com/screenshots_1", "www.example.com/screenshots_2"? ? ? ? ? #截圖s.license='MIT'#開源協(xié)議s.author={"wtlucky"=>"wtlucky@foxmail.com"}#作者信息s.source={:git=>"https://coding.net/wtlucky/podTestLibrary.git",:tag=>"0.1.0"}#項目地址迈螟,這里不支持ssh的地址叉抡,驗證不通過,只支持HTTP和HTTPS卜壕,最好使用HTTPS# s.social_media_url = 'https://twitter.com/'? ? ? ? ? ? ? ? ? ? ? #多媒體介紹地址s.platform=:ios,'7.0'#支持的平臺及版本s.requires_arc=true#是否使用ARC,如果指定具體文件烙常,則具體的問題使用ARCs.source_files='Pod/Classes/**/*'#代碼源文件地址轴捎,**/*表示Classes目錄及其子目錄下所有文件,如果有多個目錄下則用逗號分開蚕脏,如果需要在項目中分組顯示侦副,這里也要做相應(yīng)的設(shè)置s.resource_bundles={'PodTestLibrary'=>['Pod/Assets/*.png']}#資源文件地址s.public_header_files='Pod/Classes/**/*.h'#公開頭文件地址s.frameworks='UIKit'#所需的framework,多個用逗號隔開s.dependency'AFNetworking','~> 2.3'#依賴關(guān)系驼鞭,該項目所依賴的其他庫秦驯,如果有多個需要填寫多個s.dependencyend
編輯完podspec文件后,需要驗證一下這個文件是否可用挣棕,如果有任何WARNING或者ERROR都是不可以的译隘,它就不能被添加到Spec Repo中,不過xcode的WARNING是可以存在的洛心,驗證需要執(zhí)行一下命令
1
$pod lib lint
當(dāng)你看到
123
-> PodTestLibrary(0.1.0)PodTestLibrary passed validation.
時固耘,說明驗證通過了,不過這只是這個podspec文件是合格的词身,不一定說明這個Pod是可以用的厅目,我們需要在本地做一下驗證,這就是第四步的內(nèi)容了法严,第四步在具體說明损敷。
創(chuàng)建podspec文件
如果從第二步過來,已經(jīng)有了現(xiàn)成的項目深啤,那么就需要給這個項目創(chuàng)建一個podspec文件拗馒,創(chuàng)建它需要執(zhí)行Cocoapods的另外一個命令,官方文檔在這里
1
$pod spec create PodTestLibrary git@coding.net:wtlucky/podTestLibrary.git
執(zhí)行完之后墓塌,就創(chuàng)建了一個podspec文件瘟忱,他其中會包含很多內(nèi)容奥额,可以按照我之前介紹的進(jìn)行編輯,沒用的刪掉访诱。編輯完成之后使用驗證命令驗證一下
1
$pod lib lint
驗證無誤就可以進(jìn)入下一步了垫挨。
本地測試podspec文件
我們可以創(chuàng)建一個新的項目,在這個項目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件触菜,看是否可用九榔。在Podfile中我們可以這樣編輯,有兩種方式
1234
platform:ios,'7.0'pod'PodTestLibrary',:path=>'~/code/Cocoapods/podTest/PodTestLibrary'# 指定路徑pod'PodTestLibrary',:podspec=>'~/code/Cocoapods/podTest/PodTestLibrary/PodTestLibrary.podspec'# 指定podspec文件
然后執(zhí)行pod install命令安裝依賴涡相,打開項目工程哲泊,可以看到庫文件都被加載到Pods子項目中了,不過它們并沒有在Pods目錄下催蝗,而是跟測試項目一樣存在于Development Pods/PodTestLibrary中切威,這是因為我們是在本地測試,而沒有把podspec文件添加到Spec Repo中的緣故丙号。
在項目中編寫代碼先朦,測試庫文件無誤后就可以開始下一步了,提交podspec到Spec Repo中犬缨。
向Spec Repo提交podspec
向Spec Repo提交podspec需要完成兩點(diǎn)一個是podspec必須通過驗證無誤喳魏,在一個就是刪掉無用的注釋(這個不是必須的,為了規(guī)范還是刪掉吧)怀薛。向我們的私有Spec Repo提交podspec只需要一個命令
1
$pod repo push WTSpecs PodTestLibrary.podspec#前面是本地Repo名字 后面是podspec名字
完成之后這個組件庫就添加到我們的私有Spec Repo中了刺彩,可以進(jìn)入到~/.cocoapods/repos/WTSpecs目錄下查看
123456
.├── LICENSE├── PodTestLibrary│?? └── 0.1.0│?? ? ? └── PodTestLibrary.podspec└── README.md
再去看我們的Spec Repo遠(yuǎn)端倉庫,也有了一次提交枝恋,這個podspec也已經(jīng)被Push上去了创倔。
至此,我們的這個組件庫就已經(jīng)制作添加完成了焚碌,使用pod search命令就可以查到我們自己的庫了
12345678
$pod search PodTestLibrary-> PodTestLibrary(0.1.0)Just Testing.pod'PodTestLibrary','~> 0.1.0'- Homepage: https://coding.net/u/wtlucky/p/podTestLibrary- Source:? https://coding.net/wtlucky/podTestLibrary.git- Versions: 0.1.0[WTSpecs repo]
這里說的是添加到私有的Repo三幻,如果要添加到Cocoapods的官方庫了,可以使用trunk工具呐能,具體可以查看官方文檔
使用制作好的Pod
在完成這一系列步驟之后,我們就可以在正式項目中使用這個私有的Pod了只需要在項目的Podfile里增加以下一行代碼即可
1
$pod'PodTestLibrary','~> 0.1.0'
然后執(zhí)行pod update抑堡,更新庫依賴摆出,然后打卡項目可以看到,我們自己的庫文件已經(jīng)出現(xiàn)在Pods子項目中的Pods子目錄下了首妖,而不再是Development Pods偎漫。
更新維護(hù)podspec
最后再來說一下制作好的podspec文件后續(xù)的更新維護(hù)工作,比如如何添加新的版本有缆,如何刪除Pod象踊。
我已經(jīng)制作好了PodTestLibrary的0.1.0版本温亲,現(xiàn)在我對他進(jìn)行升級工作,這次我添加了更多的模塊到PodTestLibrary之中杯矩,包括工具類栈虚,底層Model及UIKit擴(kuò)展等,這里又嘗試了一下subspec功能史隆,給PodTestLibrary創(chuàng)建了多個子分支魂务。
具體做法是先將源文件添加到Pod/Classes中,然后按照不同的模塊對文件目錄進(jìn)行整理泌射,因為我有四個模塊粘姜,所以在Pod/Classes下有創(chuàng)建了四個子目錄,完成之后繼續(xù)編輯之前的PodTestLibrary.podspec熔酷,這次增加了subspec特性
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
Pod::Spec.newdo|s|s.name="PodTestLibrary"s.version="1.0.0"s.summary="Just Testing."s.description=<<-DESCTesting Private Podspec.* Markdown format.* Don't worry about the indent, we strip it!DESCs.homepage="https://coding.net/u/wtlucky/p/podTestLibrary"# s.screenshots? ? = "www.example.com/screenshots_1", "www.example.com/screenshots_2"s.license='MIT's.author={"wtlucky"=>"wtlucky@foxmail.com"}s.source={:git=>"https://coding.net/wtlucky/podTestLibrary.git",:tag=>"1.0.0"}# s.social_media_url = 'https://twitter.com/'s.platform=:ios,'7.0's.requires_arc=true#s.source_files = 'Pod/Classes/**/*'#s.resource_bundles = {#? 'PodTestLibrary' => ['Pod/Assets/*.png']#}#s.public_header_files = 'Pod/Classes/**/*.h's.subspec'NetWorkEngine'do|networkEngine|networkEngine.source_files='Pod/Classes/NetworkEngine/**/*'networkEngine.public_header_files='Pod/Classes/NetworkEngine/**/*.h'networkEngine.dependency'AFNetworking','~> 2.3'ends.subspec'DataModel'do|dataModel|dataModel.source_files='Pod/Classes/DataModel/**/*'dataModel.public_header_files='Pod/Classes/DataModel/**/*.h'ends.subspec'CommonTools'do|commonTools|commonTools.source_files='Pod/Classes/CommonTools/**/*'commonTools.public_header_files='Pod/Classes/CommonTools/**/*.h'commonTools.dependency'OpenUDID','~> 1.0.0'ends.subspec'UIKitAddition'do|ui|ui.source_files='Pod/Classes/UIKitAddition/**/*'ui.public_header_files='Pod/Classes/UIKitAddition/**/*.h'ui.resource="Pod/Assets/MLSUIKitResource.bundle"ui.dependency'PodTestLibrary/CommonTools'ends.frameworks='UIKit'#s.dependency 'AFNetworking', '~> 2.3'#s.dependency 'OpenUDID', '~> 1.0.0'end
因為我們創(chuàng)建了subspec所以項目整體的依賴dependency孤紧,源文件source_files,頭文件public_header_files拒秘,資源文件resource等都移動到了各自的subspec中号显,每個subspec之間也可以有相互的依賴關(guān)系,比如UIKitAddition就依賴于CommonTools翼抠。
編輯完成之后咙轩,在測試項目里pod update一下,幾個子項目都被加進(jìn)項目工程了阴颖,寫代碼驗證無誤之后活喊,就可以將這個工程push到遠(yuǎn)端倉庫,并打上新的tag->1.0.0量愧。
最后再次使用pod lib lint驗證編輯好的podsepc文件钾菊,沒有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了偎肃,命令跟之前是一樣的
1
$pod repo push WTSpecs PodTestLibrary.podspec
之后再次到~/.cocoapods/repos/WTSpecs目錄下查看
12345678910
.├── LICENSE├── PodTestLibrary│?? ├── 0.1.0│?? │?? └── PodTestLibrary.podspec│?? └── 1.0.0│??? ? └── PodTestLibrary.podspec└── README.md3 directories, 4 files
已經(jīng)有兩個版本了煞烫,使用pod search查找得到的結(jié)果為
12345678910111213
$pod search PodTestLibrary-> PodTestLibrary(1.0.0)Just Testing.pod'PodTestLibrary','~> 1.0.0'- Homepage: https://coding.net/u/wtlucky/p/podTestLibrary- Source:? https://coding.net/wtlucky/podTestLibrary.git- Versions: 1.0.0, 0.1.0[WTSpecs repo]- Sub specs:- PodTestLibrary/NetWorkEngine(1.0.0)- PodTestLibrary/DataModel(1.0.0)- PodTestLibrary/CommonTools(1.0.0)- PodTestLibrary/UIKitAddition(1.0.0)
完成這些之后,在實(shí)際項目中我們就可以選擇使用整個組件庫或者是組件庫的某一個部分了累颂,對應(yīng)的Podfile中添加的內(nèi)容為
12345678
source'https://github.com/CocoaPods/Specs.git'# 官方庫source'https://git.coding.net/wtlucky/WTSpecs.git'# 私有庫platform:ios,'7.0'pod'PodTestLibrary/NetWorkEngine','1.0.0'#使用某一個部分pod'PodTestLibrary/UIKitAddition','1.0.0'pod'PodTestLibrary','1.0.0'#使用整個庫
最后介紹一下如何刪除一個私有Spec Repo滞详,只需要執(zhí)行一條命令即可
1
$pod repo remove WTSpecs
這樣這個Spec Repo就在本地刪除了,我們還可以通過
1
$pod repo add WTSpecs git@coding.net:wtlucky/WTSpecs.git
再把它給加回來紊馏。
如果我們要刪除私有Spec Repo下的某一個podspec怎么操作呢料饥,此時無需借助Cocoapods,只需要cd到~/.cocoapods/repos/WTSpecs目錄下朱监,刪掉庫目錄
1
wtlucky@wtluckydeMacBook-Pro:~/.cocoapods/repos/WTSpecs$rm -Rf PodTestLibrary
然后在將Git的變動push到遠(yuǎn)端倉庫即可
123
wtlucky@wtluckydeMacBook-Pro:~/.cocoapods/repos/WTSpecs$git add --all .wtlucky@wtluckydeMacBook-Pro:~/.cocoapods/repos/WTSpecs$git ci -m"remove unuseful pods"wtlucky@wtluckydeMacBook-Pro:~/.cocoapods/repos/WTSpecs$git push origin master