如何淡定的强制安装指定版本包

534 阅读1分钟

背景

比如某个包的最新版本是3.0.0,开发初期, 装了最新版本,但是发现有些问题, 但是2.0.0版本满足, 此时本地包换成2.0.0, 但是其他开发同事,拉下代码后并不会报错, 也可继续打包发版,结果: 测试/线上效果不正确。 打包同事很多, 群发消息不会及时看到。 一个个去通知安装指定版本更是麻烦。

解决方法: 跑打包脚本前加上版本比较包版本的脚本代码

直入主题

核心逻辑:比较package.json的包版本和node-modules的包版本

上代码

// 需要强制版本包的包名
const modules = ['message-pc-component2.0', 'hrx-charts'] // '@types/webpack-merge',
const projectRoot = path.resolve(__dirname, '../')
const package = require(path.resolve(projectRoot, './package.json'))
const allDependencies = {
  ...(package.dependencies || {}),
  ...(package.devDependencies || {})
}
modules.forEach(item => {
  try {
    const packVersion = allDependencies[item]
    const realPath = item.split('/')
    const pack = require(path.resolve(...[projectRoot, './node_modules', ...realPath, 'package.json']))
    console.log(packVersion, pack.version)
    const needVersions = packVersion.match(/\d+/g)
    const realVersions = pack.version.match(/\d+/g)
    for (let i in needVersions) {
      // 需要安装指定版本
      if (item === 'hrx-charts' && isDefine(realVersions[i]) && isDefine(needVersions[i]) && parseInt(realVersions[i]) !== parseInt(needVersions[i])) {
        exit(item)
      }
      // 不能低于指定的版本
      if (isDefine(realVersions[i]) && isDefine(needVersions[i]) && parseInt(realVersions[i]) < parseInt(needVersions[i])) {
        exit(item)
      }
    }
  } catch (error) {
    exit(item)
  }
})

function exit(packageName) {
  if (packageName === 'hrx-charts') {
    throw new Error(`${packageName}版本不正确,请安装指定版本`)
  }
  throw new Error(`${packageName}版本过低,请执行npm i/npm install`)
}

function isDefine(num) {
  return num !== null && num !== undefined
}