转自:https://www.cnblogs.com/pqjwyn/p/11163146.html
https://zhuanlan.zhihu.com/p/211407232
yarn.lock与包版本管理
目前项目中依赖的版本管理问题。项目中使用 yarn 作为包管理器,安装依赖时会生成 yarn.lock 文件并且会提交到代码仓库,那它的作用是什么呢?
yarn.lock 文件的生成:yarn.lock 文件是在安装依赖时自动生成的。使用 yarn cli 执行添加/删除/升级依赖时会自动更新。
yarn.lock 文件内容:
"@babel/core@^7.11.6": version "7.11.6" resolved "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.11.6.tgz?cache=0&sync_timestamp=1599146828594&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" integrity sha1-OpRV3HOH/xusRXcGULwTugShVlE= dependencies: "@babel/code-frame" "^7.10.4" "@babel/generator" "^7.11.6" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" "@babel/parser" "^7.11.5" "@babel/template" "^7.10.4" "@babel/traverse" "^7.11.5" "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0"
当我们在命令行中执行 yarn add @babel/core -D
时,默认会安装 @babel/core
的最新版本,同时 yarn.lock
文件会更新,截取文件的一部分来看一下 yarn.lock
文件中储存了些什么。
1.第一行:包名 + 语义化版本,来自 package.json 文件
2.version:所安装的包版本,是 exact 的
3.resolved:包的安装地址。这里因为重置了 registry,所以指向了淘宝的镜像源
4.integrity:hash 值
5.dependencies:当前包依赖
那么 yarn.lock
就存储了所有依赖项及依赖项的依赖项确切的安装信息。在 package.json
版本不变, yarn.lock
文件存在的情况下执行 yarn install
命令就会按照文件中存储的依赖信息进行安装,从而保证在不同机器上安装的包都是一样的。
具体的:
// package.json "dependencies": { "@babel/core": "^7.11.6" } // yarn.lock @babel/core@^7.11.6: version: 7.11.6
package.json
文件中指定了 @babel/core
的版本是 ^7.11.6
,假设 @babel/core
有了新的版本 7.11.7,
如果没有 yarn.lock
文件,那么安装的时候会安装符合版本范围的最新版本 7.11.7
,那么即使在项目代码完全一致的情况下,安装的依赖版本也是不同的,可能会造成某些不一致问题。
在 yarn.lock
文件存在的情况下,安装时会匹配 package.json
和 yarn.lock
中包的版本,二者一致,则判断是否存在缓存。存在缓存,copy 包内容;不存在,根据 yarn.lock
中的 resolved
字段去下载。最终下载 7.11.6
版本,各个机器上下载的包是一致的。
如何更新包版本
方法一:
修改 package.json
中的包版本号,执行 yarn install
,此时版本与 yarn.lock
中版本不匹配,则会去下载符合版本范围的最新包,并更新 yarn.lock
文件
方法二:
yarn upgrade
相关命令