Как ожидать задачи сборки в расширении кода VS? - PullRequest
1 голос
/ 25 апреля 2020
let result = await vscode.commands.executeCommand('workbench.action.tasks.build');

разрешается немедленно.

Как мне дождаться задачи сборки с VS Code API?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я думаю, это зависит от того, как основная команда выполняется в расширении. Ts

Будучи новичком в JS / TS, я могу ошибаться, но просто пытаюсь помочь:

убедитесь, что vscode.command.registerCommand не является асинхронным, как показано ниже:

    context.subscriptions.push(vscode.commands.registerCommand('extension.openSettings', () => {
        return vscode.commands.executeCommand("workbench.action.openSettings", "settingsName");
    }));

Это можно сравнить с чем-то асинхронным c, как показано ниже:

    context.subscriptions.push(vscode.commands.registerCommand('extension.removeHost', async (hostID) => {

        const bigipHosts: Array<string> | undefined = vscode.workspace.getConfiguration().get('extension.hosts');

        const newHosts = Hosts?.filter( item => item != hostID.label)

        await vscode.workspace.getConfiguration().update('f5-fast.hosts', newBigipHosts, vscode.ConfigurationTarget.Global);
        hostsTreeProvider.refresh();
    }));
0 голосов
/ 09 мая 2020

Я понял! Задачи нельзя ожидать от vscode.tasks.executeTask, но мы можем ждать vscode.tasks.onDidEndTask и проверить, является ли завершенная задача нашей задачей.

async function executeBuildTask(task: vscode.Task) {
    const execution = await vscode.tasks.executeTask(task);

    return new Promise<void>(resolve => {
        let disposable = vscode.tasks.onDidEndTask(e => {
            if (e.execution.task.group === vscode.TaskGroup.Build) {
                disposable.dispose();
                resolve();
            }
        });
    });
}

async function getBuildTasks() {
    return new Promise<vscode.Task[]>(resolve => {
        vscode.tasks.fetchTasks().then((tasks) => {
            resolve(tasks.filter((task) => task.group === vscode.TaskGroup.Build));
        });
    });
}

export function activate(context: vscode.ExtensionContext) {
    context.subscriptions.push(vscode.commands.registerCommand('extension.helloWorld', async () => {
        const buildTasks = await getBuildTasks();
        await executeBuildTask(buildTasks[0]);
    }));
}

Обратите внимание, что в настоящее время существует ошибка # 96643 , которая не позволяет нам сравнивать объекты vscode.Task: if (e.execution.task === execution.task) { ... }

...