我应该将 composer.lock 置于库的版本控制之下吗? [复制]

Posted

技术标签:

【中文标题】我应该将 composer.lock 置于库的版本控制之下吗? [复制]【英文标题】:Should I put composer.lock under version control for a library? [duplicate] 【发布时间】:2020-11-22 15:58:54 【问题描述】:

在对How to get the exact version of included packages in my private repository 的答复中,我声明不应将composer.lock 置于 的版本控制之下。安装包的时候,这个文件根本用不到。

我查看了一组流行的存储库,其中大多数都不包含锁定文件(如 Symfony、Laravel、Guzzle、Monolog)。另一方面,Doctrine 存储库包含该文件,我想知道是否有充分的理由这样做,或者省略该文件。


旁注:这是关于包、库,但是你想调用它们。对于应用程序来说,这是另一回事,因为在团队合作或部署到其他系统时,您希望坚持每个依赖项的特定版本。 Should composer.lock be committed to version control? 中介绍了如何处理这种不同的情况,但对于我的用例,它没有包含太多参数

【问题讨论】:

这能回答你的问题吗? Should composer.lock be committed to version control? @Plancke 感谢您指出这一点 - 另一个问题从 应用程序 的角度提出了相同的问题,而不是针对可重用的库 【参考方案1】:

由于在安装包时文件没有以任何有用的方式使用,作为库本身对最终用户的功能,它至少与库的用户无关。

然后推理变成对于库的开发人员来说,拥有一组锁定的依赖项是否有用,他们需要执行开发任务,例如测试框架的特定版本等。在这些情况下,参数可以是 @ 987654322@ 文件的作用与常规应用程序中的相同 - 它将依赖项锁定到我们知道有效的那些。

但是,这里有一个警告 - 在开发库时,您真的希望用例与库的用户在安装它时的体验相同。考虑到这一点,锁定composer.json 中的显式版本通常更有意义,而不是依赖锁定文件来提供相同的功能。这使得任何 CI 解决方案在运行测试时都安装了正确的依赖集(与用户将获得的相同)。但是,您可以让该进程在运行测试之前在本地更新锁定文件以拥有多个测试用例 - 一个具有锁定的依赖项,一个具有最新版本(用户将获得)。

Doctrine 出于自己的原因做出了lock files should be committed 的决定,这是完全正确的 - 实际上他们归结为用于其开发工作流程的工具:

所有 Doctrine 项目都必须提交 composer.lock 文件。 phpstanphpcs 之类的工具在补丁版本中非常脆弱,我们不希望在没有对自己的代码进行任何更改的情况下构建开始失败。每当需要升级依赖项时,应在本地更新 composer.lock 文件并通过拉取请求提交更改。

两种情况都可以进行论证;这将取决于项目本身及其开发人员的偏好。我倾向于不提交它,因为它更接近地复制了用户在安装库时的体验。但是,每个开发人员仍然存在本地锁定文件,这意味着每个开发人员在开发库时在他们自己的计算机上拥有的内容可能会有所不同。提交锁定文件将使所有开发人员的整体体验更加相似,但需要格外小心才能为用户复制体验(然后,我们又回到了最初的论点......)。

【讨论】:

【参考方案2】:

我的帖子不是关于纯库,而是一种对其他库有很多依赖关系的模块。该模块是各种应用程序的一部分。例如,如果我在部署我的应用程序时运行没有 composer.lock 的 composer install,我可能会推出我没有测试过的支架。因此,我将模块版本的依赖关系固定在具体状态上,当然还提交了 composer.lock。因此,在我看来,与 Symfony 等框架的比较有点滞后,因为这里没有部署任何东西。

【讨论】:

这与这个问题有什么关系?这看起来像是您应该添加到您的问题中的内容,因为这些“模块”的概念根本不是您问题的一部分 这正是我向您描述的。你对 Symfony 之类的框架太投入了。 请为您的回答添加一些解释——您帖子的链接到底如何回答我的问题?我已经要求提供支持或反对版本控制的论据 嗯,我没有在自己的帖子上放链接。你把那个联系起来了。而您的问题是“我应该将 composer.lock 置于库的版本控制之下吗?”。我的回答是:是的,在某些情况下它是有用的,甚至是必要的。我给你举了一个例子。当然,要不要自己做就看你自己了。没有人强迫你这样做。 你能在你的答案中添加一个真实的例子和一些解释吗? “模块”是什么意思,这与通常的库有什么不同?我已经写得很清楚了,问题是关于库的,并且明确不是关于显然需要在版本控制下的锁定文件的应用程序 - 所以将你的模块作为独立的模块推出对我来说看起来很奇怪。另外,我不明白我的问题应该如何与 Symfony 相关。

以上是关于我应该将 composer.lock 置于库的版本控制之下吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

composer基础知识科普

composer update的错误使用以及如何更新composer.lock文件

错误:无法解析“composer.lock”;它必须是 Composer 生成的有效锁文件

如何使用composer进行包管理更合适

如何使用composer进行包管理更合适

从composer.lock(不是composer.json)重新安装供应商