NX Monorepo中CLI无换行交互式提示不显示问题解决
解决NX Monorepo中CLI交互式输入提示不显示的问题
问题根源
NX默认会对子进程的输出进行缓冲,仅当输出包含换行符或达到缓冲阈值时才会刷新到终端。而目标CLI使用不带换行的输入提示(如What is your name?),导致提示被缓冲无法实时显示,尽管输入能正常响应。
解决方案
1. 修改Node.js调用脚本的execa配置
调整execa参数,让子进程直接继承父进程的终端IO,同时针对不同语言的CLI添加缓冲禁用配置:
import * as execa from 'execa'; const main = async () => { await execa(cmd, args, { // 完全继承父进程的标准输入/输出/错误流,绕过NX的缓冲 stdio: 'inherit', env: { ...process.env, // 强制Python关闭输出缓冲(针对Python编写的CLI) PYTHONUNBUFFERED: '1', // 确保Node.js的readline模块正常工作(针对JS/TS编写的CLI) NODE_NO_READLINE: '0' } }); }; main();
2. 调整NX任务配置
在项目的project.json中,为对应的运行任务添加stdio: inherit配置,确保NX不对该任务的输出进行缓冲:
{ "targets": { "run-target-cli": { "executor": "nx:run-script", "options": { "script": "path/to/your/above/node/script.js", "stdio": "inherit" } } } }
如果是直接运行目标CLI命令而非Node.js脚本,可直接配置任务:
{ "targets": { "run-cli": { "executor": "nx:run-commands", "options": { "command": "python path/to/your/cli.py", // 或node path/to/your/cli.js "stdio": "inherit" } } } }
验证效果
运行nx run your-project:run-target-cli(或对应任务名),此时终端会实时显示What is your name?提示,输入内容后程序也能正常响应并输出结果。
内容的提问来源于stack exchange,提问作者PaulMest
相关产品推荐
相关产品推荐

