iOS庫依賴工具CocoaPods 你想知道的都在這

前言 : 這篇文章將從以下幾個方面去解析下Pods 這是一個技術(shù)分享的文字整理

  1. CocoaPods是什么
  2. CocoaPods的構(gòu)成
  3. 相關(guān)文件的理解
  4. Pod命令的理解
  5. CocoaPods幕后發(fā)生了什么
  6. 使用小技巧
  7. 如何制作公開庫
  8. 如何制作私有庫
  9. 其他

1. CocoaPods 是什么

概述: CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個第三方庫的依賴管理工具糊昙,使用這個工具可以簡化對組件依、更新的過程。新添加一些第三方組件可以直接修改 podfile 然后進(jìn)行 pod install;更新已有第三方組件,可以修改 podfile 然后進(jìn)行 pod update亲桥;自己開發(fā)的組件也可以上傳到 CocoaPods 或者私有倉庫,供其他人使用。

2. CocoaPods構(gòu)成

  • CocoaPods 是用 Ruby 寫的暗甥,并由若干個 Ruby 包 (gems) 構(gòu)成
    CocoaPods/Specs: 這個是一個保存第三方組件 podspec 文件的倉庫。第三方組件開發(fā)完成之后捉捅,會傳一份 podspec 文件傳到 CocoaPods撤防,這個 Specs 包含了每個第三方組件所有版本的 podspec 文件。當(dāng)使用某個第三方組件時棒口,如果這些組件支持 CocoaPods寄月,會在 Podfile 中指定 source;
    本地 : ~/.cocoapods/repos/ Github https://github.com/CocoaPods/Specs/tree/master/Specs

  • CocoaPods/CocoaPods: 這是是一個面向用戶的組件,每當(dāng)執(zhí)行一個 pod 命令時无牵,這個組件都將被激活漾肮。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調(diào)用所有其它的 gems 來執(zhí)行任務(wù)

  • CocoaPods/Core: 這個 gem 組件提供支持與 CocoaPods 相關(guān)文件的處理茎毁,例如 Specification克懊、PodfileSource忱辅。當(dāng)執(zhí)行 pod install等一些命令時。Core 組件會解析第三方組件開發(fā)者上傳的 podspec 文件和使用者的 podfile,以此確定需要為 project 引入哪些文件谭溉。除此之外墙懂,當(dāng)執(zhí)行與這些文件一些相關(guān)的命令時,也由這部分組件處理扮念,例如使用 pod spec lint來檢測 podspec 文件的有效性损搬。

  • CocoaPods/Xcodeproj: 使用這個 gem 組件,你可以用 ruby 來創(chuàng)建并修改 Xcode projects柜与。在 CocoaPods 中它負(fù)責(zé)所有工程文件的整合巧勤。如果你想要寫一個腳本來方便的修改工程文件,那么可以單獨(dú)下載這個 gem 并使用

3. 相關(guān)文件

  • podfile : Podfile是一個描述一個或多個Xcode項(xiàng)目的目標(biāo)依賴項(xiàng)的規(guī)范, 指定工程中依賴了那些組件弄匕。主要包含了依賴的組件名踢关、組件版本、組件地址.
  • podfile.lock : 此文件在第一次運(yùn)行后pod install生成粘茄,并跟蹤已安裝的每個Pod的版本
  • Pods: pod集合
  • .xcworkspace: 工作區(qū), 項(xiàng)目入口
  • Manifest.lock: 這是每次運(yùn)行 pod install 命令時創(chuàng)建的 Podfile.lock 文件的副本签舞。如果你遇見過這樣的錯誤 沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),這是因?yàn)?Manifest.lock 文件和 Podfile.lock 文件不一致所引起柒瓣。由于 Pods 所在的目錄并不總在版本控制之下儒搭,這樣可以保證開發(fā)者運(yùn)行 app 之前都能更新他們的 pods,否則 app 可能會 crash芙贫,或者在一些不太明顯的地方編譯失敗搂鲫。

4. 相關(guān)命令

+ cache         操作CocoaPods緩存
+ deintegrate   從項(xiàng)目中解壓縮CocoaPods    
+ env           顯示Pod環(huán)境
+ init          為當(dāng)前目錄生成一個Podfile    
+ install       遵照Podfile.lock 的版本安裝一個依賴
+ ipc           進(jìn)程間通信
+ lib           開發(fā)Pod
+ list          列出所有Pod
+ outdated      顯示過時的項(xiàng)目依賴, 也就是告訴你哪些Pod可以更新了
+ plugins       展示可用的Pod插件
+ search        查詢Pods
+ setup         設(shè)置CocoaPods環(huán)境
+ spec          管理 pod specs
+ trunk         與CocoaPods API交互 (例如想要發(fā)布一個specs
+ update      更新過時的項(xiàng)目依賴關(guān)系和創(chuàng)造新的Podfile.lock

4.1 Pod install 與 Pod update

pod install: 優(yōu)先安裝 Podfile 中改變的組件,并優(yōu)先遵循 Podfile 中的版本號磺平,其次遵循 Podfile.lock 中的版本號魂仍。如果使用的 Podfile 中版本號,會將新的版本號更新到 Podfile.lock 中拣挪。
pod update [PODNAME]: 會根據(jù)當(dāng)前 Podfile 規(guī)則更新組件擦酌。如果 Podfile 中沒有指定版本號,并不會遵循 Podfile.lock菠劝,而是會拉取最新版本赊舶,并更新 Podfile.lock。

建議:
·新添加一個 pod 時赶诊,使用 pod install笼平,不要使用 pod update 去下載一個新的組件,避免更新其他 pod 的版本舔痪。
·更新 pod 版本時寓调,使用 pod update [PODNAME]。
·沒有必要的話锄码,不要使用全局更新 pod update夺英,避免不必要的更新鸠珠。

4.2 指定Pod版本的幾種方式

pod ‘PodName' : 最新版本的Pod
pod 'PodName', ‘0.9’: 指定唯一版本
pod 'PodName', =>’0.9’ 使用邏輯運(yùn)算符
pod 'PodName', ~>’0.9’ 樂觀的運(yùn)算符

///
邏輯運(yùn)算符: 
'=> 0.1' 任何高于0.1的版本
'< 0.1' 任何低于0.1的版本
'<= 0.1' 版本0.1和任何較低版本

樂觀的運(yùn)算符: 
'~> 0.1.2' 版本0.1.2和版本高達(dá)0.2,不包括0.2和更高
'~> 0.1' 版本0.1和版本高達(dá)1.0秋麸,不包括1.0和更高版本
'~> 0' 版本0及更高版本,這與沒有版本基本相同

https://guides.cocoapods.org/syntax/podfile.html

5. CocoaPods幕后發(fā)生了什么

    1. 創(chuàng)建或者更新工作區(qū)
    1. 將項(xiàng)目添加到工作區(qū)
    1. 將CocoaPods需要的靜態(tài)庫添加到工作區(qū)
    1. 將libPods.a 添加到 : targets=> build phases => 與庫進(jìn)行鏈接
    1. 將應(yīng)用程序的目標(biāo)配置更改為CocoaPods
    1. 添加構(gòu)建階段以將資源從您安裝的任何Pod復(fù)制到應(yīng)用的程序包

5.1 Pod install的過程

    1. 查看 ~/.cocoapods/repo/master/Specs (是否存在) 而非是不是最新!!
    1. 存在炬太,也就是校驗(yàn)Podfile并讀取Podfile 也就是從這個本地三方庫信息庫中獲取 Podfile 中對應(yīng)三方庫的 git 地址
    1. 不存在灸蟆,輸出 Setting up CocoaPods Master repo,并拉取三方庫信息庫到 ~/.cocoapods/repo/中
    1. 使用 git 命令從 GitHub 上拉取 Podfile 中對應(yīng)的三方庫源碼
    1. 生成Pods.xcodeproj 如果檢測到改動時亲族,CocoaPods 會利用 Xcodeproj gem 組件對 Pods.xcodeproj 進(jìn)行更新炒考。如果該文件不存在,則用默認(rèn)配置生成

pod install —verbose /// 可以看到一個詳細(xì)的過程

6. 小技巧

大家在使用 pod install 命令時一般會加上 --no-repo-update 選項(xiàng)霎迫。這使得 pod install 不進(jìn)行本地三方庫信息庫 git pull 的更新操作斋枢。若 Podfile 中指定 Alamofire 的版本號為 4.2.0,但本地 ~/cocoapods/repo/master/Specs/Alamofire 中并沒有此版本號,此時使用 pod install --no-repo-update 會出現(xiàn)如下錯誤

eg : cocoapods install error:None of your spec sources contain a spec satisfying the dependencies: Alamofire(~ 4.2.0).

若直接使用 pod install 便會先執(zhí)行 pod repo update知给,由于 github 需要翻墻瓤帚,并且更新的內(nèi)容過大就會等待很久。
既然知道了 Cocoapods 的原理涩赢,我們便可以手動在 ~./cocoapods/repo/master/Specs 中添加我們需要的三方庫版本信息戈次,避免了把所有的并沒有使用到的三方庫信息更新到本地。
下面以添加 Alamofire 4.2.0 版本信息到本地為例子筒扒。

6.1 具體操作

cd ~/.cocoapods/repo/master/Specs/Alamofire/
mkdir 4.2.0
cp ~/.cocoapods/repo/master/Specs/Alamofire/1.1.3/Alamofire.podspec.json ./4.2.0

上面的命令創(chuàng)建了名為 4.2.0 的文件夾怯邪,并復(fù)制了一個庫信息的 json 文件到新創(chuàng)建的文件夾中,用 vi 打開該文件, 我們需要修改版本號花墩,source 的 tag悬秉。那 source 的 tag 怎么知道是多少呢,這個可以從 GitHub 上找到冰蘑。

https://github.com/Alamofire/Alamofire/releases 這里可以找到release版本對應(yīng)的tag

示例.1
示例.2

7. 制作公開庫

  • 創(chuàng)建倉庫的時候要添加一個許可證(Add a license)
  • pod trunk register 1005430006@qq.com 'summerxx27' --verbose
  • pod trunk me
  • pod spec create PodName
  • vim PodName.podspec
  • pod lib lint PodName.podspec
  • 把編輯好的文件推送到代碼庫 git tag ‘1.0.1' git push —tags
  • pod trunk push PodName.podspec

可以參照我之前寫的給庫 添加CocoaPods支持

7.1 Podspec 示例

Pod::Spec.new do |spec|
  spec.name         = 'Reachability'
  spec.version      = '3.1.0'
  spec.license      = { :type => 'BSD' }
  spec.homepage     = 'https://github.com/tonymillion/Reachability'
  spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' }
  spec.summary      = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
  spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
  spec.source_files = 'Reachability.{h,m}'
  spec.framework    = 'SystemConfiguration'
end

7.2 更新公開庫

    1. 把本地的文件podspec 版本更新一下以及更新的代碼 1.0,0 - > 1.0.1 并推送到git
    1. cd 到工程的根目錄: cd /Users/jingtian9/Downloads/GITHUB_REPO/XTAlertViewController
    1. git tag -a 1.0.1 -m 'description'
    1. git push origin 1.0.1
    1. pod trunk push PodName.podspec
    1. pod search PodName

本地文件目錄展示

示例.3

8. 開發(fā)一個私有Pod的工作流程

  1. Podspec文件編寫
  2. Podfile編寫路徑修改

pod 'IMUIKit', :path => "/本地路徑/trunk/kk_espw/IMUIKit"

pod 'IMUIKit', :svn => 'svn地址/trunk/IMUIKit’

9. 其他

1. 使用Pod打包靜態(tài)庫:

https://punmy.cn/2019/05/25/使用cocoapods-packager打包靜態(tài)庫.html

2. 使用CocoaPod進(jìn)行單元測試:

http://www.reibang.com/p/0cca4e12abe7

3. Pod相關(guān)的一些插件:

https://guides.cocoapods.org/plugins/setting-up-plugins.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末和泌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祠肥,更是在濱河造成了極大的恐慌允跑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搪柑,死亡現(xiàn)場離奇詭異聋丝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)工碾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門弱睦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渊额,你說我怎么就攤上這事况木±萋#” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵火惊,是天一觀的道長求类。 經(jīng)常有香客問我,道長屹耐,這世上最難降的妖魔是什么尸疆? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任拷恨,我火速辦了婚禮志衍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚷硫。我一直安慰自己按灶,他們只是感情好症革,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸯旁,像睡著了一般噪矛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺罢,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天摩疑,我揣著相機(jī)與錄音,去河邊找鬼畏铆。 笑死雷袋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辞居。 我是一名探鬼主播楷怒,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓦灶!你這毒婦竟也來了鸠删?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤贼陶,失蹤者是張志新(化名)和其女友劉穎刃泡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碉怔,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烘贴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撮胧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桨踪。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芹啥,靈堂內(nèi)的尸體忽然破棺而出锻离,到底是詐尸還是另有隱情铺峭,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布汽纠,位于F島的核電站卫键,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虱朵。R本人自食惡果不足惜莉炉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卧秘。 院中可真熱鬧,春花似錦官扣、人聲如沸翅敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚯涮。三九已至,卻和暖如春卖陵,著一層夾襖步出監(jiān)牢的瞬間遭顶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工泪蔫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒旗,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓撩荣,卻偏偏與公主長得像铣揉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子餐曹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345