利用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)