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 installvs.pod update。