const chalk = require('chalk')
const semver = require('semver')
const exec = require('./exec-promise')
const getLocalVersion = async (pkg, isDev) => {
let lsInfo
try {
lsInfo = JSON.parse(await exec(`npm ls ${pkg} --json --depth=0 ${isDev ? '--dev' : '--prod'}`))
if (lsInfo.dependencies) {
lsInfo = lsInfo.dependencies[pkg].version
}
} catch (e) {
lsInfo = false
}
return lsInfo
}
const installFuc = async (pkg, version, pPackage = {}, isDev = false) => {
if (!pkg) {
throw new Error('未传入需要安装的包名')
}
const originPkg = {}
originPkg.dependencies = pPackage.dependencies || {}
originPkg.devDependencies = pPackage.devDependencies || {}
const key = isDev ? 'devDependencies' : 'dependencies'
let v = await getLocalVersion(pkg, isDev)
if (v) {
if (semver.satisfies(v, version)) {
console.log(`当前已存在依赖 ${pkg}@${v}`)
return true
}
} else {
console.log(chalk.yellow(`安装依赖 ${pkg}@${version}`))
await exec(`npm install ${isDev ? '--save-dev' : ''} ${pkg}@${version}`)
v = await getLocalVersion(pkg, isDev)
}
if (!originPkg[key][pkg]) {
return true
}
if (semver.satisfies(v, originPkg[key][pkg])) {
console.log(`当前已存在依赖 ${pkg}@${v}`)
return true
}
await exec(`npm install ${isDev ? '--save-dev' : ''} ${pkg}@${originPkg[key][pkg]}`)
v = await getLocalVersion(pkg, isDev)
if (semver.satisfies(v, version)) {
console.log(`已更新依赖 ${pkg}@${v}`)
return true
}
throw new Error(`依赖包 ${pkg} 与本地版本有冲突, 版本要求是 ${version}, 本地项目要求是 ${originPkg[key][pkg]}`)
}
module.exports = installFuc