背景
比如某个包的最新版本是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
}