最近公司項目重構(gòu),準備利用Cocoapods組件化。
網(wǎng)上這篇文章已經(jīng)說的非常好了,我也是參照這篇文章,不過也有一些小坑需要趟一下,所以整理如下。
Cocoapods是非常好的項目依賴管理工具,類似的還有Carthage,不過一番權(quán)衡,還是用CP了。
既然是公司項目肯定得建個私有庫,將項目的不同部分合適的切分成不同的模塊,有的模塊還有父子依賴關(guān)系,再上傳到私有庫上,定期維護這些庫就可以了,這樣可以有效和劃分人員和代碼的職責,方便管理。
最終,項目被分成了三個庫,分別是A(工具庫)、B(數(shù)據(jù)庫)、C(一個復(fù)雜視圖封裝好的組件庫),BC依賴于A,BC之間互相獨立。
下面是具體實現(xiàn)記錄:
創(chuàng)建并設(shè)置一個私有的Spec Repo
上面的ABC就是我們的私有pods, 而Spec Repo就是私有的pods的集合倉庫,地位等同于公共的Cocoapods倉庫,等我們配置完成后,用命令pod search XXXX,就會依次搜索公共ocoapods倉庫和我們的私有倉庫。
Spec Repo本質(zhì)是一個git倉庫,倉庫中保存著每一個私有pods的索引文件,索引文件記錄了各個私有pods的關(guān)鍵信息,比如名稱,代碼地址,介紹之類的。
首先建一個普通的私有倉庫,一般放在公司的服務(wù)器上,可以取名叫某某公司的pods就行,讓后告訴cocoapod這是我們的私有倉庫
pod repo add WTSpecs https://coding.net/wtlucky/WTSpecs.git
本地的/Users/xxx/.cocoapods/repo/文件夾下就會多出這個倉庫了
創(chuàng)建Pod項目
pods集合倉庫建好后,就開始逐個創(chuàng)建私有pods的倉庫,因為所有的私有pod都依賴A倉庫,所以要先搞A
具體命令是pod lib create A, Cocoapods會根據(jù)你的設(shè)置創(chuàng)建好模板工程,讓后就可以在模板里寫代碼了,
pod的模板工程中包括以下的幾個關(guān)鍵的文件或文件夾,
A/,存放代碼和資源的地方,里面包括Class,Assets
A.podspec,這個就是私有pod的身份證了,里面記錄了這個pod的所有信息,當我們把這個pod提交到pods集合倉庫時,本質(zhì)就是提交這個podspec文件過去,不然pods集合倉庫的空間根本不夠用。
Example/,這是在創(chuàng)建模板時,默認會建的文件夾,里面存放了依賴這個pod的demo工程,當讓也可以用模板的,手動搞一個。
首先看看podspec的內(nèi)容:
#
# Be sure to run `pod lib lint A.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'A'
s.version = '0.1.0'
s.summary = 'A short description of A.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/chdo002/A'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'chdo002' => '1107661983@qq.com' }
s.source = { :git => 'https://github.com/chdo002/A.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'A/Classes/**/*'
# s.resource_bundles = {
# 'A' => ['A/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
揀幾個關(guān)鍵的說下,
s.name 需要想好,最好有公司或者單位前綴,不然有大坑,而且不好改,后面細說
s.version指定了這個pod的版本,非常重要。
s.homepage和s.source,指定了倉庫的地址,需要填寫正確
s.source_files 指向我們的代碼路徑,這里統(tǒng)配了這個路徑下的所有文件
s.resource_bundles 是說明我們的pod所包含的資源文件用的,在工程中,這些資源會被打包成bundle,放在這個pod名的framework下,所以不需要擔心資源重名問題
s.frameworks和s.dependency是pod的系統(tǒng)依賴和對其他pod的依賴,這里有點需要注意,如果依賴的其他pod是私有庫的話,我們也不能在這里說明,需要在外部處理,見下文。
這些屬性的驗證可以通過命令pod lib lint檢查,實際上這個命令也是檢查項目代碼能否順利編譯。
在哪寫私有pod代碼呢?
打開example下的項目worksapce文件,可以看到在podstarget下有個Development Pods文件夾,這個就是我們的私有pods存在的地方,刪掉里面的ReplaceMe.m文件就可以了。
當寫完一部分代碼,想要看看是否奏效時,在example路徑下執(zhí)行pod install更新工程,這個和普通的操作沒有區(qū)別。
一番編寫調(diào)試完成,我們的私有pods沒有問題的話,那就可以提交第一個版本了
向Spec Repo提交podspec
向Spec Repo提交podspec之前還是需要幾步操作,
首先向pod遠程倉庫提交代碼,用pod lib lint驗證,可以加上--verbose查看具體的編譯過程,這一步也是比較容易出錯的地方,不過出錯的原因都會詳細說明。
編譯通過的話,就可以commit,并在這個commit打上個tag,tag要與這此pod的版本一致。
比如我這次提交的pod版本是0.0.1,那我就要打個0.0.1的tag,git tag -m "A pod first Release" "0.0.1"
然后都push上去,git push origin --tags
最后就是pod repo push WTSpecs A.podspec, 這一步也是會執(zhí)行pod lib lint的,你也可以添加--verbose和其他參數(shù)。
如果一切順利,在本地路徑/Users/xx/.cocoapods/repo/WTSpecs下可以發(fā)現(xiàn)我們提交的pod,這樣你就可以在自己的工程引用這個私有的pod了
使用私有pod
在Podfile中有兩種方法可以引用,
方法一
use_frameworks!
target 'Test_Example' do
# 這里可以單獨指定這個私有pod的源
pod 'A', :source => 'https://coding.net/wtlucky/podTestLibrary.git'
end
方法二
use_frameworks!
# 在這里也可以全局指定pod源,這樣在加載pod時,就會先從官方庫中找,然后去我們的私有庫中找,所以一定要把私有pod的名稱和官方庫中pod的名稱區(qū)分開,最好先pod search確定下。
source 'https://github.com/CocoaPods/Specs.git' # 官方庫
source 'https://coding.net/wtlucky/podTestLibrary.git' # 私有庫
target 'Test_Example' do
# 這里可以單獨指定這個私有pod的源
pod 'A'
pod 'FMDB'
end
pod的更新。
對podA的維護更新,也是比較簡單的。
改完的代碼提交一個commit,然后打上相應(yīng)的tag,比如說0.0.2,讓后都push上去,
再pod repo push WTSpecs A.podspec即可
其他
依賴問題
在做Bpod時,因為依賴了私有庫A,所以要寫s.dependency 'A',同時這個pod還依賴了其他官方庫中的pod,比如說AFNetworking。
在pod lib lint或者pod repo push,就需要說明這個pod的源了,具體為什么不能再pods spec中指明各個依賴的源還不清楚,
在命令后面加上
--sources=https://github.com/CocoaPods/Specs.git,https://coding.net/wtlucky/podTestLibrary.git
就可以了,意思是要指明編譯時的源
緩存
pod repo push 提交后一般要清一下pod緩存 pod cache clean --all, 然后調(diào)用pod setup更新
常用命令
刪除本地tag git tag -d 0.0.1
刪除遠程tag git push origin --delete tag 0.0.1