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

时间:2017-05-17 14:48:41

标签: ios cocoapods

首先,我想提一下,我已经阅读了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 install命令

  3. 现在CI已经使用了所有正确版本的pod,可以正确构建我的应用

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题在于您必须关心依赖项中的更改。

尽管语义版本控制应确保在次要版本或补丁版本中没有引入重大更改,但仍可能发生(某些常用的pod仍在0.x版本中!)

当这种情况发生并且依赖项带来了重大变化时,您的应用程序可能会开始崩溃甚至无法构建。除非您有良好的自动测试,否则您将一无所知。

或者,一个新的开发人员会克隆您的存储库,并且由于依赖关系的更改而无法编译。

反之亦然。您的客户报告了某个版本的错误,并且您无法在当前版本上重现该错误。因此,您将返回到先前的版本版本提交。而且您也无法复制它,因为在依赖补丁中已修复了一个错误。

实际上,当您返回上一个提交并重新安装Pod时,完全有可能甚至无法编译您的项目(如果不锁定依赖项,这在javascript世界中是相当普遍的)。

总而言之,锁定依赖项是一种实现确定性构建的方法,该方法不依赖于外部更改。使用cocoapods,将已安装的pod提交到存储库中也很常见(讨论这是一个好主意还是另一回事,两者都有很好的论据)。

答案 2 :(得分:0)

首先,我想引用the official doc

  

什么是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。除非在Podfile中更新了依赖项或调用了Podfile.lock(这将导致生成新的pod update),否则CocoaPods将支持Podfile.lock中的Pod版本。


回到您的问题:

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

但是,我认为这很少见,而不是Cocoapods的常见用法。

例如,我们可以

  • 忽略指定版本以始终使用pod的最新版本,例如pod 'RestKit'
  • 使用运算符~> 0.1.2指定版本0.1.2和不超过0.2的版本,不包括0.2
  • 添加第三方Pod,这些Podspec不受控制

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


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

更改

Why should you include Podfile.lock under version control?

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