install-dep.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const chalk = require('chalk')
  2. const semver = require('semver')
  3. const exec = require('./exec-promise')
  4. // 获取当前安装包版本
  5. const getLocalVersion = async (pkg, isDev) => {
  6. let lsInfo
  7. try {
  8. lsInfo = JSON.parse(await exec(`npm ls ${pkg} --json --depth=0 ${isDev ? '--dev' : '--prod'}`))
  9. if (lsInfo.dependencies) {
  10. lsInfo = lsInfo.dependencies[pkg].version
  11. }
  12. } catch (e) {
  13. lsInfo = false
  14. }
  15. return lsInfo
  16. }
  17. // pkg: 需要安装的包名, isDev: 是否安装到 dev 依赖, pPackage: 项目的 package 文件
  18. const installFuc = async (pkg, version, pPackage = {}, isDev = false) => {
  19. if (!pkg) {
  20. throw new Error('未传入需要安装的包名')
  21. }
  22. // 参数兼容性处理
  23. const originPkg = {}
  24. originPkg.dependencies = pPackage.dependencies || {}
  25. originPkg.devDependencies = pPackage.devDependencies || {}
  26. const key = isDev ? 'devDependencies' : 'dependencies'
  27. // 获取当前安装包版本
  28. let v = await getLocalVersion(pkg, isDev)
  29. // 如果未检测到安装包版本, 属于异常, 则本地先安装一下
  30. if (v) {
  31. // 检测当前已安装版本是否符合要求
  32. if (semver.satisfies(v, version)) {
  33. console.log(`当前已存在依赖 ${pkg}@${v}`)
  34. return true
  35. }
  36. } else {
  37. console.log(chalk.yellow(`安装依赖 ${pkg}@${version}`))
  38. await exec(`npm install ${isDev ? '--save-dev' : ''} ${pkg}@${version}`)
  39. v = await getLocalVersion(pkg, isDev)
  40. }
  41. // 本地项目本身无该包
  42. if (!originPkg[key][pkg]) {
  43. return true
  44. }
  45. // 检测当前已安装版本是否符合要求
  46. if (semver.satisfies(v, originPkg[key][pkg])) {
  47. console.log(`当前已存在依赖 ${pkg}@${v}`)
  48. return true
  49. }
  50. // 不符合要求则按照项目要求回滚
  51. await exec(`npm install ${isDev ? '--save-dev' : ''} ${pkg}@${originPkg[key][pkg]}`)
  52. // 检测回滚后能否符合要求
  53. v = await getLocalVersion(pkg, isDev)
  54. if (semver.satisfies(v, version)) {
  55. console.log(`已更新依赖 ${pkg}@${v}`)
  56. return true
  57. }
  58. // 回滚后还是不符合, 说明两版本要求冲突
  59. throw new Error(`依赖包 ${pkg} 与本地版本有冲突, 版本要求是 ${version}, 本地项目要求是 ${originPkg[key][pkg]}`)
  60. }
  61. module.exports = installFuc