composer.lock文件的作用

链接:https://juejin.cn/post/7087091346585944078

环境参数

php版本:7.4.13

composer版本:2.3

laravel版本:7.30.6

在使用composer后目录中会出现2个文件,composer.lockcomposer.json,现在来说说这两个文件的作用。
1、composer.json composer.json文件中保存的是我们安装的组件及组件的版本要求。
2、comopser.lock composer.lock文件中保存的是组件及其依赖的具体版本,在多人协同开发的情况下,这个文件能很好的解决组件不同而产生的问题。在使用composer install的时候是不会修改composer.lock这个文件,所以会把这个文件也放入版本管理中,其它人在使用时只需要composer install就可以了。而使用composer update后修改这个文件。

上面这段话是网上的说法,但是我觉得说的还是有点云里雾里的,所以自己动手操作一下,来看看lock文件到底什么作用?

我打算下载symfony/mailer这个第三方库,symfony/mailer最新的版本是6.1。以此作为示例。现在我的laravel框架已经下载完成,lock和json文件都是有的。

我们通过require命令下载5.2版本的:

composer require "symfony/mailer:5.2"
复制代码

这个时候去看composer.json,多了一行"symfony/mailer": "5.2"

composer.lock也会多了一些信息【注意看此时版本号5.2.0】:

在vendor/symfony下面也会增加一个mailer文件夹。

好了,现在还看不出来效果,我稍微改造一下,把composer.json的"symfony/mailer": "5.2"改为"symfony/mailer": "^5.2",仔细看多了个^符号,至于符号意义看下图:

然后执行update:

composer update symfony/mailer
复制代码

执行update是通过composer.json文件的,结果会把版本变为5.4.7

我们先来看看两个文件的变化:

composer.json发现没有变化:

composer.lock发现版本号变为5.4.7了

问题一:为什么update之后不会变为最新版本6.1?

答:因为composer.json文件是^符号,主版本号5固定的,update就是匹配符合的最新版本,5.4.7是主版本号5最大的版本了。

然后我们再做个实验,把lock文件删除,json文件不变。把vendor/symfony下面mailer文件夹也删除。【或则直接composer remove symfony/mailer直接删,这样删json文件的"symfony/mailer": "^5.2"也会没掉,手动补上就行】

我们模拟场景:我现在的本地symfony/mailer版本是5.2.0,来了新同事,如果没有lock文件或则lock没有放到git版本库,那么新同事运行composer install的时候,是通过composer.json的,这个时候首先创建lock文件,再去下载库,但是他下载的最新版本的mailer库也就是5.4.7的【道理同问题一】,那这样不同人版本不同是非常混乱的。此时新同事的lock文件是这样的:

参考:packagist.org/packages/sy…

www.php.cn/tool/compos…

blog.csdn.net/Destiny\_sh…

www.php.cn/tool/compos…

posted @ 2023-02-03 14:51  百事可口  阅读(270)  评论(0编辑  收藏  举报