Visual studio code 如何从vscode扩展检测任务执行失败?
My Visual Studio代码扩展允许用户在远程设备上部署和调试应用程序 为此,我需要将应用程序“安装”到本地文件夹中,然后使用rsync将其同步到目标 一些语言/工具提供了一种简单且标准化的方法(例如:dotnet发布,用于.NET核心应用程序),而其他语言/工具则没有 为了灵活并让用户选择他们喜欢的方法,我的扩展依赖于具有特定名称的任务来执行操作。 我有一个resolveDebugConfiguration函数,它执行任务,然后在调试连接中填写信息,让用户调试他的应用程序 只要这是一项单一任务,这就不是问题。我可以使用vscode.tasks.executeTask启动它,并使用OnEndTaskProcess等待它完成。任务应该是shell/进程,非零退出代码表示失败。我还检查了OnEndTask,以确保不会错过其他类型的完成(例如:cmd字段中的无效路径或用户定义的自定义任务等) 一些用户可能希望为此使用更复杂的结构。例如,让他们的部署任务依赖于构建任务,以确保部署最新版本,或者在这两者之间执行其他操作,因此我不再有单个任务,而是通过dependson连接的任务链 这是好的,仍然有效…直到它失败 或者,更好,直到其中一个依赖项任务失败 在这种情况下,我没有收到来自OnEndTaskProcess甚至OnEndTask的通知,失败后的任务似乎永远留在vscode.tasks.taskExecutions列表中。 因此,我的resolveDebugConfiguration函数永远不会返回,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函数,它执行任务,然后在调试连接中填写信息,让用户调试他的应用程序 只要这是一项
// 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本身的更改