Nodejs 命令行调用 exec 与 spawn 差异--- 解决 spawn yarn ENOENT error
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']);
两者不同
输入输出处理:
spawn: 提供了输入输出的流式接口。它返回了一个 ChildProcess 对象允许你流式读写
exec: 整个输出都存到了 buffers 缓冲区,然后传递给回调。它使用起来虽然比较简单,但当命令输出的结果太大时就可能出错。
指令执行
spawn: 使用新的进程启动命令行,允许独立运行。它允许长时间运行或可执行继续交互命令
exec: 命令在 shell 中执行,输出结果在缓存区。它使用方便,但输出复杂结果是会有问题或无法在未中断命令的情况下继续进行交互命令
Shell 使用:
spawn: 默认不使用 Shell. 参数需要数组方式传递.
exec: 使用 Shell. 允许你使用 Shell 的一些特征 pipes, input/output 重定向, 和命令的置换.
错误处理:
spawn: 在 ChildProcess 对象上发送错误事件。可以监听并处理它
exec: 错误通过回调内第一个参数传递。可以据此处理
博客园: http://cnblogs.com/willian/
github: https://github.com/willian12345/
Nodejs 命令行调用 exec 与 spawn 差异--- 解决 spawn yarn ENOENT error的更多相关文章
- nodejs命令行执行时带参数
nodejs命令行执行时带参数 转 https://www.jianshu.com/p/474e6d76f867 今天项目里突然想在初始化时跑一些数据,于是想起以前在python时可以在命令行里带 ...
- Symfony2 通过命令行调用控制器
由于系统需求,需要写一个无限循环的控制器,那么既然有一个无限循环的控制器,那么就需要有一个开关,不可能直接通过route来开启吧.当然要使用高级一点的方法啊. 那就是使用控制台通过命令行(comman ...
- Maven-11: 从命令行调用插件
mvn -h显示mvn命令帮助: usage: mvn [options] [<goal(s)>] [<phase(s)>] Options: -am,--also-make ...
- 命令行调用dubbo远程服务
命令行调用dubbo远程服务 telnet远程连接到dubbo telnet 127.0.0.1 20880 查看提供服务的接口 dubbo>ls com.test.service.TestIn ...
- Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参
Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...
- VB6 实现命令行调用时附着到原控制台
Public Declare Function AttachConsole Lib "kernel32.dll" (ByVal ProcessID As Integer) As B ...
- blockdev - 从命令行调用区块设备控制程序
总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...
- Shodan搜索引擎详解及Python命令行调用
shodan常用信息搜索命令 shodan配置命令 shodan init T1N3uP0Lyeq5w0wxxxxxxxxxxxxxxx //API设置 shodan信息收集 shodan myip ...
- 关于windows环境下cordova命令行无法启动adb.exe的解决办法
使用phonegap开发手机APP,常常需要更改代码之后进行调试,使用安卓模拟器每次启动非常缓慢,而且不能保证最终在真机上的效果.所以一般都采用真机进行调试. 搭建真机的调试环境这里就不再赘述了,网上 ...
- WebService远程调用(命令行调用)
远程调用webservice 方法, 通过wsdl命令,生成webservice 对应asmx 文件的对应类(cs文件),然后将此cs文件引用到当前项目中,项目其他地方需要调用webservice方法 ...
随机推荐
- TF-VAEGAN:添加潜在嵌入(Latent Embedding)的VAEGAN处理零样本学习
前面介绍了将VAE+GAN解决零样本学习的方法:f-VAEGAN-D2,这里继续讨论引入生成模型处理零样本学习(Zero-shot Learning, ZSL)问题.论文"Latent Em ...
- 深入剖析Java中的反射,由浅入深,层层剥离!
写在开头 之前更新了不少Java的基础知识,比如Java的类.对象.基础类型.关键字.序列化.泛型.值传递等等,今天要上点深度了,来聊一聊Java中的 反射 ! 所谓反射,就是在运行时分析.检查和操作 ...
- HarmonyOS 开发入门(一)
HarmonyOS 开发入门(一) 日常逼逼叨 因为本人之前做过一些Android相关的程序开发,对移动端的开发兴趣比较浓厚,近期也了解到了一些关于华为HarmonyOS 4.0 的事件热点,结合黑马 ...
- ElasticSearch7.3学习(三十四)----生产环境集群部署总结
1.集群部署 2.结点的三个角色 主结点:master节点主要用于集群的管理及索引 比如新增结点.分片分配.索引的新增和删除等. 数据结点:data 节点上保存了数据分片,它负责索引和搜索操作. 客户 ...
- C# 12 中新增的八大功能你都知道吗?
前言 转眼之间C#都已经更新到了12了,那么C# 12 中新增的八大功能你都了解过吗?今天我们来简单介绍一下C# 12 中新增的八大功能. C#/.NET该如何自学入门?:https://www.cn ...
- NC16645 [NOIP2007]矩阵取数游戏
题目链接 题目 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵 ...
- SATA学习笔记——名词解释
SATASATA(Serial Advanced Technology Attachment,串行高级技术附件)是一种基于行业标准的串行硬件驱动器接口,是由Intel.IBM.Dell.APT.Max ...
- 编译原理LR分析
LR(0)分析存在问题及解决办法 当LR(0)含有互相冲突的项目时,则需要向前展 望符号串,检查下一个输入符号的状态 例 项目集I={X→α· bβ,A→α·,B→α· } 当面临输入符号b时,应该选 ...
- win32 - Session 0 隔离
在Windows XP,Windows Server 2003和Windows操作系统的早期版本中,所有服务都与登录控制台的第一个用户在同一会话中运行.该会话称为会话0.在会话0中一起运行服务和用户应 ...
- Golang Web 框架 Gin 基础学习教程集合目录
Gin Web 框架基础学习系列目录 01-quickstart 02-parameter 03-route 04-middleware 05-log 06-logrus 07-bind 08-val ...