前言
隨著iOS APP越來(lái)越復(fù)雜,功能越來(lái)越多,對(duì)于iOS項(xiàng)目的工程化要求也越來(lái)越高了,對(duì)于復(fù)雜的APP一般都需要對(duì)項(xiàng)目進(jìn)行模塊化管理,由此引出了iOS組件化開(kāi)發(fā)。
iOS組件化開(kāi)發(fā)很重要的一個(gè)技術(shù)點(diǎn):CocoaPods私有庫(kù)的搭建。
私有庫(kù)由兩部分構(gòu)成項(xiàng)目工程倉(cāng)庫(kù)和索引倉(cāng)庫(kù)。
文章較長(zhǎng),先列一下操作步驟
一、創(chuàng)建一個(gè)私有的索引庫(kù)(spec repo)的遠(yuǎn)程庫(kù)。
二、創(chuàng)建一個(gè)私有的存放項(xiàng)目工程的遠(yuǎn)程庫(kù)。
三、創(chuàng)建索引庫(kù)(spec repo)。
四、創(chuàng)建項(xiàng)目工程,并上傳到遠(yuǎn)程私有倉(cāng)庫(kù)。
五、向私有的索引庫(kù)(spec repo)遠(yuǎn)程庫(kù)提交索引(podspec)。
六、使用自己創(chuàng)建的私有庫(kù)。
七、版本更新。
八、.podspec文件說(shuō)明。
詳細(xì)步驟
(注:github創(chuàng)建私有項(xiàng)目是收費(fèi)的,所以這里選擇免費(fèi)的“碼云”)
一、創(chuàng)建一個(gè)私有的索引庫(kù)(spec repo)的遠(yuǎn)程庫(kù)。
1.創(chuàng)建索引遠(yuǎn)程庫(kù)存放本地索引。

二、創(chuàng)建一個(gè)私有的存放項(xiàng)目工程的遠(yuǎn)程庫(kù)。

三、創(chuàng)建索引庫(kù)(spec repo)。
前往文件夾 ~/.cocoapods/repos,打開(kāi)終端,在終端切換到當(dāng)前目錄下,然后進(jìn)行pod repo add操作,在終端輸入:
pod repo add CZSpec https://gitee.com/__/czspec.git
注:https://gitee.com/__/czspec.git是剛創(chuàng)建好的索引庫(kù)(spec Repo)的私有遠(yuǎn)程庫(kù)地址。

pod repo add操作后會(huì)clone遠(yuǎn)程索引庫(kù)到 ~/.cocoapods/repos文件夾下

四、創(chuàng)建項(xiàng)目工程,并上傳到遠(yuǎn)程私有倉(cāng)庫(kù)。
創(chuàng)建本地pod所需的項(xiàng)目工程文件,在終端,cd切換到某個(gè)目錄下,這里我選擇的是桌面上文件夾Test目錄下的,然后執(zhí)行
pod lib create CZProject

超時(shí)了多執(zhí)行幾次命令就好了
pod lib create CZProject


然后進(jìn)入到CZProject里面找到Classes中的"ReplaceMe.m"文件刪除,然后將自己所需要的文件放到這里目錄下

接下來(lái)最重要的一步,也是很容易忽略的一步,不然提交后檢查會(huì)出現(xiàn)很多問(wèn)題。
具體步驟:
(1)cd 到Example文件下,然后pod install下,更新Example項(xiàng)目的pod。

(2)打開(kāi)example中的項(xiàng)目,找到項(xiàng)目中的podspec文件,更改spec。

修改完成后,cd 到CZProject目錄下,然后驗(yàn)證本地podspec文件有效性,終端命令如下
pod lib lint CZProject.podspec

報(bào)了個(gè)警告提示用--allow-warnings 忽略,再次執(zhí)行命令
pod lib lint CZProject.podspec --allow-warnings
本地項(xiàng)目上傳到遠(yuǎn)程倉(cāng)庫(kù)中,將本地項(xiàng)目與遠(yuǎn)程倉(cāng)庫(kù)相關(guān)聯(lián),使用終端命令:
git remote add origin 遠(yuǎn)程倉(cāng)庫(kù)地址
然后將本地項(xiàng)目推送到遠(yuǎn)端
git push origin master

push到遠(yuǎn)程的時(shí)候出現(xiàn)這種問(wèn)題,然后先pull ,出現(xiàn)下面問(wèn)題(即拒絕合并不相關(guān)的歷史,確實(shí)本地新加的內(nèi)容還從未和線上連接過(guò))

之后輸入如下命令(即告訴允許合并不相關(guān)的歷史內(nèi)容):
git pull origin master --allow-unrelated-histories

解決沖突后上傳到遠(yuǎn)程倉(cāng)庫(kù)

這樣遠(yuǎn)程倉(cāng)庫(kù)就有我們本地的項(xiàng)目了


五、向私有的索引庫(kù)(spec repo)遠(yuǎn)程庫(kù)提交索引(podspec)。
首先需要給CZProject 打標(biāo)簽,打的標(biāo)簽值要與podspec文件中的版本號(hào)一致


然后進(jìn)行.podspec文件本地和遠(yuǎn)程有效性的驗(yàn)證,終端命令如下:
pod spec lint CZProject.podspec

同樣報(bào)了個(gè)警告,再次執(zhí)行命令,忽略警告
pod spec lint CZProject.podspec --allow-warnings
注意:
如果私有庫(kù)中依賴私有庫(kù),則驗(yàn)證podspec文件的時(shí)候需要加上–sources參數(shù),否則會(huì)出現(xiàn)找不到你依賴的私有庫(kù),示例:
pod spec lint yourProjectName.podspec -- sources='git@xxx.xxx.xxx.xxx:/yourProjectName.git,https://github.com/CocoaPods/Specs
向私有的索引庫(kù)(spec Repo)遠(yuǎn)程倉(cāng)庫(kù)中提交podspec
使用命令把私有庫(kù)添加到私有遠(yuǎn)程庫(kù)中。
pod repo push CZSpec CZProject.podspec --verbose --allow-warnings

前往文件夾 ~/.cocoapods/repos去查看CZSpec目錄下的文件如下:

之后,可以通過(guò)終端命令查看第三方框架倉(cāng)庫(kù)源,命令如下:
pod repo

到此,創(chuàng)建私有庫(kù)成功了。
六、使用自己創(chuàng)建的私有庫(kù)。
創(chuàng)建一個(gè)新的工程,在podfile 使用source 指定:

然后跳轉(zhuǎn)到項(xiàng)目目錄,執(zhí)行終端命令pod install,之后就可以使用了。


七、版本更新。
找到工程庫(kù)打開(kāi)CZProject.xcworkspace
1.修改.podspec文件中的版本號(hào)
s.version = '0.1.1' //修改0.1.1版本,不能是之前的版本,要不提交不成功
2.項(xiàng)目上傳到遠(yuǎn)程倉(cāng)庫(kù)
$ git add .
$ git commit -m “XX”
$ git push
3.打tag并上傳
$ git tag '0.1.1'
$ git push --tags
4.驗(yàn)證pod并提交到pod
$ pod spec lint CZProject.podspec --allow-warnings //遠(yuǎn)程本地pod驗(yàn)證
$ pod repo push CZSpec CZProject.podspec --verbose --allow-warnings //提交pod CZSpec 是之前生成的本地庫(kù)名 CZProject.podspec 工程索引文件
八、.podspec文件說(shuō)明。
Pod::Spec.new do |s|
# 項(xiàng)目的名稱
s.name = 'CZProject'
# 項(xiàng)目的版本號(hào),通過(guò)項(xiàng)目git的tag標(biāo)簽進(jìn)行對(duì)應(yīng),這里的標(biāo)簽代表的版本
s.version = '0.1.0'
# 項(xiàng)目簡(jiǎn)單的描述信息
s.summary = 'A short description of CZProject.'
# 項(xiàng)目的詳細(xì)描述信息,注意,這里的文字的長(zhǎng)度,一定要比上面的s.summary長(zhǎng),不然會(huì)認(rèn)為格式不合格
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 項(xiàng)目的網(wǎng)頁(yè)主頁(yè)信息,這里可以直接寫自己的遠(yuǎn)程倉(cāng)庫(kù)的主頁(yè)的地址
s.homepage = 'https://www.baidu.com'
# 截圖
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 開(kāi)源協(xié)議
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 作者信息
s.author = { 'chaozai' => '164125801@qq.com' }
# 項(xiàng)目地址,這里不支持ssh的地址,驗(yàn)證不通過(guò),只支持HTTP和HTTPS,最好使用HTTPS
s.source = { :git => 'https://gitee.com/___/czproject', :tag => s.version.to_s }
# 多媒體介紹地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 支持的平臺(tái)及版本
s.ios.deployment_target = '9.0'
# 代碼源文件地址,**/*表示Classes目錄及其子目錄下所有文件,如果有多個(gè)目錄下則用逗號(hào)分開(kāi),如果需要在項(xiàng)目中分組顯示,這里也要做相應(yīng)的設(shè)置
s.source_files = 'CZProject/Classes/**/*'
# 資源文件地址
# s.resource_bundles = {
# 'CZProject' => ['CZProject/Assets/*.png']
# }
# 公開(kāi)頭文件地址
# s.public_header_files = 'Pod/Classes/**/*.h'
# 所需的framework,多個(gè)用逗號(hào)隔開(kāi)
# s.frameworks = 'UIKit', 'MapKit'
# 依賴關(guān)系,該項(xiàng)目所依賴的其他,當(dāng)在加載的時(shí)候也會(huì)一塊把相關(guān)的依賴的庫(kù)加載下來(lái),如果有多個(gè)需要填寫多個(gè)
# s.dependency 'AFNetworking', '~> 2.3'
end