1晋渺、背景:
許多人似乎認(rèn)為
pod install
只在第一次使用 CocoaPods 設(shè)置項(xiàng)目時(shí)使用窄驹,之后才使用pod update
。但事實(shí)并非如此博烂。
2香椎、事實(shí)上:
pod install
:即使你已經(jīng)有Podfile
文件并曾經(jīng)執(zhí)行過pod install
,只要當(dāng)你在Podfile
文件中 add/remoe/update pods 的時(shí)候禽篱,都需要通過執(zhí)行pod install
來 install new pods 畜伐。
pod update [PODNAME]
:只有當(dāng)你希望將 pods 更新到一個(gè)更新的版本的時(shí)候,才執(zhí)行此命令谆级。
pod update [PODNAME]
:將[PODNAME]
更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制)烤礁;pod update
:能夠?qū)⑺?pods 更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制)讼积。
3、命令的詳細(xì)說明:
(1)pod install :
- 每次執(zhí)行
pod install
脚仔,都會(huì)將 add/remove/update 的 pods 的版本號(hào)寫入Podfile.lock
文件中勤众,該文件跟蹤每個(gè)pod的安裝版本并鎖定這些版本。- 運(yùn)行
pod install
時(shí)鲤脏,它只解決Podfile.lock
中沒有列出的 pod 的依賴關(guān)系们颜。
- 對(duì)于
Podfile.lock
中列出的 pod ,它下載Podfile.lock
中列出的顯式版本猎醇,而不嘗試檢查是否有更新的版本可用窥突。- 對(duì)于
Podfile.lock
中沒有列出的 pod ,它會(huì)搜索匹配Podfile
中描述的版本(比如pod 'MyPod'硫嘶, '~>1.2'
)
(2)pod outdated:
當(dāng)您運(yùn)行
pod outdated
時(shí)阻问, CocoaPods 將列出所有比Podfile.lock
中記錄的 pod 版本更新的版本。這意味著如果您在這些 pod 上運(yùn)行pod update [PODNAME]
沦疾,它們將被更新——只要新版本仍然符合這些限制称近。
比如在Podfile
文件中設(shè)置pod 'MyPod', '~>0.1.2'
:
- 執(zhí)行
pod outdated [PODNAME]
哮塞,檢測出更新版本0.1.4
刨秆;
再執(zhí)行pod update [PODNAME]
,會(huì)將[PODNAME]
更新至0.1.4
版本忆畅。- 執(zhí)行
pod outdated [PODNAME]
衡未,檢測出更新版本0.3.1
;
再執(zhí)行pod update [PODNAME]
家凯,則不會(huì)將[PODNAME]
更新至0.3.1
版本缓醋,而是更新至最靠近0.2
的版本。
(3)pod update:
運(yùn)行
pod update [PODNAME]
時(shí)绊诲, CocoaPods 將嘗試找到pod [PODNAME]
的更新版本改衩,而不考慮Podfile.lock
中列出的版本。它將把 pod 更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制)驯镊。
如果運(yùn)行沒有 pod 名稱的pod update
, CocoaPods 會(huì)將Podfile
中列出的每個(gè) pod 更新到可能的最新版本。
4竭鞍、場景示例:
Stage 1: User1 creates the project :
user1 創(chuàng)建一個(gè)項(xiàng)目板惑,并希望使用 pods A、B偎快、C 冯乘。他們用這些 pod 創(chuàng)建一個(gè)
Podfile
,并運(yùn)行pod install
晒夹。
這將安裝 pods A裆馒、B姊氓、C ,我們將說它們都在 1.0.0
版本中喷好。
Podfile.lock
將跟蹤這一點(diǎn)翔横,并注意 A、B梗搅、C 都安裝為 1.0.0
版本禾唁。
- 順便說一句,因?yàn)檫@是他們第一次運(yùn)行
pod install
, pod.xcodeproj 項(xiàng)目還不存在无切,該命令還將創(chuàng)建 Pods.xcodeproj 和 .xcworkspace 荡短,但這是命令的副作用,而不是它的主要作用哆键。
Stage 2: User1 adds a new pod :
稍后掘托, user1 希望將
pod D
添加到他們的Podfile
中。
他們應(yīng)該執(zhí)行pod install
命令籍嘹,這樣即使pod B
發(fā)布了一個(gè)版本1.1.0
闪盔, 命令運(yùn)行以后,pod B
也將繼續(xù)使用之前已經(jīng)安裝的版本1.0.0
—— 因?yàn)?user1 只想添加pod D
,也不用擔(dān)心意外更新pod B
噩峦。
- 這就是有些人錯(cuò)誤的地方锭沟,因?yàn)樗麄冊谶@里使用
pod update
,他們可能認(rèn)為這是“我想用新的pods 更新我的項(xiàng)目” 识补;而不是使用pod install
族淮,在項(xiàng)目中安裝新的 pods 。
Stage 3: User2 joins the project :
然后從未參與過該項(xiàng)目的 user2 加入了團(tuán)隊(duì)凭涂。他們克隆存儲(chǔ)庫祝辣,然后使用
pod install
。
Podfile.lock
的內(nèi)容(應(yīng)該提交到 git repo )將確保它們得到完全相同的 pods 切油,具有與 user1 使用的完全相同的版本蝙斜。
即使pod C
的1.2.0
版本現(xiàn)在可用,user2 也將在1.0.0
版本中獲得pod C
澎胡。因?yàn)檫@是在podfile.lock
中注冊的孕荠。pod C
被Podfile.lock
鎖定到1.0.0
版本。
Stage 4: Checking for new versions of a pod :
稍后攻谁, user1 想要檢查這些 pods 是否有可用的更新稚伍。他們運(yùn)行
pod outdated
,這將告訴他們pod B
有一個(gè)新的版本1.1.0
戚宦,而pod C
有一個(gè)新的版本1.2.0
个曙。
user1 決定更新pod B
,但不更新pod C
; 因此受楼,他們將運(yùn)行pod update B
垦搬,它將把 B 從版本1.0.0
更新到版本1.1.0
(并更新Podfile.lock
)呼寸,但是將保持pod C
在1.0.0
版本中(并且不會(huì)更新到1.2.0
)。
5猴贰、在 Podfile 中使用精確的版本就夠了嗎对雪?
有些人可能認(rèn)為,通過在
Podfile
中指定 pods 的確切版本糟趾,比如pod 'A'慌植、'1.0.0'
,就足以確保每個(gè)用戶都擁有與團(tuán)隊(duì)中其他人相同的版本义郑。然后他們甚至可能使用
pod update
蝶柿,即使只是添加一個(gè)新的 pod ,他們也會(huì)認(rèn)為更新其他 pod 永遠(yuǎn)不會(huì)有風(fēng)險(xiǎn)非驮,因?yàn)樗鼈児潭ㄔ?Podfile
中的特定版本上交汤。但實(shí)際上,這并不足以保證上面場景中的 user1 和 user2 將始終獲得所有 pod 的完全相同版本劫笙。
一個(gè)典型的例子是芙扎,如果
pod A
依賴于在 A.podspec 中聲明的pod 'A2', '~> 3.0'
填大。在這種情況下戒洼,在您的Podfile
中使用pod 'A', '1.0.0'
確實(shí)會(huì)迫使 user1 和 user2 同時(shí)使用pod A
的1.0.0
版本允华,但是:user1 可能最終在
3.4
版本中使用pod A2
(因?yàn)槟鞘钱?dāng)時(shí)A2
的最新版本)
當(dāng) user2 稍后在加入項(xiàng)目時(shí)運(yùn)行pod install
時(shí)圈浇,他們可能在3.5
版本中獲得pod A2
(因?yàn)?A2
的維護(hù)人員可能同時(shí)發(fā)布了一個(gè)新版本)。
小結(jié):
是使用
Podfile.lock
并正確使用pod install
vs.pod update
靴寂。