AsiaDIT 2022-05-08 13:46 采纳率: 42.9%
浏览 59
已结题

node自定义命令行工具cli,运行报错Error: spawn npm ENOENT

问题遇到的现象和发生背景

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的环境变量都认真检查过了,都是配置好的。并没有卵用。

我想要达到的结果

有没有其他思路可以解决此问题的?

  • 写回答

2条回答 默认 最新

  • hyh123a 全栈领域新星创作者 2022-05-08 14:10
    关注

    可能需要添加一个判断来:检查一下你的操作系统,
    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;
    

    具体的步骤和实施你可以看下这个链接:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败