node自定义命令行工具cli,运行报错Error: spawn npm ENOENT
const {promisify} = require ('util')
const figlet = promisify(require('figlet'))
const clear = require('clear')
const chalk = require('chalk')
const log = content => console.log(chalk.green(content))
const {clone} = require('./download')
// proc 是子进程本身
//stdout 是 子进程的输出流
const spawn = async (...args) =>{
const {spawn} = require('child_process')
return new Promise(resolve =>{
const proc = spawn(...args)
proc.stdout.pipe(process.stdout)
proc.stderr.pipe(process.stderr)
proc.on('close',()=>{
resolve()
})
})
}
module.exports = async name =>{
// 打印欢迎界面
clear()
const data = await figlet(`${name} Welcome`)
log(data)
// 克隆项目
await clone('github:su37josephxia/vue-template',name)
// 安装依赖
log('安装依赖')
await spawn('npm',['install'],{cwd: `./${name}` })
log('安装成功')
}
√ 下载 github:su37josephxia/vue-template
安装依赖
node:events:505
throw er; // Unhandled 'error' event
^
Error: spawn npm ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn npm',
path: 'npm',
spawnargs: [ 'install' ]
}
PS E:\node-proj\vue-auto-router-cli2>
查了很多文章,都说是因为没有给npm配置环境变量。然而我把npm和cmd的环境变量都认真检查过了,都是配置好的。并没有卵用。
有没有其他思路可以解决此问题的?
可能需要添加一个判断来:检查一下你的操作系统,
windows和linux 在npm命令上有点区别的
举个例子:
比如:
原先这样的代码(Linux版本)
const child = spawn('npm', ['run', service]);
需要改成(Windows + Linux)
const child = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['run', service]);
如果 这是 windows 它运行 npm.cmd 如果它是 linux 则检查操作系统只是 npm
这是其中的一种方法,
还有一种其他的方法:改成这样
const child = (process.platform === 'win32' ? 'npm.cmd' : 'npm') + ' run ' + service;