作用
- 团队开发的时, clone 下代码后, 使用 包管理器执行 install 命令后 可以确保大家使用的依赖包都是同一个版本的, 避免没必要的混乱;
- 在一个现有的项目上开发的时候, 执行 update 后, 偶尔会发现刚刚更新了某个代码包把程序整挂了, 这个时候, 如果 composer.lock 是加入版本控制器的话, 直接一个 git diff 命令, 就可以查看到这次更新了那个包, 快速定位到问题的所在;
- 在线上部署的时候,可以确保线上生成环境下使用所有代码是和开发时候使用的一致, 因为 .lock 会确保你在执行 install 命令后, 按照文件里面指定的版本去下载代码依赖包;
正确使用
composer
- composer.lock 文件是当你第一次使用 composer install 或者 执行 composer update 后生成的文件, 此文件里定义了当前项目的代码依赖, 还有最重要的, 这些代码依赖的对应的版本.
- 默认情况下, 当执行 composer install 的时候, Composer 会检查当前项目是否有 composer.lock 文件, 如果有的话, 就会按照此文件去下载代码依赖和其指定的版本.
- 不在项目的顶层文件的话,那么是会忽略的
yarn
-yarn.lock 文件是当你第一次使用 yarn install 或者 执行 yarn update 后生成的文件, 此文件里定义了当前项目的代码依赖, 还有最重要的, 这些代码依赖的对应的版本.
- 默认情况下, 当执行 yarn install 的时候, yarn 会检查当前项目是否有yarn.lock 文件, 如果有的话, 就会按照此文件去下载代码依赖和其指定的版本.
- 不在项目的顶层文件的话,那么是会忽略的
npm
|
- npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm这个 issue 控诉了这个问题,明明手动改了package.json,为啥不给我升级包!然后就导致了5.1.0的问题…
- 5.1.0版本后 npm install 会无视lock文件 去下载最新的npm 然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm控诉这个问题,最后演变成5.4.2版本后的规则。
- 5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm大致意思是,如果改了package.json,且package.json和lock文件不同,那么执行
npm i
时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。如果两者是同一状态,那么执行npm i
都会根据lock下载,不会理会package实际包的版本是否有新。 - 不在项目的顶层文件的话,那么是会忽略的
总结
虽然这个文件会给不熟悉的使用者带来一些困扰。Anyway,对于正式发布的和多人协调的项目项目应该将该文件加入版本控制,利大于弊。