代码之家  ›  专栏  ›  技术社区  ›  Nico Haase

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

  •  0
  • Nico Haase  · 技术社区  · 4 年前

    在回答 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? ,但对于我的用例,它没有包含太多的参数

    0 回复  |  直到 4 年前
        1
  •  5
  •   MatsLindh    4 年前

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

    然后,推理就变成了对库的开发人员来说,拥有一组执行开发任务所需的锁定依赖关系是否有用,例如测试框架的特定版本等。在这些情况下,论点可能是 composer.json 文件的作用与常规应用程序中的作用相同,它锁定了我们知道有效的依赖关系。

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

    Doctrine已经做出决定 lock files should be committed 出于他们自己的原因,这是完全合理的——实际上,他们归结为用于开发工作流程的工具:

    所有条令项目都必须承诺 composer.lock 文件。工具如 phpstan phpcs 在补丁发布时非常脆弱,我们不希望在没有对自己的代码进行任何更改的情况下,构建开始失败。每当需要升级依赖关系时 composer.lock 文件应在本地更新,并通过pull请求提交更改。

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

        2
  •  -1
  •   altralaser    4 年前

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