在task工具的subshell环境中如何让node程序正常唤起终端用户输入提示
解决方案
最优方案(一行命令实现)
直接使用task原生的raw输出模式启动任务即可,命令如下:task --output=raw 你的任务名
该模式会完全关闭task的日志格式化、输出前缀添加逻辑,所有子任务的输入输出会直接绑定到当前主终端,node脚本的定制化提示、输入监听功能都可以正常运行,不需要额外改造代码。
注意:该模式下并行执行的无交互任务输出可能会出现穿插,如果你需要保留其他任务的输出格式化能力,可以选择下面的方案。
备选方案1:node直接读写终端设备
如果需要保留task的常规日志标记能力,不需要修改task启动参数,可以改造node脚本直接读写当前终端的专属设备文件/dev/tty,绕过task的输出拦截:
const fs = require('fs') // 打开终端读写流 const ttyOutput = fs.createWriteStream('/dev/tty') const ttyInput = fs.createReadStream('/dev/tty') // 输出提示不受task日志模块影响 ttyOutput.write('请输入自定义配置:') ttyInput.on('data', (buf) => { const input = buf.toString().trim() // 此处处理用户输入逻辑 console.log('拿到输入:', input) // 关闭终端流 ttyInput.destroy() ttyOutput.destroy() })
该方案完全不影响task的其他输出逻辑,其他并行任务的日志依然会正常被task标记。
备选方案2:拆分交互与构建流程
如果后续构建步骤完全不需要交互,可以把交互逻辑和task执行拆分,先单独运行node脚本拿到用户输入,再把参数传递给task执行后续构建:
# 先执行交互脚本拿到输入 CONFIG_VAL=$(node your-interactive-script.js) # 传入参数运行task构建 task build -- USER_CONFIG="$CONFIG_VAL"
你之前考虑的自定义socket、bash alias方案不需要额外开发,上述原生支持的方案已经可以覆盖绝大多数场景。
内容的提问来源于stack exchange,提问作者HeyMegabyte
相关产品推荐
相关产品推荐

