npm 私有包依赖检查升级

190 阅读1分钟

利用node child_process 子进程进行处理

主要步骤:

  • 1、获取package.json的依赖
const { dependencies, devDependencies } = require('./package.json')
  • 2、查询远程的发行版本,收集需要升级的包
npm view pkg version 
  • 3、升级
npm install pkg --save-dev 

案例:

const path = require('path')
const fs = require('fs')
const { spawnSync, spawn } = require('child_process')
// 获取对应的依赖
const { dependencies, devDependencies } = require('./package.json')

function analyzy(packages, isDev) {
  const pkgs = [] // 收集可升级的版本情况
  let packagesLength = 0
  let currentAnalyzedPackage = 0

  for (const pkg in packages) {
    //   todo
    if ((packages.hasOwnProperty(pkg) && pkg.startsWith('@内部npm包标识')) || 1) {
      const args = ['view', pkg, 'version']
      packagesLength++
      //   非\d 都删除 (^1.0.1)
      const currVer = packages[pkg].replace(/^[^\d]+/g, '')
      //   检查远程版本 npm view pkg version
      const { stdout } = spawn(process.platform === 'win32' ? 'npm.cmd' : 'npm', args, {
        encoding: 'utf8'
      })
      stdout.on('data', function(remoteVersion) {
        console.log(remoteVersion.toString())
        console.log('----------')
        if (remoteVersion) {
          remoteVersion = `${remoteVersion}`.replace(/^\s+|\s+$/g, '')
        }
        let pattern = /(alpha|beta|gamma|rc)/i
        if (pattern.test(remoteVersion)) {
          console.log('当前发布的版本为内部(alpha)、测试(beta)或候选(gamma|rc)版本, 不更新')
        } else {
          if (currVer === remoteVersion) {
            console.log(`【${pkg}】已是最新版本,无须升级`)
          } else {
            pkgs.push({
              name: pkg,
              version: packages[pkg],
              remote: remoteVersion
            })
          }
        }
        currentAnalyzedPackage++
      })
      stdout.on('end', function(data) {
        if (packagesLength === currentAnalyzedPackage) {
          console.log('check end')
          //   依赖收集
          console.log(pkgs)
          //   处理需要升级的部分
          updatePackages(pkgs, isDev)
        }
      })
    }
  }
}
// 升级
function updatePackages(packages, isDev) {
  const args = ['install']
  packages.forEach(pkg => {
    args.push(`${pkg.name}@${pkg.remote}`)
  })
  args.push(isDev ? '--save-dev' : '--save')
  // 同步升级,获取升级成功或者失败(npm install 包、包、包 --save)
  const { status } = spawnSync(process.platform === 'win32' ? 'npm.cmd' : 'npm', args, {
    stdio: 'inherit'
  })
  console.log(`所有包升级的状态是:${status}`)
}

analyzy(dependencies)
// 如果devDependencies 也需要就另外处理
// analyzy(devDependencies, true)