Цель подписки на команду в расширении vscode? - PullRequest
3 голосов
/ 07 апреля 2019

Почему в руководстве по расширению VSCode рекомендуется подписать зарегистрированную команду на context.subscriptions?

Это не кажется необходимым или полезным из того, что я могу сказать до сих пор.

Вот фрагмент кода из расширения VSCode официальный учебник :

let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
    // The code you place here will be executed every time your command is executed

    // Display a message box to the user
    vscode.window.showInformationMessage('Hello World!');
});

context.subscriptions.push(disposable);

но, похоже, это само по себе прекрасно работает:

vscode.commands.registerCommand('extension.helloWorld', () => {
    vscode.window.showInformationMessage('Hello World!');
});

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

Справочник по VS Code API определяет subscriptions как:

подписки: {dispose} []

Массив, к которому можно добавить одноразовые товары. Когда это расширение деактивировано, одноразовые изделия будут утилизированы.

Означает ли это, что если зарегистрированные команды НЕ удаляются, то их слушатели как-то зависают даже после закрытия расширения?

TDLR - стоит ли подписываться на мои команды или нет, и почему?

Любые объяснения или идеи будут оценены!

1 Ответ

3 голосов
/ 08 апреля 2019

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

vscode.commands.registerCommand возвращает одноразовый предмет. Удаление возвращенного объекта отменяет регистрацию команды, позволяя VS Code очистить любое внутреннее состояние / дескрипторы, которые могут у него быть.

Короче говоря, все одноразовые объекты, создаваемые вашим расширением, должны каким-то образом попадать в subscriptions, чтобы их можно было правильно очистить при выгрузке вашего расширения. Отсутствие регистрации одноразового использования может не вызывать очевидных проблем для пользователей в 99% случаев, но может вызвать проблемы в тех случаях, когда пользователи включают и отключают ваше расширение без перезапуска vscode

...