Visual studio code 如何从vscode扩展检测任务执行失败?

Visual studio code 如何从vscode扩展检测任务执行失败?,visual-studio-code,vscode-extensions,vscode-debugger,vscode-tasks,Visual Studio Code,Vscode Extensions,Vscode Debugger,Vscode Tasks,My Visual Studio代码扩展允许用户在远程设备上部署和调试应用程序 为此,我需要将应用程序“安装”到本地文件夹中,然后使用rsync将其同步到目标 一些语言/工具提供了一种简单且标准化的方法(例如:dotnet发布,用于.NET核心应用程序),而其他语言/工具则没有 为了灵活并让用户选择他们喜欢的方法,我的扩展依赖于具有特定名称的任务来执行操作。 我有一个resolveDebugConfiguration函数,它执行任务,然后在调试连接中填写信息,让用户调试他的应用程序 只要这是一项

My Visual Studio代码扩展允许用户在远程设备上部署和调试应用程序

为此,我需要将应用程序“安装”到本地文件夹中,然后使用rsync将其同步到目标

一些语言/工具提供了一种简单且标准化的方法(例如:dotnet发布,用于.NET核心应用程序),而其他语言/工具则没有

为了灵活并让用户选择他们喜欢的方法,我的扩展依赖于具有特定名称的任务来执行操作。 我有一个resolveDebugConfiguration函数,它执行任务,然后在调试连接中填写信息,让用户调试他的应用程序

只要这是一项单一任务,这就不是问题。我可以使用vscode.tasks.executeTask启动它,并使用OnEndTaskProcess等待它完成。任务应该是shell/进程,非零退出代码表示失败。我还检查了OnEndTask,以确保不会错过其他类型的完成(例如:cmd字段中的无效路径或用户定义的自定义任务等)

一些用户可能希望为此使用更复杂的结构。例如,让他们的部署任务依赖于构建任务,以确保部署最新版本,或者在这两者之间执行其他操作,因此我不再有单个任务,而是通过dependson连接的任务链

这是好的,仍然有效…直到它失败

或者,更好,直到其中一个依赖项任务失败

在这种情况下,我没有收到来自OnEndTaskProcess甚至OnEndTask的通知,失败后的任务似乎永远留在vscode.tasks.taskExecutions列表中。 因此,我的resolveDebugConfiguration函数永远不会返回,vscode永远处于“启动调试器”状态

我的代码如下所示:

        // retrieve task given its name
        const tasks = await vscode.tasks.fetchTasks();

        var deploy: vscode.Task | undefined = undefined;

        for (var task of tasks) {
            switch (task.name) {
                case "deploy":
                    deploy = task;
                    break;
            }
        }

        if (deploy === undefined) {
            // error message telling user that he has to define a task named "deploy"
            return null;
        }

        var emitter = new EventEmitter();

        // the process event arrives before the generic terminate one (checked inside vscode sources)
        vscode.tasks.onDidEndTaskProcess(e => {
            if (e.execution.task.name === "deploy") {
                emitter.emit("terminated", e.exitCode);
            }
        });
        vscode.tasks.onDidEndTask(e => {
            // check if task is still running, otherwise report an error
            var taskexecutions = vscode.tasks.taskExecutions;

            for (var taskexecution of taskexecutions) {
                if (taskexecution.task.name === "deploy") {
                    return;
                }
            }
            emitter.emit("terminated", -1);
        });

        try {
            var execution = await vscode.tasks.executeTask(deploy);
        }
        catch (e) {
            // catch execution exceptions and show a message to the user
            return null;
        }

        var code = await new Promise<Number>((resolve, reject) => {
            emitter.on("terminated", code => resolve(code));
        });

        if (code !== 0) {
            // deploy task failed
            return null;
        }

        // local deployment succeeded, move on...
//检索给定名称的任务
const tasks=等待vscode.tasks.fetchTasks();
var deploy:vscode.Task |未定义=未定义;
for(任务的var任务){
开关(task.name){
案例“部署”:
部署=任务;
打破
}
}
如果(部署===未定义){
//告诉用户必须定义名为“部署”的任务的错误消息
返回null;
}
var emitter=neweventemitter();
//流程事件在通用终止事件之前到达(在vscode源内部检查)
vscode.tasks.onDidEndTaskProcess(e=>{
if(e.execution.task.name==“部署”){
发射器。发射(“终止”,即exitCode);
}
});
vscode.tasks.onDidEndTask(e=>{
//检查任务是否仍在运行,否则报告错误
var taskexecutions=vscode.tasks.taskexecutions;
for(var taskexecution of taskexecutions){
if(taskexecution.task.name==“部署”){
返回;
}
}
发射器发射(“终止”、-1);
});
试一试{
var execution=wait vscode.tasks.executeTask(部署);
}
捕获(e){
//捕获执行异常并向用户显示消息
返回null;
}
var代码=等待新承诺((解决、拒绝)=>{
发射器.on(“终止”,code=>resolve(code));
});
如果(代码!==0){
//部署任务失败
返回null;
}
//本地部署成功,请继续。。。
有些任务可能需要很长时间,因此使用超时可能是比问题更糟糕的解决方案

即使在依赖项失败时调用onedtask也会很好,这会阻止实际任务的运行,但这似乎不会发生

我计划在vscode github repo上提出一个问题,但也许有人有一个解决方案,它不涉及ide本身的更改