一,pod install,pod outdated,pod update 簡單介紹
-
pod install
- 使用場景
- 在項目中第一次使用CocoaPods, 進行安裝的時候使用這個命令.
- 在
Podfile
中增加
或刪除
某個pod后, 也是使用這個命令. 而不是pod update
.
- 使用場景
-
- 使用說明
- 每次運行
pod install
命令, 下載並安裝新的pod時, 它會為Podfile.lock
文件中的每個pod寫入已安裝的版本. 此文件跟蹤每個pod的已安裝版本並鎖定這些版本(.lock命名因此而來). - 當運行
pod install
,它只解析Podfile.lock
中尚未列在其中的pod的依賴庫.- 對於已經在
Podfile.lock
中列出的pod,Podfile.lock
不會嘗試檢查是否有更新的版本. - 對於尚未在
Podfile.lock
中列出的pod, 會搜索與Podfile
(如中所述pod ‘MyPod’, ‘~>1.2’)匹配的版本或最新的版本.
- 對於已經在
- 每次運行
- 使用說明
-
- 使用注意
第一次運行pod install
的時候,.xcworkspace項目
和Pods目錄
還不存在,pod install
命令也會創建.xcworkspace
和Pods目錄
, 但這是pod install
命令的順帶作用
,而不是它的主要作用
.
- 使用注意
-
pod outdated
- 使用場景
當運行pod outdated
時, CocoaPods將列出所有比Podfile.lock
(每個pod當前安裝的版本)中, 已經列出的版本和更新的pod版本。 - 使用說明
pod outdated 主要是當前項目中的所有引用第三方當前版本和最新版本的狀態。這意味着如果你在這些pod上運行pod update PODNAME
, 它將會把指定的pod更新到最新版本.
- 使用場景
-
pod update
- pod update PODNAME
當運行pod update PODNAME
時, CocoaPods將嘗試查找PODNAME
更新的pod版本, 會忽略掉Podfile.lock
中已經存在的版本. - pod update
如果直接運行pod update
, 沒有指定PODNAME
, CocoaPods會把Podfile中所有的pod都更新到最新版本.(如果已經是最新版本了, 則不更新)
- pod update PODNAME
二,預期用途
使用
pod update PODNAME
, 將只能更新特定的pod(檢查是否存在新版本並相應地更新pod). 相反, pod install不會嘗試更新已安裝的pod的版本.當向Podfile中添加一個pod時, 應該運行
pod install
, 而不是用pod update
來安裝這個新pod.只有在想要更新特定pod(或所有的pod)的版本時才會使用
pod update
.
三,必須提交的Podfile.lock
有時候可能你不想提交Pods目錄到源代碼管理中. 但是在多人開發的情況下, 一定要提交
Podfile.lock
這個文件, 因為這個文件里面記錄了你的Podfile中所有pod的版本信息. 為避免你的Podfile中的pod版本和別人的Podfile中的pod發生版本不一樣的情況, 而導致出現函數找不到或者其他的錯誤.
四,場景示例
-
user1創建了項目
user1創建了一個項目, 並且想用A
,B
,C
這3個pod庫, 這個時候用pod install
安裝了這些pod庫, 並且假設這3個庫的版本號都是1.0.0
, 這些版本號等信息會記錄在Podfile.lock
文件中. -
user1添加了新的pod
根據項目的進度需求, 添加了D
這個pod庫到項目中, 這個時候應該使用pod install
去安裝D
這個庫到項目中, 即使在添加D
這個庫之前,B
的版本被維護者更新到了1.1.0
, 使用pod install
也只會安裝D
這個庫到項目中, 而不會去幫你更新B
的版本. 從而不會出現因為B
的版本更新后, 假如某些函數過期了, 或者某些函數被移除了, 而導致你被迫需要修改項目代碼. -
user2加入到項目中
假設團隊中新增加了一位基友user2, 他克隆了項目, 並且pod install
. (前提是你沒有把Pods目錄
添加到源代碼管理中), 如果你將Podfile.lock
提交到了版本控制. 那么基友安裝后的pod會和你的一模一樣, 不會出現他的pod版本比你的高. 即便現在C
的版本更新到了1.2.0
, 基友安裝的也是1.0.0
版本. 因為在Podfile.lock
中記錄的podC
就是1.0.0
版本. -
檢查pod的新版本
后來, user1想要檢查下是否有更新pod的版本. 運行pod outdated
, 會告訴你podB
有一個新1.1.0
版本, podC
已經是1.2.0
版本. user1決定他想要更新podB
, 但不更新podC
. 因此, 他會運行pod update B
, 將B
從1.0.0
版本更新到版本1.1.0
(並相應的更新Podfile.lock
), 但會將podC
保留在版本中1.0.0
(不會將其更新為1.2.0
).
五,使用指定版本的Podfile是不夠的
有些人可能會認為, 通過在
Podfile
中指定pod確切的版本, 像pod 'A', '1.0.0'
, 就足以保證每一個人和其他人都會有相同的版本. 然后他們甚至可以使用pod update
, 即使只是添加一個新的pod, 認為它永遠不會有更新其他pod版本的風險, 因為它們在Podfile中被固定到了一個特定的版本.但事實上, 這還不足以保證我們上面場景中的user1和user2, 始終獲得所有pod的完全相同的版本. 舉一個典型的例子, 如果pod
A
中有對podA2
的依賴, 在A.podspecas
中聲明dependency 'A2', '~> 3.0'
. 在這種情況下,pod 'A', '1.0.0'
在你的Podfile中使用的時候, 確實會強制user1和user2始終使用A 1.0.0 的pod版本
.但是: user1最終可能獲取到的
A2版本是pod 3.4
(因為那時A2是最新版本), 當user2在以后加入項目時運行pod install
, 他可能會在A2的版本中獲得pod3.5
(因為維護者A2可能在此期間發布了新版本).這就是為什么為了確保在每個團隊成員使用的每台電腦上, 所有相同的pod版本的唯一方法, 是使用
Podfile.lock
和正確使用pod install
和pod update
的原因.
六,我應該將Pods目錄添加到源代碼管理中嗎?
是否將Pods文件夾添加到源代碼管理中都取決於你,因為工作流程因項目而異. 我們建議您將Pods目錄保留在源代碼管理下, 不要將其添加到您的.gitignore. 但最終這個決定取決於你:
-
添加Pod目錄的好處
- 克隆了repo后, 即使沒有在機器上安裝CocoaPods, 項目也可以立即構建和運行. 無需運行pod install, 也無需Internet連接.
- Pod(代碼/庫)總是可用的, 即使Pod的源(例如GitHub)要關閉也是如此.
- 在克隆repo后, Pod組件保證與原始安裝中的組件相同.
-
忽略Pods目錄的好處
- 源代碼倉庫將更小, 並且占用更少的空間.
- 只要所有Pod的源(例如GitHub)都可用, CocoaPods通常能夠重新創建相同的安裝.(從技術上講, 無法保證pod install在Podfile中不使用提交SHA時, 運行將獲取並重新創建相同的組件. 在Podfile中使用zip文件時尤其如此.)
- 執行源控制操作時不會有任何沖突, 例如合並具有不同Pod版本的分支.
- 總結
無論你是否在忽略Pods目錄, Podfile並Podfile.lock應始終版本控制下保持.