pod install
在項(xiàng)目中第一次使用CocoaPods, 進(jìn)行安裝的時(shí)候使用這個(gè)命令.
在Podfile中增加或刪除某個(gè)pod后, 也是使用這個(gè)命令. 而不是pod update.
每次運(yùn)行pod install命令, 下載并安裝新的pod時(shí), 它會(huì)為Podfile.lock文件中的每個(gè)pod寫入已安裝的版本. 此文件跟蹤每個(gè)pod的已安裝版本并鎖定這些版本(.lock命名因此而來).
當(dāng)運(yùn)行pod install汰寓,它只解析Podfile.lock中尚未列在其中的pod的依賴庫.
對(duì)于已經(jīng)在Podfile.lock中列出的pod,Podfile.lock不會(huì)嘗試檢查是否有更新的版本.
對(duì)于尚未在Podfile.lock中列出的pod, 會(huì)搜索與Podfile(如中所述pod 'MyPod', '~>1.2')匹配的版本或最新的版本.
注: 第一次運(yùn)行pod install的時(shí)候,.xcworkspace項(xiàng)目和Pods目錄還不存在,pod install命令也會(huì)創(chuàng)建.xcworkspace和Pods目錄, 但這是pod install命令的順帶作用嫉髓,而不是它的主要作用.
pod outdated
當(dāng)運(yùn)行pod outdated時(shí), CocoaPods將列出所有比Podfile.lock(每個(gè)pod當(dāng)前安裝的版本)中, 已經(jīng)列出的版本更新的pod版本. 這意味著如果你在這些pod上運(yùn)行pod update PODNAME, 它將會(huì)把指定的pod更新到最新版本.
pod update
當(dāng)運(yùn)行pod update PODNAME時(shí), CocoaPods將嘗試查找PODNAME更新的pod版本, 會(huì)忽略掉Podfile.lock中已經(jīng)存在的版本.
如果直接運(yùn)行pod update, 沒有指定PODNAME, CocoaPods會(huì)把Podfile中所有的pod都更新到最新版本.(如果已經(jīng)是最新版本了, 則不更新)
預(yù)期用途
使用pod update PODNAME, 將只能更新特定的pod(檢查是否存在新版本并相應(yīng)地更新pod). 相反, pod install不會(huì)嘗試更新已安裝的pod的版本.
當(dāng)向Podfile中添加一個(gè)pod時(shí), 應(yīng)該運(yùn)行pod install, 而不是用pod update來安裝這個(gè)新pod.只有在想要更新特定pod(或所有的pod)的版本時(shí)才會(huì)使用pod update.
必須提交的Podfile.lock
有時(shí)候可能你不想提交Pods目錄到源代碼管理中. 但是在多人開發(fā)的情況下, 一定要提交Podfile.lock這個(gè)文件, 因?yàn)檫@個(gè)文件里面記錄了你的Podfile中所有pod的版本信息. 為避免你的Podfile中的pod版本和別人的Podfile中的pod發(fā)生版本不一樣的情況, 而導(dǎo)致出現(xiàn)函數(shù)找不到或者其他的錯(cuò)誤.
場(chǎng)景示例
1.user1創(chuàng)建了項(xiàng)目
user1創(chuàng)建了一個(gè)項(xiàng)目, 并且想用A,B,C這3個(gè)pod庫, 這個(gè)時(shí)候用pod install安裝了這些pod庫, 并且假設(shè)這3個(gè)庫的版本號(hào)都是1.0.0, 這些版本號(hào)等信息會(huì)記錄在Podfile.lock文件中.
2.user1添加了新的pod
根據(jù)項(xiàng)目的進(jìn)度需求, 添加了D這個(gè)pod庫到項(xiàng)目中, 這個(gè)時(shí)候應(yīng)該使用pod install去安裝D這個(gè)庫到項(xiàng)目中, 即使在添加D這個(gè)庫之前,B的版本被維護(hù)者更新到了1.1.0, 使用pod install也只會(huì)安裝D這個(gè)庫到項(xiàng)目中, 而不會(huì)去幫你更新B的版本. 從而不會(huì)出現(xiàn)因?yàn)锽的版本更新后, 假如某些函數(shù)過期了, 或者某些函數(shù)被移除了, 而導(dǎo)致你被迫需要修改項(xiàng)目代碼.
3.user2加入到項(xiàng)目中
假設(shè)團(tuán)隊(duì)中新增加了一位基友user2, 他克隆了項(xiàng)目, 并且pod install. (前提是你沒有把Pods目錄添加到源代碼管理中), 如果你將Podfile.lock提交到了版本控制. 那么基友安裝后的pod會(huì)和你的一模一樣, 不會(huì)出現(xiàn)他的pod版本比你的高. 即便現(xiàn)在C的版本更新到了1.2.0, 基友安裝的也是1.0.0版本. 因?yàn)樵赑odfile.lock中記錄的podC就是1.0.0版本.
4.檢查pod的新版本
后來, user1想要檢查下是否有更新pod的版本. 運(yùn)行pod outdated, 會(huì)告訴你podB有一個(gè)新1.1.0版本, podC已經(jīng)是1.2.0版本. user1決定他想要更新podB, 但不更新podC. 因此, 他會(huì)運(yùn)行pod update B, 將B從1.0.0版本更新到版本1.1.0(并相應(yīng)的更新Podfile.lock), 但會(huì)將podC保留在版本中1.0.0(不會(huì)將其更新為1.2.0).
使用指定版本的Podfile是不夠的
有些人可能會(huì)認(rèn)為, 通過在Podfile中指定pod確切的版本, 像pod 'A', '1.0.0', 就足以保證每一個(gè)人和其他人都會(huì)有相同的版本. 然后他們甚至可以使用pod update, 即使只是添加一個(gè)新的pod, 認(rèn)為它永遠(yuǎn)不會(huì)有更新其他pod版本的風(fēng)險(xiǎn), 因?yàn)樗鼈冊(cè)赑odfile中被固定到了一個(gè)特定的版本.
但事實(shí)上, 這還不足以保證我們上面場(chǎng)景中的user1和user2, 始終獲得所有pod的完全相同的版本. 舉一個(gè)典型的例子, 如果podA中有對(duì)podA2的依賴, 在A.podspecas中聲明dependency 'A2', '~> 3.0'. 在這種情況下,pod 'A', '1.0.0'在你的Podfile中使用的時(shí)候, 確實(shí)會(huì)強(qiáng)制user1和user2始終使用A 1.0.0 的pod版本.
但是: user1最終可能獲取到的A2版本是pod 3.4(因?yàn)槟菚r(shí)A2是最新版本), 當(dāng)user2在以后加入項(xiàng)目時(shí)運(yùn)行pod install, 他可能會(huì)在A2的版本中獲得pod3.5(因?yàn)榫S護(hù)者A2可能在此期間發(fā)布了新版本).
這就是為什么為了確保在每個(gè)團(tuán)隊(duì)成員使用的每臺(tái)電腦上, 所有相同的pod版本的唯一方法, 是使用Podfile.lock和正確使用pod install和pod update的原因.
我應(yīng)該將Pods目錄添加到源代碼管理中嗎冀惭?
是否將Pods文件夾添加到源代碼管理中都取決于你,因?yàn)楣ぷ髁鞒桃蝽?xiàng)目而異. 我們建議您將Pods目錄保留在源代碼管理下, 不要將其添加到您的.gitignore. 但最終這個(gè)決定取決于你:
添加Pod目錄的好處
克隆了repo后, 即使沒有在機(jī)器上安裝CocoaPods, 項(xiàng)目也可以立即構(gòu)建和運(yùn)行. 無需運(yùn)行pod install, 也無需Internet連接.
Pod(代碼/庫)總是可用的, 即使Pod的源(例如GitHub)要關(guān)閉也是如此.
在克隆repo后, Pod組件保證與原始安裝中的組件相同.
忽略Pods目錄的好處
源代碼倉庫將更小, 并且占用更少的空間.
只要所有Pod的源(例如GitHub)都可用, CocoaPods通常能夠重新創(chuàng)建相同的安裝.(從技術(shù)上講, 無法保證pod install在Podfile中不使用提交SHA時(shí), 運(yùn)行將獲取并重新創(chuàng)建相同的組件. 在Podfile中使用zip文件時(shí)尤其如此.)
執(zhí)行源控制操作時(shí)不會(huì)有任何沖突, 例如合并具有不同Pod版本的分支.
無論你是否在忽略Pods目錄, Podfile并Podfile.lock應(yīng)始終版本控制下保持.
######################################################################
命令的詳細(xì)介紹
pod install
pod install一般是你第一次想要為項(xiàng)目添加pod的時(shí)候使用的,它同樣也使用在你為Podfile文件添加或移除pod庫的時(shí)候。
每次pod install命令運(yùn)行的時(shí)候榕莺,pod install會(huì)為每一個(gè)它安裝的pod庫在Podfile.lock文件中寫入其版本號(hào)。Podfile.lock文件追蹤每一個(gè)安裝的pod庫的版本號(hào)棵介,并鎖定這些版本號(hào)钉鸯。
當(dāng)你運(yùn)行pod install是,它將只解決不在Podfile.lock中的pod庫依賴關(guān)系
對(duì)于在Podfile.lock文件中的pod庫邮辽,pod install會(huì)只下載Podfile.lock文件中指定的版本唠雕,而不會(huì)去檢查這個(gè)庫是否有更新的版本。
對(duì)于不在Podfile.lock文件中的pod庫吨述,pod install會(huì)搜索這個(gè)pod庫在Podfile文件中指定的版本(沒指定版本岩睁,就搜索這個(gè)pod庫最新的版本)
pod outdated
每當(dāng)你運(yùn)行pod outdated命令時(shí),CocoaPods會(huì)列出所有在Podfile.lock中的有新版本的pod庫揣云。這意味著當(dāng)你對(duì)這些pod使用pod update PODNAME時(shí)捕儒,他們會(huì)更新(只要新版本仍然遵守你在Podfile中做的類似于pod 'MyPod', '~>x.y'這樣的限制)
pod update
當(dāng)你運(yùn)行了pod update PODNAME命令,CocoaPods會(huì)在不考慮Podfile.lock中版本的情況下試著去查找PODNAME的最新版本(當(dāng)運(yùn)行pod update PODNAME時(shí), CocoaPods將嘗試查找PODNAME更新的pod版本, 會(huì)忽略掉Podfile.lock中已經(jīng)存在的版本.)(Podfile.lock文件中的每個(gè)pod寫入已安裝的版本. 此文件跟蹤每個(gè)pod的已安裝版本并鎖定這些版本)。pod update PODNAME命令會(huì)將相應(yīng)的pod更新到最新的版本(新版本仍然遵守你在Podfile中做的限制)
用法
通過pod update PODNAME,你可以只更新某個(gè)特定的pod庫(檢查是否存在新版本并更新相應(yīng)的pod庫)刘莹。相反阎毅,pod install則不會(huì)去更新已安裝的pod庫。
當(dāng)你向Podfile中添加了pod点弯,你應(yīng)該使用pod install而不是pod update去在不更新已安裝的pod庫的版本基礎(chǔ)上安裝新添加的pod庫扇调。
當(dāng)你想過更新某個(gè)特定pod庫(或所有的庫)的版本時(shí)你只需要使用pod update
提交你的Podfile文件
提醒一下,即使你沒有把Pods文件夾提交到你的共享倉庫蒲拉,你都應(yīng)該總是commit并push你的Podfile.lock文件肃拜。否則的話,將會(huì)破壞pod install能夠鎖定pod庫的已安裝版本的整個(gè)邏輯(如上面所說的那樣) 雌团。 有時(shí)候可能你不想提交Pods目錄到源代碼管理中. 但是在多人開發(fā)的情況下, 一定要提交Podfile.lock這個(gè)文件, 因?yàn)檫@個(gè)文件里面記錄了你的Podfile中所有pod的版本信息. 為避免你的Podfile中的pod版本和別人的Podfile中的pod發(fā)生版本不一樣的情況, 而導(dǎo)致出現(xiàn)函數(shù)找不到或者其他的錯(cuò)誤.
在Podfile中使用確定的版本是不夠的
有人認(rèn)為通過在Podfile中為pod指定確定的版本就足夠保證所有的用戶都會(huì)擁有相同的版本。
隨后他們可能會(huì)只使用pod update(即使是在添加一個(gè)新pod時(shí))士聪,并且認(rèn)為這將不會(huì)更新其他pod庫版本锦援,因?yàn)橐呀?jīng)在Podfile中指定了確定的版本。
但是事實(shí)上剥悟,這樣做不能夠保證用戶1和用戶2總是取得完全相同的pod庫版本灵寺。
一個(gè)典型的例子是,如果pod A依賴于podA2(通過在A.podspec中的dependency 'A2', '~> 3.0聲明的)区岗。在這種情況下略板,在你的Podfile中使用pod 'A', '1.0.0'的確會(huì)強(qiáng)制用戶1和用戶2總是使用podA的1.0.0版本,但是:
用戶1可能會(huì)使用A2的3.4版本
同時(shí)當(dāng)隨后加入項(xiàng)目的用戶2運(yùn)行了pod install命令慈缔,他可能會(huì)得到podA2的3.5版本(因?yàn)锳2的維護(hù)者可能發(fā)布了一個(gè)新的版本)
這就是為什么唯一能夠保證團(tuán)隊(duì)中所有的成員都用使用pod庫的相同版本的方法就是使用Podfile.lock并且正確的使用pod install和pod update