題內(nèi)話
之前在網(wǎng)上看了一些關(guān)于使用 CocoaPods 創(chuàng)建私有庫(kù)的相關(guān)文章,看著看著就被那些步驟給搞暈了恕汇,不知道先做什么后做什么,搞不清配置信息中填寫的地址是模塊的地址還是 .podspec 的地址或辖。后來(lái)靜下心來(lái)整理了下思路瘾英,如果是我的話,我會(huì)怎么處理颂暇。
我的思考
很多文章的標(biāo)題都是說(shuō)創(chuàng)建私有庫(kù)缺谴,我覺(jué)得這類標(biāo)題不夠準(zhǔn)確。應(yīng)該是“創(chuàng)建及管理私有庫(kù)”比較準(zhǔn)確耳鸯。從“創(chuàng)建及管理私有庫(kù)”這點(diǎn)就可以看出湿蛔,我們需要分成兩個(gè)部分來(lái)處理。
第一部分:創(chuàng)建私有庫(kù)
需要的內(nèi)容:
1)私有庫(kù)的代碼及資源文件等县爬。
2)管理這個(gè)私有庫(kù)信息的一個(gè)配置文件 .podspec阳啥。
要記住的是,這個(gè)配置文件中的配置信息只針對(duì)這個(gè)私有庫(kù)本身展開财喳,比如私有庫(kù)的創(chuàng)建者信息察迟,版本號(hào)是多少,倉(cāng)庫(kù)地址在哪耳高,需要導(dǎo)入哪些系統(tǒng)庫(kù)和三方庫(kù)等等扎瓶。
可以參考 AFNetworking 的配置文件。
第二部分:管理私有庫(kù)
這里說(shuō)的管理私有庫(kù)泌枪,其實(shí)就是存放所有私有庫(kù)的配置文件概荷。目的是為了在項(xiàng)目中需要使用一些私有庫(kù)時(shí),你需要知道從哪里找到這些私有庫(kù)一樣工闺。類似于乍赫,當(dāng)我們使用一些第三方庫(kù)的時(shí)候瓣蛀,我們會(huì)通過(guò) CocoaPods 找到并導(dǎo)入這些第三方庫(kù)一樣。
這兩部分既是相互獨(dú)立又是相互關(guān)聯(lián)的雷厂。你創(chuàng)建私有庫(kù)就只管創(chuàng)建惋增,不用管怎么去管理這個(gè)私有庫(kù),那不是它本身的職責(zé)改鲫。創(chuàng)建完成后诈皿,管理的職責(zé)就交給了第二部分。
步驟
創(chuàng)建私有庫(kù)
- 新建工程像棘,編寫實(shí)現(xiàn)代碼稽亏。(因?yàn)槭撬接械模怨こ虘?yīng)該放在遠(yuǎn)程的私有倉(cāng)庫(kù)中缕题。)
-
創(chuàng)建 .podspec 文件截歉。(一般習(xí)慣將模塊名作為文件名,這里為 ModuleA.podspec)
通過(guò)
pod spec create 文件名
創(chuàng)建 .podspec 文件烟零。內(nèi)容如下:
Pod::Spec.new do |s|
# 模塊名
s.name = "ModuleA"
# 版本號(hào)瘪松。需要注意的是:當(dāng)倉(cāng)庫(kù)代碼 push 到遠(yuǎn)程倉(cāng)庫(kù)的時(shí)候,需要打上 tag锨阿。tag 和 版本號(hào)必須一致O馈!墅诡!
s.version = "0.0.1"
# 簡(jiǎn)短描述
s.summary = "A short description of ModuleA."
# 模塊主頁(yè)壳嚎,如 https://gitlab.com/xxx/ModuleA
s.homepage = "http://EXAMPLE/ModuleA"
# license 類型
s.license = { :type => "MIT", :file => "FILE_LICENSE" }
# 創(chuàng)建者信息
s.author = { "姓名" => "郵箱地址" }
# 平臺(tái)信息,后面的數(shù)字指的是最低的系統(tǒng)要求末早。
s.platform = :ios, "9.0"
# When using multiple platforms
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
# s.watchos.deployment_target = "2.0"
# s.tvos.deployment_target = "9.0"
# 遠(yuǎn)程倉(cāng)庫(kù)路徑
s.source = { :git => "http://EXAMPLE/ModuleA.git", :tag => "#{s.version}" }
# 需要暴露給別人的代碼文件
s.source_files = "Classes", "Classes/**/*.{h,m}"
# 需要暴露給別人的資源文件
# s.resources = "Resources/*.png"
# 需要添加的系統(tǒng) framework
# s.frameworks = "SomeFramework", "AnotherFramework"
# 需要添加的系統(tǒng) .tbd 庫(kù)
# s.libraries = "iconv", "xml2"
# 是否是 ARC 環(huán)境
s.requires_arc = true
# xcconfig 路徑配置
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# 需要依賴的三方庫(kù)
# s.dependency "JSONKit", "~> 1.4"
end
- 將工程 push 到遠(yuǎn)程烟馅,并且打上 tag(必須打上 tag,且和 .podspec 中的版本號(hào)一致)荐吉。
管理私有庫(kù)
在遠(yuǎn)程新建一個(gè)倉(cāng)庫(kù) specRepo焙糟,這個(gè)倉(cāng)庫(kù)專門只用來(lái)存放各個(gè)模塊的 .podspec 文件。
通過(guò)命令
pod repo add privateSpec https://gitlab.com/xxx/specRepo.git
在本地~/.cocoapods/repos
下目錄名為 privateSpec 的文件夾下克隆遠(yuǎn)程 git 倉(cāng)庫(kù)样屠。
- 進(jìn)入模塊 ModuleA 根目錄下穿撮,通過(guò)命令
pod repo push privateSpec ModuleA.podspec
將 ModuleA.podspec 推送到第 2 步的 privateSpec 倉(cāng)庫(kù)中。這個(gè)命令會(huì)同時(shí)把 ModuleA.podspec 更新到遠(yuǎn)程的 git 倉(cāng)庫(kù)中痪欲。
結(jié)果如下:
privateSpec下的podspec文件.png
-
在模塊 ModuleA 根目錄下悦穿,通過(guò)命令
pod lib lint --no-clean
驗(yàn)證 .podspec 文件有效性。ps:必須將所有文件同步到遠(yuǎn)程之后才能驗(yàn)證成功业踢。如果還有報(bào)錯(cuò)栗柒,請(qǐng)自行排查。
至此,完成了創(chuàng)建及管理私有庫(kù)的所有步驟瞬沦。
測(cè)試
- 新建工程太伊,進(jìn)入根目錄,然后通過(guò)命令
pod init
將工程通過(guò) pod 進(jìn)行管理逛钻。此時(shí)出現(xiàn) Podfile 文件僚焦。
pod 管理.png
-
打開 Podfile 文件,進(jìn)行編輯
在最前面添加先添加管理私有庫(kù)的 specRepo 倉(cāng)庫(kù)的 git 地址曙痘,再添加 CocoaPods 倉(cāng)庫(kù)的 git 地址芳悲。Podfile 文件.png
-
通過(guò)命令
pod install
安裝私有庫(kù)。ps:如果
pod install
報(bào)錯(cuò)边坤,將source 'https://gitlab.com/xxx/specRepo.git'
換成 git 形式的路徑source 'git@gitlab.com:xxx/specRepo.git'
試試名扛。報(bào)錯(cuò).png