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']);

问题又解决了

还有如果你用的是 pnpm , 解决 spawn pnpm ENOENT error 也是一样的处理方法

const { spawn } = require('child_process');
const command = spawn('pnpm.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/

Nodejs 命令行调用 exec 与 spawn 差异--- 解决 spawn yarn ENOENT error的更多相关文章

  1. nodejs命令行执行时带参数

    nodejs命令行执行时带参数 转 https://www.jianshu.com/p/474e6d76f867   今天项目里突然想在初始化时跑一些数据,于是想起以前在python时可以在命令行里带 ...

  2. Symfony2 通过命令行调用控制器

    由于系统需求,需要写一个无限循环的控制器,那么既然有一个无限循环的控制器,那么就需要有一个开关,不可能直接通过route来开启吧.当然要使用高级一点的方法啊. 那就是使用控制台通过命令行(comman ...

  3. Maven-11: 从命令行调用插件

    mvn -h显示mvn命令帮助: usage: mvn [options] [<goal(s)>] [<phase(s)>] Options: -am,--also-make ...

  4. 命令行调用dubbo远程服务

    命令行调用dubbo远程服务 telnet远程连接到dubbo telnet 127.0.0.1 20880 查看提供服务的接口 dubbo>ls com.test.service.TestIn ...

  5. Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

    Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...

  6. VB6 实现命令行调用时附着到原控制台

    Public Declare Function AttachConsole Lib "kernel32.dll" (ByVal ProcessID As Integer) As B ...

  7. blockdev - 从命令行调用区块设备控制程序

    总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...

  8. Shodan搜索引擎详解及Python命令行调用

    shodan常用信息搜索命令 shodan配置命令 shodan init T1N3uP0Lyeq5w0wxxxxxxxxxxxxxxx //API设置 shodan信息收集 shodan myip ...

  9. 关于windows环境下cordova命令行无法启动adb.exe的解决办法

    使用phonegap开发手机APP,常常需要更改代码之后进行调试,使用安卓模拟器每次启动非常缓慢,而且不能保证最终在真机上的效果.所以一般都采用真机进行调试. 搭建真机的调试环境这里就不再赘述了,网上 ...

  10. WebService远程调用(命令行调用)

    远程调用webservice 方法, 通过wsdl命令,生成webservice 对应asmx 文件的对应类(cs文件),然后将此cs文件引用到当前项目中,项目其他地方需要调用webservice方法 ...

随机推荐

  1. Navicat 15 for MySQL 破解【我亲测可用】

    1.去官网下载正版 https://www.navicat.com.cn/ 2.破解下载:https://files-cdn.cnblogs.com/files/del88/NavicatKeygen ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  3. Shell中调用可执行文件,手动执行可以执行,crontab执行就报错:exec: java: not found

    今天发现一个很奇怪的问题,就是我编写的shell脚本, 手动执行可以正常执行,但是放到crontab中就报错.line 60: exec: java: not  found 百度搜索发现原来是java ...

  4. Markdown:简洁高效的文本标记语言

    引言 在当今信息爆炸的时代,我们需要一种简洁.高效的文本标记语言来排版和发布内容.Markdown应运而生,它是一种轻量级的文本标记语言,以其简单易学.易读易写的特点,成为了广大写作者的首选工具.本文 ...

  5. CF-926(已更新:B)

    CF-926 两点睡,七点起,阎王夸我好身体-- 主要这场实在是难绷,两个小时都在C题上吊死了,也不是没想过跳题,只是后面的题我更是一点思路都没有-^- "就喜欢这种被揭穿的感觉,爽!&qu ...

  6. npm修改源地址,使用nrm管理源仓库地址

    壹 ❀ 引 事实上现在大部分的公司,都会有自己的npm三方包管理仓库,利于三方包版本管理以及项目三方依赖稳定性.但如果我们npm配置了公司的源仓库地址,以后所有的三方包来源都将以这个仓库为准,假设你现 ...

  7. 49从零开始用Rust编写nginx,我竟然在同一个端口上绑定了多少IP

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  8. NC22604 小A与任务

    题目链接 题目 题目描述 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 \(x_i\) 的时间,同时完成第 i 个任务的时间不 ...

  9. NC51180 Accumulation Degree

    题目链接 题目 题目描述 Trees are an important component of the natural landscape because of their prevention o ...

  10. NC16671 [NOIP2006]金明的预算方案

    题目链接 题目 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算, ...