为什么要在版本控制下包含 Podfile.lock



首先,我想提一下,我已经阅读了cocoapods指南 https://guides.cocoapods.org/using/pod-install-vs-update.html

仍然似乎有些不清楚我们为什么要提交 Podfile.lock,在每个人都只使用pod install命令并且我们在 podfile。那么.lock文件似乎是多余的。

假设我们有一个使用 ReactiveSwift 的项目。ReactiveSwift 在其 podspec 中依赖于 Result pod,如下所示:

s.dependency 'Result', '~> 3.2'

我的假设是,我不应该真正关心 ReactiveSwift 依赖于什么,因为我只是要对我严格指定的 ReactiveSwift 版本进行 pod 安装。

对于我自己开发的 pod,我可以影响他们的 podfile 和 podspec 严格指定我想使用的一个版本。

因此,我的项目中没有 podfile.lock 的简化流程将是:

  1. 开发一个功能,如果它需要更改依赖版本 - 只需直接在 podfile 中指定它,而无需提交 Podfile.lock

  2. 将功能合并到主分支,然后 CI 使用新的 podfile 运行 pod 安装命令

  3. 现在 CI 拥有其使用的所有正确版本的 pod,并且可以正确构建我的应用程序

在这种情况下是否需要 Podfile.lock?

您的Podfile指定直接依赖项的版本,但它可能会允许一些歧义。例如,也许你需要一个库的2.2版本,但你不在乎你得到的是2.2.1还是2.2.2。第一次做pod install,Cocoapods 只会得到最新版本的 2.2.x。

但是,也许 2.2.2 有一个您在不知不觉中依赖的应用程序的错误。维护者发布了 2.2.3,如果您没有签入锁定文件,您的一位同事或您的 CI 系统构建了该应用程序的崩溃版本并导致各种混乱。(它仍然适用于您的机器!

除了锁定直接依赖项的确切版本之外,锁定传递依赖项也同样重要。

总之,Podfile.lock确保您不会意外升级您拉入的库,同时让您的Podfile只关注您的直接依赖项。

首先,我想参考官方文档:

什么是Podfile.lock

此文件是在第一次运行pod install后生成的,并跟踪已安装的每个 Pod 的版本。例如,假设 Pod 文件中指定的以下依赖项:

pod 'RestKit'

运行pod install将安装当前版本的 RestKit,从而导致生成一个Podfile.lock,指示安装的确切版本(例如RestKit 0.10.3)。多亏了Podfile.lock,即使有更新的版本可用,稍后在其他机器上运行这个假设项目pod install仍将安装 RestKit 0.10.3。CocoaPods 将遵循Podfile.lock中的 Pod 版本,除非在 Podfile 中更新依赖项或调用pod update(这将导致生成新的Podfile.lock)。


回到你的问题:

正如你上面提到的,如果你在一个每个人都只使用pod install命令的设置中,并且每个依赖版本都是在podfile和相关podspec中严格指定的,那么Podfile.lock似乎是多余的。

但是,我认为这种情况很少见,而不是Cocoapods的常见用例。

例如,我们可以

  • 忽略指定版本以始终使用最新版本的容器,如pod 'RestKit'
  • 使用运算符~> 0.1.2指定版本 0.1.2 和最高版本 0.2,不包括 0.2
  • 添加第三方 pod,哪些 pod 规格不受控制

在这些情况下,提交Podfile.lock将非常有用。


顺便说一句,我认为问题标题最好从

Why should you include Podfile.lock under version control?

Why should I include Podfile.lock under version control in this scenario?

问题是你必须关心依赖关系的变化。

虽然语义版本控制应确保次要版本或修补程序版本中不会引入重大更改,但它仍然可能发生(一些常用的 pod 仍在版本0.x中!

发生这种情况并且依赖项引入重大更改时,应用程序可能会开始崩溃,甚至无法生成。除非你有良好的自动测试,否则你不会知道它。

或者,新的开发人员克隆了您的存储库,但由于依赖项的更改,它不会编译。

或者反过来。您的客户报告某个版本的错误,您无法在当前版本上重现该错误。因此,您将返回到构建版本的上一个提交。而且您也无法重现它,因为在依赖项修补程序中修复了一个错误。

实际上,当你返回到以前的提交并重新安装 pod 时,你的项目完全有可能甚至不会编译(如果你不锁定依赖项,在 javascript 世界中相当常见)。

总之,锁定依赖项是一种实现确定性构建的方法,它不依赖于外部更改。对于 cocoapods,将已安装的 pod 提交到您的存储库也是相当普遍的(讨论这是一个好主意还是坏主意是另一回事,两者都有很好的论据)。

最新更新