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

Amm*_*mmo 9 ios cocoapods

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

似乎还不清楚我们为什么要在每个人都只使用pod install命令并且我们在podfile中严格指定所有版本的设置中提交Podfile.lock。然后,.lock文件似乎是多余的。

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

  s.dependency 'Result', '~> 3.2'
Run Code Online (Sandbox Code Playgroud)

我的假设是,我真的不应该在乎ReactiveSwift所依赖的内容,因为我只是要对严格指定的ReactiveSwift版本进行pod安装。

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

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

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

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

  3. 现在,配置项已使用了所有正确版本的Pod,并且可以正确构建我的应用

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

Nea*_*all 29

您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只关心您的直接依赖项。


Han*_*ton 8

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

什么是 Podfile.lock

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

pod 'RestKit'

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


回到你的问题:

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

但是,我认为这是罕见的,而不是Cocoapods.

例如,我们可以

  • 忽略指定版本以始终使用最新版本的 pod,例如 pod 'RestKit'
  • 使用 operator~> 0.1.2指定版本 0.1.2 和版本到 0.2,不包括 0.2
  • 添加第 3 方 pod,哪些 podspecs 不受控制
  • 等等

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


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

Why should you include Podfile.lock under version control?

到

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