首页 > 编程语言 >Nodejs 命令行调用 exec 与 spawn 差异

Nodejs 命令行调用 exec 与 spawn 差异

时间:2023-09-18 13:45:34浏览次数:36  
标签:spawn const Nodejs exec yarn command data

Nodejs 命令行调用 exec 与 spawn 差异

比如在前端工程项目中 Nodejs 要调用命令行命令如:

yarn electron:build

exec 调用 yarn 命令,为了能使命令行能实时打印输出正在编译的命令

以异步形式调用 exec 使用 stdout.on 方式监听标准输出,并打印

 // 打包 electron
 const buildElectron = () => {
   return new Promise((resolve, reject)=> {
     console.log(`yarn electron:build`)
     const buildExec = exec(`yarn electron:build`, (error, stdout, stderr) => {
       if (error) {
         console.error(`exec error: ${error}`);
         reject()
         return;
       }
       resolve()
     });

     buildExec.stdout.on('data', function(data) {
	 	// 此处会实时打印输出
       console.log(data.toString()) 
     });
   })
 }
 // 启动调用
 buildElectron();

对于普通的命令行来说这足够了,但当你的命令行输出内容较大时,exec 命令就不行了

此时需要更换 spawn 命令

const command = spawn('yarn', ['command']);

spawn 使用 child_process 模块的方法,但与 exec 不同的是,命令行的参数需要以数组的形式传递进去:

const { spawn } = require('child_process');

const command = spawn('yarn', ['command']);

command.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

command.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

command.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

然后就在我的 PC 电脑上报错了

spawn yarn enoent

问一下 chatgpt 这是啥错误:

大至意思是 spawn 命令在执行时找不到 yarn 命令, 执行命令时需要带上具体路径

spawn('C:\Program Files\nodejs\yarn', ['command']);

按以上提示后运行以命令

还是报错

继续问 chatgpt

然后答案是,需要用 yarn.cmd 如下:

const { spawn } = require('child_process');
const command = spawn('C:\\Program Files\\nodejs\\yarn.cmd', ['command']);

写死路径,太不科学了,如果其它前端小伙伴接取代码行动的话说不定会报错。。。

最后发现直接用 yarm.cmd 即可,不用完整路径

const { spawn } = require('child_process');
const command = spawn('yarn.cmd', ['command']);

问题又解决了

两者不同

  1. 输入输出处理:

    • spawn: 提供了输入输出的流式接口。它返回了一个 ChildProcess 对象允许你流式读写

    • exec: 整个输出都存到了 buffers 缓冲区,然后传递给回调。它使用起来虽然比较简单,但当命令输出的结果太大时就可能出错。

  2. 指令执行

    • spawn: 使用新的进程启动命令行,允许独立运行。它允许长时间运行或可执行继续交互命令

    • exec: 命令在 shell 中执行,输出结果在缓存区。它使用方便,但输出复杂结果是会有问题或无法在未中断命令的情况下继续进行交互命令

  3. Shell 使用:

    • spawn: 默认不使用 Shell. 参数需要数组方式传递.

    • exec: 使用 Shell. 允许你使用 Shell 的一些特征 pipes, input/output 重定向, 和命令的置换.

  4. 错误处理:

    • spawn: 在 ChildProcess 对象上发送错误事件。可以监听并处理它

    • exec: 错误通过回调内第一个参数传递。可以据此处理


博客园: http://cnblogs.com/willian/
github: https://github.com/willian12345/

标签:spawn,const,Nodejs,exec,yarn,command,data
From: https://www.cnblogs.com/willian/p/17604217.html

相关文章

  • 添加Element ui依赖报错:npm ERR code EPERM,syscall mkdir, npm ERR! path D:\Vue\
    添加Elementui依赖报错:npmERRcodeEPERM,syscallmkdir,npmERR!pathD:\Vue\nodejs\node_cache\_cacache\index-v5\f3\de具体报错信息如下:我这个是在IDEA控制台输入npmielement-ui-S添加elementui依赖时出现的报错解决办法:修改nodejs(安装node的安装地址那里)......
  • SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据
    一、背景:    利用ThreadPoolTaskExecutor多线程异步批量插入,提高百万级数据插入效率。ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。ThreadPoolTaskExecutor是ThreadPoolExecutor的封装,所以,性能更加优秀,推荐ThreadPoolTaskExecutor。二、具体细节:2.1、配置app......
  • 软件测试|Docker exec命令详细使用指南
    简介Dockerexec命令是Docker提供的一个强大工具,用于在正在运行的容器中执行命令。本文将详细介绍Dockerexec命令的用法和示例,帮助大家更好地理解和使用这个命令。Docker是一种流行的容器化平台,允许我们在容器中运行应用程序。有时候,在容器内执行命令可以帮助我们调试、排查问......
  • Nodejs+Express+MongoDB实战
    项目安装安装express脚手架:npminstallexpress-generator-g创建项目:express-eproject-e代表使用ejs模板,project是项目名称进入项目:npminstall下载依赖包安装nodemon:npminstallnodemon-g使用nodemon来启动项目,不用node来启动启动项目:npmstart,端口号在www启动文件中可以......
  • nodejs+koa2+mongodb 从0到1搭建自己的项目
    nodejs+koa2+mongodb从0到1搭建自己的项目YDJFE2018-09-2811:2419207   相信这对于想要入门写nodejs的朋友来说,一定会有所收获,那么,下面开始我们的正题(这里不使用koa-generator脚手架,我们直接自己搭建项目,适用于前后端分离)一:创建项目可以在全局中安装koa依赖包......
  • 在nodejs中使用Typescript 金字教程
    1.首先新建一个项目npminit-yes2.开启Typescript依赖npminstalltypescript--save-dev安装typescript,现在我们可以通过命令行来使用tsc命令3.安装nodejs类型npminstall@types/node--save-dev4.使用命令创建一个tsconfig.json文件npxtsc--init--rootDir......
  • nodeJs读取JOSN文件导出多个word文件
    前言最近遇到一个需求,读取JOSN文件,以JSON文件的标题为word的文件名导出多个文档,利用nodeJs和 officegen实现了该功能exportWords.js代码如下/***读取指定文件夹下的JSON文件,导出多个word文件*一个json文件导出多个word文件,通常以json文件中的title作为导出的word的文......
  • nodeJS读取JSON文件导出word文档
    前言最近遇到一个需求,将JSON文件的内容,导出到word文档,利用nodeJs和Officegen实现了文件导出的功能exportAWord.js代码如下/***读取指定文件夹下的JSON文件,导出为word*一个json文件为一个word,以json文件的名称为word文件的名称*/letfs=require("fs");letpath=......
  • ExecutorService VS Timer
    IhavecodewhereIscheduletaskusingjava.util.timer.IwaslookingaroundandsawExecutorServicecandothesame.Sothisquestionhere,haveyouusedTimerandExectuorServicetoscheduletasks,whatisthebenefitofoneusing......
  • Node.js child_process spawn All In One
    Node.jschild_processspawnAllInOneNode.js多线程//const{spawn}=require('child_process');const{spawn}=require('node:child_process');//$ls-al/usr等价于constls=spawn('ls',['-lh','/usr�......