Angular Schematics脚本执行无交互提示致工作区创建失败求助
问题
我正在编写脚本,用Angular Schematics生成工作区。我的Schematics配置里包含必填的name参数,带有交互提示:
"$id": "MySchematics", "$schema": "http://json-schema.org/schema", "description": "Create a workspace", "properties": { "name": { "$default": { "$source": "argv", "index": 0 }, "description": "The name of the workspace", "type": "string", "x-prompt": "What name for the workspace?" } }, "required": ["name"], "title": "Workspace schematics", "type": "object"
脚本代码如下:
const exec = require("child_process").exec; const npm = require("npm"); exec("npm run build"); exec( "schematics .\\:my-schematics --debug=false" );
脚本执行前会完成文件夹准备操作,因此必须通过脚本执行而非直接在终端运行命令。
现象:直接在终端执行schematics .\:my-schematics-3-1 --debug=false时,会弹出交互提示要求输入工作区名称,命令可正常执行;但通过脚本执行时,交互提示不出现,命令看似无报错,却因缺少必填的name参数导致工作区未创建。
原因
child_process.exec默认不会将子进程的标准输入/输出/错误流(stdin/stdout/stderr)与当前终端绑定,导致Schematics的交互提示无法输出到终端,终端的输入也无法传递给子进程,最终Schematics因缺少必填参数静默失败。另外原脚本中两个exec是并发执行的,可能npm build还未完成就启动了schematics,也会引发异常。
解决方法
1. 给exec配置stdio继承
修改exec调用,添加stdio: 'inherit'让子进程复用终端的输入输出流,同时确保npm build完成后再执行schematics:
const exec = require("child_process").exec; exec("npm run build", (error) => { if (error) { console.error(`Build failed: ${error.message}`); return; } exec( "schematics .\\:my-schematics --debug=false", { stdio: 'inherit' }, // 关键配置:让子进程使用当前终端的输入输出 (error) => { if (error) console.error(`Schematics failed: ${error.message}`); } ); });
2. 使用spawn替代exec
spawn更适合处理交互式命令,同样配置stdio: 'inherit'即可:
const { spawn } = require("child_process"); // 先执行build命令 const buildProcess = spawn("npm", ["run", "build"], { stdio: 'inherit' }); buildProcess.on("close", (code) => { if (code !== 0) { console.error(`Build exited with code ${code}`); return; } // build完成后执行schematics spawn("schematics", [".\\:my-schematics", "--debug=false"], { stdio: 'inherit' }); });
spawn需要将命令和参数分开传递,比exec更安全,能避免命令注入风险。
3. 直接传入name参数(跳过交互)
如果不需要交互流程,可以在命令中直接指定name参数,实现完全自动化执行:
exec( "schematics .\\:my-schematics --debug=false --name=my-workspace", { stdio: 'inherit' } );
内容的提问来源于stack exchange,提问作者E.Tiake
相关产品推荐
相关产品推荐

