CocoaPods 原理


pod .jpg

遠(yuǎn)程 pods 庫(kù):可以是CocoaPods 公共庫(kù),也可以是一個(gè)自定義的 Git 倉(cāng)庫(kù)(遠(yuǎn)程私有庫(kù)),
本地索引庫(kù):位置可以通過(guò)命令$cd ~/.cocoapods/repos進(jìn)入.公共庫(kù)和私有庫(kù)都會(huì)在該路徑下
源代碼庫(kù):可以是CocoaPods公共Git倉(cāng)庫(kù)中的庫(kù),也可以用任何一個(gè)Git, Mercurial或者SVN倉(cāng)庫(kù)取代,并且還可以指定具體的commit, branch或者tag。
.spec 文件:

Pod::Spec.new do |s|
  s.name     = 'NSHipsterKit'
  s.version  = '1.0.0'
  s.license  = 'MIT'
  s.summary  = "A pretty obscure library.
                You've probably never heard of it."
  s.homepage = 'http://nshipster.com'
  s.authors  = { 'Mattt Thompson' =>
                 'mattt@nshipster.com' }
  s.social_media_url = "https://twitter.com/mattt"
  s.source   = { :git => 'https://github.com/nshipster/NSHipsterKit.git', :tag => '1.0.0' }
  s.source_files = 'NSHipsterKit'
end

Podfile文件:

source 'https://github.com/shijianmei/RemotePrivateSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target 'remotePrivateLibDemo' do
  # use_frameworks!
    pod ‘remotePrivateLib’
end

pod init可以初始化一個(gè)該文件.
pod 'NSHipsterKit', '~> 1.0'可以設(shè)置項(xiàng)目的依賴庫(kù)
.podspec文件也可以作為管理內(nèi)部代碼的利器:
pod 'Z', :path => 'path/to/directory/with/podspec'
source 可以設(shè)置公共庫(kù)源也可以設(shè)置遠(yuǎn)程私有庫(kù)源

下載原理

pod 'LPLineChartView', :git => 'https://github.com/xiaofei86/LPLineChartView.git', :tag => '1.0.0'

當(dāng)使用 CocoaPods 導(dǎo)入私有庫(kù)時(shí),CocoaPods 先是根據(jù):git => 'https://github.com/xiaofei86/LPLineChartView.git'找到對(duì)應(yīng)的 Git 倉(cāng)庫(kù),然后根據(jù):tag => '1.0.0'定位到對(duì)應(yīng) tag 的提交(如果沒(méi)有注明 Pod 依賴庫(kù)版本則定位到最后一次的提交),然后在這次提交中檢索到后綴為“.podspec”的文件(文件可以隨便命名)。找到 Podspec 文件后先要驗(yàn)證 s.name 是否與Podfile中的一致,如果不一致則 install 時(shí)會(huì)報(bào)錯(cuò)“[!] Unable to find a specification for 'LPLineChartView'.”。驗(yàn)證成功后,就會(huì)根據(jù) Podspec 中的 s.source_files 找到需要導(dǎo)入代碼文件,并通過(guò)其他的數(shù)據(jù)找到對(duì)應(yīng)的配置文件或資源文件等。最后,將其下載到本地項(xiàng)目中。如果是公有庫(kù),這些原理也相同。只是公有庫(kù)需要將 Podspec 文件上傳到 CocoaPods。在導(dǎo)入的時(shí)候通過(guò)名字 LPLineChartView 去 CocoaPods 匹配對(duì)應(yīng)的 Podspec ,然后根據(jù)"s.source"去找到對(duì)應(yīng)的倉(cāng)庫(kù)和對(duì)應(yīng)的版本,然后會(huì)再去匹配新的 Podspec,后邊的步驟就完全相同了。

  • 對(duì)下載原理的驗(yàn)證有興趣的可以點(diǎn)擊這里查看。

集成原理

當(dāng)所有的依賴庫(kù)都下載完后,CocoaPods 會(huì)將所有的依賴庫(kù)都放到另一個(gè)名為 Pods 的項(xiàng)目中,然后讓主項(xiàng)目依賴 Pods 項(xiàng)目。這樣,源碼管理工作都從主項(xiàng)目移到了 Pods 項(xiàng)目中。Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴這個(gè).a文件即可。對(duì)于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將 Pods 依賴庫(kù)的各種資源文件復(fù)制到目標(biāo)目錄中。CocoaPods 還通過(guò)一個(gè)名為 Pods.xcconfig 的文件來(lái)在編譯時(shí)設(shè)置所有的依賴和參數(shù)。

版本控制原理

當(dāng)執(zhí)行完 pod install 之后,CocoaPods會(huì)生成一個(gè)名為 Podfile.lock 的文件。Podfile.lock 文件最大得用處在于多人開(kāi)發(fā)。如果你沒(méi)有在 Podfile 中指定 Pods 版本pod 'LPLineChartView',那么默認(rèn)為獲取當(dāng)前 LPLineChartView 依賴庫(kù)的最新版本。當(dāng)團(tuán)隊(duì)中的某個(gè)人執(zhí)行完 pod install 命令后,生成的 Podfile.lock 文件就記錄下了當(dāng)時(shí)最新 Pods 依賴庫(kù)的版本,這時(shí)團(tuán)隊(duì)中的其它人 check 下來(lái)這份包含 Podfile.lock 文件的工程以后,再去執(zhí)行 pod install 命令時(shí),獲取下來(lái)的 Pods 依賴庫(kù)的版本就和最開(kāi)始用戶獲取到的版本一致。如果沒(méi)有 Podfile.lock 文件,后續(xù)所有用戶執(zhí)行 pod install 命令都會(huì)獲取最新版本的 LPLineChartView,這就有可能造成同一個(gè)團(tuán)隊(duì)使用的依賴庫(kù)版本不一致,這對(duì)團(tuán)隊(duì)協(xié)作來(lái)說(shuō)絕對(duì)是個(gè)災(zāi)難!在這種情況下,如果團(tuán)隊(duì)想使用當(dāng)前最新版本的 LPLineChartView 依賴庫(kù),有兩種方案:1.更改 Podfile,使其指向最新版本的 LPLineChartView 依賴庫(kù);2.執(zhí)行 pod update 命令;鑒于 Podfile.lock 文件對(duì)團(tuán)隊(duì)協(xié)作如此重要,所以應(yīng)該加入到版本控制里面(This file should always be kept under version control)

參考資料:
http://www.itdecent.cn/p/fb202af858fd
[NSHipster] CocoaPods
[唐巧]用CocoaPods做iOS程序的依賴管理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容