composer.lock:它是如何工作的?

109
我正在尝试理解这部分内容:http://getcomposer.org/doc/02-libraries.md#lock-file “锁定文件对于依赖它的其他项目没有任何影响,它只会对主要项目产生影响。”
这是什么意思呢?如果项目P依赖库A,而库A又依赖库B v1.3,那么项目P就不用关心库B的版本,并且可能会安装B 1.4,这是否意味着锁定文件没有作用呢?
还是说与依赖关系管理器应该具有的行为相反?
答案是:当使用Composer安装依赖包时,它会生成一个" lock file ",其中包含了所有依赖项及其依赖项的确切版本号。在之后的安装中,Composer将使用此文件来确保安装的软件包与先前安装的软件包完全相同,以避免由于更新或更改可能导致的不兼容性问题。
因此,该引用所述的锁定文件只会影响主要项目,而不会影响依赖它的其他项目,因为其他项目可以有自己的锁定文件来确保它们的依赖项与特定版本相匹配。
3个回答

134

composer.lock 记录了安装的确切版本,以便与同事使用相同版本。

composer install

  • 检查 composer.lock 文件
  • 如果不存在,则自动生成 composer.lock 文件(使用 composer update
  • 安装记录在 composer.lock 文件中指定的版本

composer update

  • 查看 composer.json 文件
  • 根据指定的版本标准(例如 1.12.*),检查更新的(最新的)版本是否可用
  • 安装最新可能的版本(根据上述标准)
  • 使用已安装的版本更新 composer.lock 文件

简单的检查列表如下。

如果您希望所有同事都使用与您相同的版本...

  • 将您的 composer.lock 提交到 GIT(或您使用的版本控制系统)
  • 请求其他人获取该版本的 composer.lock 文件
  • 始终使用 composer install 来获取正确的依赖项

如果您想升级系统依赖项以获取新的版本

  • 检查 composer.json 文件中的版本规格。
  • 运行 composer update
  • 这将使用最新版本更改 composer.lock 文件
  • 提交到 GIT(或您使用的版本控制系统)
  • 请求其他人获取它并执行 composer install

以下是非常好的阅读材料:
https://blog.engineyard.com/2014/composer-its-all-about-the-lock-file

享受 composer.lock 文件的威力!


1
我还想指出,composer install 有时在已安装的情况下可能无法获得您所需的版本。为了解决这个问题,他们必须删除 vendor 文件夹并再次运行 composer install 以获取 composer.lock 中的正确版本。例如,当我从 vendor 进行 composer 安装时,我得到的是 4.0.1 而不是 4.0.14-beta,然后我删除了 vendor,然后再次运行 composer install,这样我就得到了正确的版本 4.0.14-beta。 - PauAI

88

Composer的依赖关系在composer.json中定义。第一次运行composer install, 或者运行composer update时,将会创建一个名为composer.lock的锁文件。1

引用的文档只涉及到锁定文件。如果你的项目P依赖于库A,而A又依赖于B v1.3.**,那么如果A包含了一个锁定文件,说明有人运行了“composer update”,导致B v1.3.2被安装,那么在你的项目P中安装A可能仍然会安装1.3.3版本,因为composer.json(而不是.lock!)定义了依赖关系为1.3。

锁定文件总是包含精确的版本号,并且在与同事交流或发布应用程序时,很有用地传达了您测试使用的版本。对于库来说,composer.json中的依赖信息才是最重要的。


1默认情况下,composer.lock作为lock配置选项[ref]被设置为true,因此将被创建。将其设置为false,Composer将不会创建也不会读取composer.lock文件。


如何将所有依赖项更新为锁定文件中指定的版本(例如在从暂存环境转移到生产环境时)? - Petah
7
只需运行composer.phar install命令,即可将所有内容安装/更新/删除到锁定文件所处的状态。 - naderman
在Python和Ruby中,涉及到Gemfile.lock和requirements.txt的类似概念。参见:https://caremad.io/blog/setup-vs-requirement/ 和 http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ 这是否意味着,对于PHP“库”,不需要保留composer.lock文件。但是对于PHP“应用程序”,应该提交composer.lock文件? - CMCDragonkai
composer.lock 文件对于库也是有益的。虽然不是为了依赖该库的任何人,但对于库的开发人员来说,它可以帮助他们沟通安装的版本以运行测试或调试问题,还可以帮助澄清 CI 系统用哪些依赖项版本运行库的测试。 - naderman
composer.lock 文件就像是 composer.json 文件的元数据。 - Wasim Khan

7
锁定文件的目的是记录已安装的确切版本,以便可以重新安装。这意味着,如果您的版本规范为1.*,并且您的同事运行了composer update安装了1.2.4,然后提交了composer.lock文件,当您运行composer install时,即使1.3.0已经发布,您也将获得1.2.4。这确保了在项目上工作的每个人都有相同的确切版本。详见Composer:锁定文件的重要性

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接