composer.lock应该提交版本控制吗?

Pie*_*NAY 497 git version-control composer-php

我对composer.lock使用存储库的应用程序感到困惑.

我看到很多人说我们不应该.gitignore composer.lock从存储库中.

如果我在我的开发环境中更新我的库,我将有一个新的,composer.lock但我将无法将它们更新到生产中,是吗?

它不会在这个文件上产生冲突吗?

mez*_*eza 639

如果更新lib,则也要提交锁文件.它基本上表明您的项目已锁定到您正在使用的库的特定版本.

如果您提交更改,并且有人提取您的代码并更新依赖项,则应该不修改lockfile.如果它被修改,则意味着你有一个新版本的东西.

将它放在存储库中可以确保每个开发人员使用相同的版本.

  • 在生产中你不应该更新你的依赖项,你应该运行`composer install`,它将从锁文件中读取而不会改变任何东西. (337认同)
  • "在生产中你不应该更新你的依赖"应该全部大写 (101认同)
  • @JoaquínL.Robles生产中你不应该更新你的依赖!:) (61认同)
  • 如果composer.lock被修改,则需要将修改推送回存储库.如果要将软件绑定到库的给定版本,请在配置中明确执行此操作.这样锁就永远不会改变.将锁定文件视为依赖关系管理问题的指示器,需要以某种方式解决. (7认同)
  • 好吧,但想象一下,如果我从生产环境更新库,composer.lock将被覆盖,因此生产中的下一个拉动将要求我合并此文件... (4认同)

Jer*_*ege 184

对于应用程序/项目:绝对是的.

作曲家文档在此(重点)规定:

将应用程序的composer.lock(以及composer.json)提交到版本控制中.

就像@meza所说的那样:你应该提交锁定文件,这样你和你的合作者就可以使用同一套版本,并阻止你说"但它在我的电脑上工作"这样的说法.;-)

对于图书馆:可能不是.

作曲家文档记录了这件事:

注意:对于库,不一定建议提交锁文件(...)

在这里陈述:

对于您的库,如果您愿意,可以提交composer.lock文件.这可以帮助您的团队始终针对相同的依赖项版本进行测试.但是,此锁定文件不会对依赖它的其他项目产生任何影响.它只对主项目产生影响.

对于图书馆,我同意@Josh Johnson的回答.

  • 也许使用"同事"这个词在这里令人困惑,我把它改成了合作者.主要区别是"主项目"与库,其中主项目由一个或多个库和代码组成.从主项目运行composer时,它不使用库的composer.lock文件,因此它会在最新版本中安装其依赖项.我认为在测试你的库时这应该是类似的. (4认同)
  • 将锁文件与库一起提交可能是一件好事 - 锁文件记录了在运行测试套件时安装了哪些版本的依赖项。这在团队中尤其重要,尤其是在持续集成环境中。 (2认同)
  • @tonix,我可以一定的权限回答这个问题!我不为我的* libraries *提交composer.lock的原因是,无论如何,我的CI每晚都会建立master。它保证,如果任何库的依赖项都存在升级问题,则库的用户将遇到该配置项失败。效果不错! (2认同)

Jos*_*son 75

在为一些项目做两种方式后,我的立场是composer.lock不应该作为项目的一部分提交.我知道这样做比较容易,但在我为此提出诉讼时请耐心等待.

composer.lock是构建元数据,它不是项目的一部分.依赖关系的状态应该通过如何对它们进行版本控制(手动或作为自动构建过程的一部分)来控制,而不是由最后一个开发人员任意更新它们并提交锁定文件.

如果您担心作曲家更新之间的依赖关系发生变化,那么您对版本控制方案缺乏信心.版本(1.0,1.1,1.2等)应该是不可变的,您应该避免在初始功能开发之外使用"dev-"和"X.*"通配符.

提交锁定文件是依赖关系管理系统的回归,因为依赖关系版本现在已经回归到隐含定义.

此外,您的项目永远不需要重建或在每个环境中都需要它的依赖项,尤其是prod.您的可交付成果(tar,zip,phar,目录等)应该是不可变的,并且在不改变状态的情况下通过环境进行推广.

编辑:我知道这可能不是一个受欢迎的答案,但如果你拒绝投票,你会非常友好地在评论中提供一个指出答案缺陷的理由吗?谢谢!

  • 同意.我认为在`composer.json`中指定依赖版本更有意义,其中更明确地陈述了所需的版本.但如果你_don't_设置特定版本,最好提交`composer.lock`.如果`composer.json`中指定的版本与根据`composer.lock`安装的版本不同,则会令人困惑.它还取决于应用程序(内部或一般发布)及其开发周期.当然,作曲家文档[do say](http://goo.gl/1ZsHal),粗体,**"将你的应用程序的composer.lock(以及composer.json)提交到版本控制"**.明智地选择=) (18认同)
  • 经过多次灵魂搜索,我已经决定,在这一点上,作曲家文档是错误的:)我有一个规则,我不会将生成的材料添加到VCS; 我允许构建过程来处理它. (10认同)
  • 是不是使用生物力学密钥 - "生成材料"创建的代码?我不确定这是制定政策的可靠标准.=) (10认同)
  • @borfast我知道我的谈话有点迟,所以你可能已经看到了这一点,但是,你可以在`composer.json`中指定一个哈希值.在`require`部分,你可以输入:`"repo":"dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"`.这将1)转到分支,2)检查哈希,3)如果在分支上找不到哈希,但是,它将检出指定分支的头部(在这种情况下是主). (5认同)
  • @CEPA - 这很奇怪.如果无法找到哈希,我原以为它会失败.似乎很危险. (5认同)
  • 这个答案没有解释无需提交锁定文件即可运行的构建过程。一般来说,您的构建过程无法确保 VCS 中的特定版本始终解析为相同的特定版本,即您从 VCS 签出,运行“composer install”并应该完成,然后部署到 QA,稍后部署到产品。 (2认同)
  • 这对我来说很有意义,因为我已经阅读了大量有关在 Drupal 8 中使用 Composer 如何导致 Git 冲突问题的文章。他们可能“不正确地”使用它,但在我看来,自动生成的代码不应该进入存储库。 (2认同)

小智 29

  1. 您不应直接在Production上更新依赖项.
  2. 您应该对composer.lock文件进行版本控制.
  3. 您不应该版本控制您的实际依赖项.

1.您不应直接在Production上更新依赖项,因为您不知道这将如何影响代码的稳定性.可能存在新依赖项引入的错误,它可能会改变代码行为影响您自己的方式,它可能与其他依赖项等不兼容.您应该在开发环境中执行此操作,然后执行适当的QA和回归测试等.

2.您应该对composer.lock文件进行版本控制,因为它会存储有关依赖项的信息以及依赖项的依赖项,这些依赖项将允许您复制代码的当前状态.这很重要,因为您的所有测试和开发都是针对特定代码完成的.不关心您所拥有的代码的实际版本类似于将代码更改上载到您的应用程序而不是测试它们.如果你要升级你的依赖版本,这应该是一个自愿的行为,你应该采取必要的谨慎,以确保一切仍然有效.丢失一到两个小时的正常运行时间将恢复到之前的发布版本可能会花费您很多钱.

您将看到不需要composer.lock的一个论点是您可以在composer.json文件中设置所需的确切版本,并且这样,每次有人运行时composer install,它都会安装它们码.事实并非如此,因为您的依赖项具有自己的依赖项,并且它们的配置可能以允许更新颠覆或甚至整个版本的格式指定.

这意味着即使您在composer.json中指定要Laravel 4.1.31,其composer.json文件中的Laravel 也可能具有自己的依赖关系作为Symfony事件调度程序:2.*.使用这种配置,您最终可以使用Symfony事件调度程序2.4.1来使用Laravel 4.1.31,并且您团队中的其他人可以使用事件调度程序2.6.5来使用Laravel 4.1.31,这将取决于何时是你最后一次运行作曲家安装.

因此,在版本系统中使用composer.lock文件将存储此子依赖项的确切版本,因此,当您和您的队友进行作曲家安装时(这是您基于作曲家安装依赖项的方式).锁)你们两个都会得到相同的版本.

如果你想更新怎么办?然后在你的开发环境中运行:composer update,这将生成一个新的composer.lock文件(如果有新的东西)并在你测试之后,并进行QA测试和回归测试它和东西.您可以将其推送给其他人下载新的composer.lock,因为它可以安全升级.

3.你不应该版本控制你的实际依赖,因为它没有意义.使用composer.lock,您可以安装确切版本的依赖项,而不需要提交它们.当你不应该更新它们时,为什么要添加你的repo 10000依赖项文件.如果您需要更改其中一个,您应该将其分叉并在那里进行更改.如果您担心每次构建或发布时都必须获取实际的依赖项,那么编写器有不同的方法来缓解此问题,缓存,zip文件等.

  • 谢谢,我认为这个答案解释了为什么你应该版本composer.lock,如果不这样做,后果是什么以及你是否可以忍受它们。 (3认同)

waa*_*ers 8

然后,您将提交composer.json到项目,团队中的其他人都可以运行composer install来安装项目依赖项.

锁定文件的要点是记录安装的确切版本,以便重新安装.这意味着,如果您的版本规格为1.*并且您的同事运行安装1.2.4的composer update,然后提交composer.lock文件,那么当您编写作曲家安装时,您也将获得1.2.4,甚至如果1.3.0已经发布.这确保了在项目上工作的每个人都具有相同的确切版本.

这意味着如果自上次完成编写器安装以来已经提交了任何内容,那么在没有锁定文件的情况下,您将获得新的第三方代码.

同样,如果您担心代码中断,这是一个问题.这也是为什么将Composer视为以composer.lock文件为中心的重要原因之一.

来源:作曲家:关于锁文件的全部内容.


将应用程序的composer.lock(以及composer.json)提交到版本控制中.这很重要,因为install命令检查是否存在锁文件,如果存在,则下载其中指定的版本(无论composer.json是什么).这意味着设置项目的任何人都将下载相同版本的依赖项.您的CI服务器,生产计算机,团队中的其他开发人员,所有人和每个人都运行相同的依赖关系,这减少了仅影响部署的某些部分的错误的可能性.即使您单独开发,在重新安装项目的六个月内,即使您的依赖项从那时起发布了许多新版本,您仍然可以确信所安装的依赖项仍然有效.

来源:作曲家 - 基本用法.