Плагин / код Visual Studio 2010 для очистки предупреждений «Список ошибок» перед каждой сборкой - PullRequest
4 голосов
/ 12 октября 2011

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

Я использую Chirpy 2.0 инструменты для запуска JSHint и JSLint в моих файлах JS, и эти инструменты генерируют много ложных срабатываний.

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

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

Я вижу метод .Clear () для окна вывода, но не для списка ошибок. Это выполнимо?

1 Ответ

2 голосов
/ 20 декабря 2013

Когда-то я был разработчиком пакета Add-In / VSIX / MEF ...

В скором времени ответ будет отрицательным, но я должен сделать это на долгом пути:

Надстройки, пакеты (управляемые или нет) имеют отдельный доступ к уровню обслуживания VS. Каждая ошибка принадлежит репортеру (если они управляют ими, как это делает Chirpy), поэтому вы не можете обрабатывать ошибки, созданные Chirpy 2.0

Я несколько смотрю на его исходный код, и он настаивает на своих ошибках, полученных инструментами из коллекции Singleton под названием TaskList.

Удаление элементов коллекции происходит в нескольких частях кода в последней версии с помощью метода RemoveAll:

  1. Первый: после того, как растворение закрыто.

  2. этим:

private static string[] buildCommands = new[] { "Build.BuildSelection", "Build.BuildSolution", "ClassViewContextMenus.ClassViewProject.Build" };

    private void CommandEvents_BeforeExecute(string guid, int id, object customIn, object customOut, ref bool cancelDefault) {
            EnvDTE.Command objCommand = default(EnvDTE.Command);
            string commandName = null;

            try {
                objCommand = this.App.Commands.Item(guid, id);
            } catch (System.ArgumentException) {
            }

            if (objCommand != null) {
                commandName = objCommand.Name;

                var settings = new Settings();
                if (settings.T4RunAsBuild) {
                    if (buildCommands.Contains(commandName)) {
                        if (this.tasks != null) {
                            this.tasks.RemoveAll();
                        }

                        Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
                    }
                }
            }
        }

Как видите, чистота результатов зависит от многих факторов. Сначала о настройке (которую я не знаю, где установить в графическом интерфейсе или конфигах, но, похоже, его значение формируется из флажка). Во-вторых, массив имен, которые не содержат каждое имя команды сборки.

Так что я вижу решение, но только на пути изменения и перестройки / повторного развертывания вашей собственной версии из Chirpy (и сделать запрос Pull):

Код не должен зависеть от команд и их имен. (пересборки отсутствуют, например)

Вы можете изменить метод выше примерно так:

this.eventsOnBuild.OnBuildBegin += ( scope, action ) =>
{
    if (action != vsBuildAction.vsBuildActionDeploy)
    {
        if (this.tasks != null)
        {
            this.tasks.RemoveAll();
        }

        if (settings.T4RunAsBuild && action != vsBuildAction.vsBuildActionClean)
        {
           Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
        }
    }
};

Или с помощью другого эквивалентного метода-обработчика вместо лямбда-выражения. Вы должны поместить его в метод OnStartupComplete подписки класса Chirp.

Отмена подписки должна быть помещена в метод OnDisconnection в том же классе. (Как и для всех других обработчиков с подпиской ...)

Обновление:

Когда надстройка отключена, это не означает, что Studio будет закрыта немедленно. Надстройка может быть выгружена. Так что вам следует также вызвать RemoveAll из OnDisconneconnection. (Или удалите и утилизируйте TaskList ...)

Update2:

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

...