VS Code任务流程stdout / stderr

时间:2019-11-06 20:18:48

标签: visual-studio-code vscode-extensions vscode-tasks

我正在尝试为VS Code扩展编写一些测试。

该扩展程序基本上使用ShellExecution创建一些任务,以运行本地可执行文件,例如:

new Task(
  definition,
  folder,
  name,
  source,
  new ShellExecution('./runme', { cwd })
);

我希望能够测试Shell进程,但是无法访问此进程,因此无法附加到任何输出流,也无法获取退出代码。

在测试中,我将像这样执行任务:await vscode.tasks.executeTask(task);成功运行,而不管ShellExecution创建的进程的退出代码如何。

有什么方法可以访问执行任务所生成的子进程?

1 个答案:

答案 0 :(得分:1)

使用Node.js'child_process,这很容易做到。我将其用于run an external Java jar并捕获其输出以获取错误。主要部分是:

            let java = child_process.spawn("java", parameters, spawnOptions);

            let buffer = "";
            java.stderr.on("data", (data) => {
                let text = data.toString();
                if (text.startsWith("Picked up _JAVA_OPTIONS:")) {
                    let endOfInfo = text.indexOf("\n");
                    if (endOfInfo == -1) {
                        text = "";
                    } else {
                        text = text.substr(endOfInfo + 1, text.length);
                    }
                }

                if (text.length > 0) {
                    buffer += "\n" + text;
                }
            });

            java.on("close", (code) => {
                let parser = new ErrorParser(dependencies);
                if (parser.convertErrorsToDiagnostics(buffer)) {
                    thisRef.setupInterpreters(options.outputDir);
                    resolve(fileList);
                } else {
                    reject(buffer); // Treat this as non-grammar error (e.g. Java exception).
                }
            });