如何管理 lockfileVersion 版本?

10,774 阅读2分钟

问题

你是否在安装依赖时遇到过 package-lock.json 中 lockfileVersion 字段从 1 变成 2,同时整个文件发生比较大的变化?是否跟其他同事合作时,出现了该文件因为 lockfileVersion 版本不同带来的冲突?是否在 CR 时遇到该文件因为 lockfileVersion 变化带来的巨大变动?

虽然 lockfileVersion 2 是向后兼容 1 的,似乎也不会存在什么大问题,但是多少让人比较难受。值得注意的是,lockfileVersion 2 是从 npm 7 开始作为默认版本的,参考官方文档

以下提出一些可参考的解决方案。

解决方案

使用 —lockfile-version 指定版本

一个比较简单但是稍显繁琐的方式就是在每次安装依赖时带上一个参数指定版本:

npm install --lockfile-version 2

临时这么用可以,但是如果作为一个多人参与的项目,最好就是有一个更自动化的机制来进行保证。

使用 nvm 来切换 node 和 npm 版本

我们安装 node 时便会内置 npm,所以通过切换 node 版本实际上也切换了 npm 版本,这里建议用 nvm 工具来管理 node 版本的切换。

通常 lockfileVersion 为 1 的项目,其对应运行的 node 版本要求也不高,因为也就是之前运行在版本不高的 node 版本上,才用的 npm 7 以下版本,所以 lockfileVersion 才为 1

  1. 安装依赖时手动切换 node 版本
nvm use 10
  1. 通过 shell 脚本检查,并在安装依赖前自动切换指定版本

    1. 在项目中使用 .nvmrc 配置可以指定项目要求的 node 版本,参考文档
    2. 可参考检查脚本
    #!/bin/bash
    
    if [ -f ~/.nvm/nvm.sh ]; then
        echo "source nvm from ~/.nvm"
        . ~/.nvm/nvm.sh
    else
        echo "~/.nvm not found"
    fi
    
    if command -v git > /dev/null; then
        nvm install && nvm use
    else
        echo "nvm not found"
    fi
    
    1. preinstall 阶段使用脚本检查并切换

参考