1、背景:
许多人似乎认为
pod install
只在第一次使用 CocoaPods 设置项目时使用,之后才使用pod update
。但事实并非如此。
2、事实上:
pod install
:即使你已经有Podfile
文件并曾经执行过pod install
,只要当你在Podfile
文件中 add/remoe/update pods 的时候,都需要通过执行pod install
来 install new pods 。
pod update [PODNAME]
:只有当你希望将 pods 更新到一个更新的版本的时候,才执行此命令。
pod update [PODNAME]
:将[PODNAME]
更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制);pod update
:能够将所有 pods 更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制)。
3、命令的详细说明:
(1)pod install :
- 每次执行
pod install
,都会将 add/remove/update 的 pods 的版本号写入Podfile.lock
文件中,该文件跟踪每个pod的安装版本并锁定这些版本。- 运行
pod install
时,它只解决Podfile.lock
中没有列出的 pod 的依赖关系。
- 对于
Podfile.lock
中列出的 pod ,它下载Podfile.lock
中列出的显式版本,而不尝试检查是否有更新的版本可用。- 对于
Podfile.lock
中没有列出的 pod ,它会搜索匹配Podfile
中描述的版本(比如pod 'MyPod', '~>1.2'
)
(2)pod outdated:
当您运行
pod outdated
时, CocoaPods 将列出所有比Podfile.lock
中记录的 pod 版本更新的版本。这意味着如果您在这些 pod 上运行pod update [PODNAME]
,它们将被更新——只要新版本仍然符合这些限制。
比如在Podfile
文件中设置pod 'MyPod', '~>0.1.2'
:
- 执行
pod outdated [PODNAME]
,检测出更新版本0.1.4
;
再执行pod update [PODNAME]
,会将[PODNAME]
更新至0.1.4
版本。- 执行
pod outdated [PODNAME]
,检测出更新版本0.3.1
;
再执行pod update [PODNAME]
,则不会将[PODNAME]
更新至0.3.1
版本,而是更新至最靠近0.2
的版本。
(3)pod update:
运行
pod update [PODNAME]
时, CocoaPods 将尝试找到pod [PODNAME]
的更新版本,而不考虑Podfile.lock
中列出的版本。它将把 pod 更新到可能的最新版本(只要它匹配您的Podfile
中的版本限制)。
如果运行没有 pod 名称的pod update
, CocoaPods 会将Podfile
中列出的每个 pod 更新到可能的最新版本。
4、场景示例:
Stage 1: User1 creates the project :
user1 创建一个项目,并希望使用 pods A、B、C 。他们用这些 pod 创建一个
Podfile
,并运行pod install
。
这将安装 pods A、B、C ,我们将说它们都在 1.0.0
版本中。
Podfile.lock
将跟踪这一点,并注意 A、B、C 都安装为 1.0.0
版本。
- 顺便说一句,因为这是他们第一次运行
pod install
, pod.xcodeproj 项目还不存在,该命令还将创建 Pods.xcodeproj 和 .xcworkspace ,但这是命令的副作用,而不是它的主要作用。
Stage 2: User1 adds a new pod :
稍后, user1 希望将
pod D
添加到他们的Podfile
中。
他们应该执行pod install
命令,这样即使pod B
发布了一个版本1.1.0
, 命令运行以后,pod B
也将继续使用之前已经安装的版本1.0.0
—— 因为 user1 只想添加pod D
,也不用担心意外更新pod B
。
- 这就是有些人错误的地方,因为他们在这里使用
pod update
,他们可能认为这是“我想用新的pods 更新我的项目” ;而不是使用pod install
,在项目中安装新的 pods 。
Stage 3: User2 joins the project :
然后从未参与过该项目的 user2 加入了团队。他们克隆存储库,然后使用
pod install
。
Podfile.lock
的内容(应该提交到 git repo )将确保它们得到完全相同的 pods ,具有与 user1 使用的完全相同的版本。
即使pod C
的1.2.0
版本现在可用,user2 也将在1.0.0
版本中获得pod C
。因为这是在podfile.lock
中注册的。pod C
被Podfile.lock
锁定到1.0.0
版本。
Stage 4: Checking for new versions of a pod :
稍后, user1 想要检查这些 pods 是否有可用的更新。他们运行
pod outdated
,这将告诉他们pod B
有一个新的版本1.1.0
,而pod C
有一个新的版本1.2.0
。
user1 决定更新pod B
,但不更新pod C
; 因此,他们将运行pod update B
,它将把 B 从版本1.0.0
更新到版本1.1.0
(并更新Podfile.lock
),但是将保持pod C
在1.0.0
版本中(并且不会更新到1.2.0
)。
5、在 Podfile 中使用精确的版本就够了吗?
有些人可能认为,通过在
Podfile
中指定 pods 的确切版本,比如pod 'A'、'1.0.0'
,就足以确保每个用户都拥有与团队中其他人相同的版本。然后他们甚至可能使用
pod update
,即使只是添加一个新的 pod ,他们也会认为更新其他 pod 永远不会有风险,因为它们固定在Podfile
中的特定版本上。但实际上,这并不足以保证上面场景中的 user1 和 user2 将始终获得所有 pod 的完全相同版本。
一个典型的例子是,如果
pod A
依赖于在 A.podspec 中声明的pod 'A2', '~> 3.0'
。在这种情况下,在您的Podfile
中使用pod 'A', '1.0.0'
确实会迫使 user1 和 user2 同时使用pod A
的1.0.0
版本,但是:user1 可能最终在
3.4
版本中使用pod A2
(因为那是当时A2
的最新版本)
当 user2 稍后在加入项目时运行pod install
时,他们可能在3.5
版本中获得pod A2
(因为A2
的维护人员可能同时发布了一个新版本)。
小结:
是使用
Podfile.lock
并正确使用pod install
vs.pod update
。