Как обнаружить сбой выполнения задачи из расширения vscode? - PullRequest
0 голосов
/ 08 мая 2020

Расширение кода My Visual Studio позволяет пользователям развертывать и отлаживать приложения на удаленных устройствах.

Для этого мне нужно, чтобы приложение было «установлено» в локальной папке, которое затем будет синхронизировано с целевым устройством с помощью rsyn c.

Некоторые языки / инструменты предоставляют простой и стандартизированный способ сделать это (например, do tnet publi sh для. NET основных приложений), другие - нет.

Для обеспечения гибкости и предоставления пользователям возможности выбирать метод, который они предпочитают, мое расширение полагается на задачу с заданным c именем для выполнения операции. У меня есть функция resolveDebugConfiguration, которая выполняет задачу, а затем заполняет информацию внутри отладочного соединения, чтобы пользователь мог отлаживать свое приложение.

Пока это отдельная задача, это не проблема. Я могу запустить его с помощью vscode.tasks.executeTask и дождаться его завершения с помощью OnEndTaskProcess. Задача должна быть оболочкой / процессом, а ненулевой код выхода означает сбой. Я также проверяю OnEndTask, чтобы убедиться, что я не пропущу другие виды завершения (например: недопустимый путь в поле cmd или пользователь определил настраиваемую задачу et c.).

Некоторые пользователи для этого может потребоваться более сложная структура. Например, их задачи развертывания зависят от задачи сборки, чтобы убедиться, что последняя версия развернута, или выполнять дополнительные операции между ними, поэтому у меня больше нет одной задачи, а есть цепочка задач, связанных через зависимости.

Это нормально, и все еще работает ... до тех пор, пока не произойдет сбой.

Или, лучше, пока не завершится сбой одной из задач зависимости.

В этом случае у меня нет уведомления от 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...

Некоторые задачи могут занять много времени , поэтому использование тайм-аута может быть решением хуже, чем проблема.

Было бы неплохо, если бы функция OnEndTask вызывалась даже при сбое зависимости, предотвращая выполнение фактической задачи, но, похоже, этого не происходит.

Я планирую открыть проблему с репозиторием vscode на github, но, возможно, у кого-то есть решение, которое не связано с изменением самого ide.

...