Vscode Ext отображает расширение только тогда, когда в проекте есть какой-либо файл

#javascript #node.js #visual-studio-code #vscode-extensions

#javascript #node.js #visual-studio-code #vscode-расширения

Вопрос:

Я создал расширение vscode, которое обрабатывает некоторые Rakefile задачи. Теперь я хочу ограничить, чтобы расширение отображалось в проводнике только тогда, когда пользователь открывает Rakefile

для этого я использую следующую запись в package.json

  "contributes": {
    "views": {
      "explorer": [
        {
          "id": "rakeView",
          "name": "Rakee",
          "when": "resourceFilename ='Rakefile'"
        }
      ]
    },
    "commands": [
      {
        "command": "rakeView.executeTask",
        "title": "Execute",
        "icon": "images/icon.png"
      }
    ],
  

при добавлении следующей строки

 "when": "resourceFilename ='Rakefile'"
  

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

https://github.com/microsoft/vscode-extension-samples/tree/1aae138e311fb87cc3ed2782be287f5d2f78e327/task-provider-sample

Обновить

После попытки ответа ниже он все еще не работает, это весь код:

 import * as vscode from "vscode";
import { rakeTaskProvider } from "./rakeCmd";
import { TaskTreeDataProvider } from "./rakeView";

let rakeTaskProvider: vscode.Disposable | undefined;

export function activate(_context: vscode.ExtensionContext): void {
  const workspaceRoot = vscode.workspace.rootPath;

  const onChangeActiveTextEditor = () => {
    let editor = vscode.window.activeTextEditor;
    vscode.commands.executeCommand('setContext', 'rakeView:fileIsRake', editor amp;amp; editor.document.languageId === 'rakefile');
  };
  vscode.window.onDidChangeActiveTextEditor(onChangeActiveTextEditor, null, _context.subscriptions);
  onChangeActiveTextEditor();

  rakeTaskProvider = vscode.tasks.registerTaskProvider(
    rakeTaskProvider.rakeType,
    new rakeTaskProvider(workspaceRoot)
  );
  vscode.window.registerTreeDataProvider(
    "rakeView",
    new TaskTreeDataProvider(_context)
  );
  vscode.commands.registerCommand("rakeView.executeTask", function (task) {
    console.log(task);
    vscode.tasks.executeTask(task).then(
      function (value) {
        return value;
      },
      function (e) {
        console.error(
          "error",
          e
        );
      }
    );
  });
}

export function deactivate(): void {
  if (rakeTaskProvider) {
    rakeTaskProvider.dispose();
  }
}
  

package.json

 "contributes": {
    "views": {
      "explorer": [
        {
          "id": "rakeView",
          "name": "Rakke",
          "when": "rakeView:fileIsRake"
        }
      ]
    },
  

Комментарии:

1. вы непоследовательны only when user open a Rakefile и only when a project have a Rakefile

Ответ №1:

Вам нужно использовать контекст, когда изменения редактора устанавливают контекстную переменную, чтобы сигнализировать, что текущий файл является файлом Rakefile

В вашей activate функции

   const onChangeActiveTextEditor = () => {
    let editor = vscode.window.activeTextEditor;
    vscode.commands.executeCommand('setContext', 'myExtenstion:fileIsRake', editor amp;amp; editor.document.languageId === 'rake');
  };
  vscode.window.onDidChangeActiveTextEditor(onChangeActiveTextEditor, null, context.subscriptions);
  onChangeActiveTextEditor();
  

В package.json добавьте эту контекстную переменную

     "views": {
      "explorer": [
        {
          "id": "rakeView",
          "name": "Rakee",
          "when": "myExtenstion:fileIsRake"
        }
      ]
    },
  

Комментарии:

1. Спасибо, что это за «myExtension»? это свойство package.json name?

2. @BenoOdr myExtension — это просто имя вашего расширения, чтобы найти правильный LanguageID, введите LanguageID в консоль

3. спасибо, это не работает, не могли бы вы взглянуть на обновление и посмотреть, чего мне здесь не хватает?

4. @BenoOdr Что такое LanguageID для файлов Rake, используйте a console.log в расширении, чтобы узнать

5. консоль. войти во что? кроме того, мой код выглядит нормально, а пакет json