You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:25:35