【问题标题】:Visual Studio 2010 plugin / code to clear "Error List" warnings before each build每次构建之前清除“错误列表”警告的 Visual Studio 2010 插件/代码
【发布时间】:2011-10-12 00:03:17
【问题描述】:

VS2010 快把我逼疯了:每当我重建时,之前编译中的 “错误列表”警告 都会保留,并且任何新警告都会简单地添加到名单。随着时间的推移,这个列表变得异常冗长和笨拙。

我正在使用 Chirpy 2.0 工具在我的 JS 文件上运行 JSHintJSLint,这些工具会产生很多错误积极的。

我一直在寻找一种简单的方法来清除此窗口的内容,但唯一可以 100% 工作的手动机制是关闭并重新打开解决方案。不是很优雅。

我想编写一个小型 VS 插件或在编译之前调用的一些代码以清除此列表,这样我就可以只关注当前加载的文件的新警告。

我看到输出窗口有一个 .Clear() 方法,但错误列表没有。这可行吗?

【问题讨论】:

  • 这很奇怪 - 每当我建立警告列表时都会被清除。您每次都如何重建?
  • 可能与 Chirpy 2.0 工具有关。这是一个链接:chirpy.codeplex.com 我已经尝试了一切:干净的构建(用于解决方案,用于项目)。我试过关闭窗口、重新打开它等等。我什至试过卸载项目/重新加载项目。没有什么帮助。警告列表保持不变,直到我关闭解决方案然后重新打开它。
  • 这是 VS 2008 的类似投诉(显然也未解决)stackoverflow.com/questions/336854/…
  • VS 错误列表不能被任何加载项清除,除了添加它们的加载项,所以如果 chripy 在错误列表中添加错误,它可能有一个错误,当新的构建开始。
  • 关闭和重新打开解决方案总是对我有用...

标签: visual-studio-2010 add-in visual-studio-addins error-list


【解决方案1】:

曾几何时,我是插件/VSIX 包/MEF 开发人员...

答案很快是否定的,但我必须在漫长的道路上这样做:

加载项、包(托管或非托管)可以分别访问 VS 服务级别。每个错误都属于报告者(如果他们像 Chirpy 那样管理它们),因此您无法处理由 Chirpy 2.0 创建的错误

我仔细查看了它的源代码,发现它是由名为 TaskList 的 Singleton 集合中的工具所获得的错误。

通过 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);
                    }
                }
            }
        }

如您所见,清除结果取决于许多因素。 首先是设置(我不知道在 GUI 或配置上设置的位置,但似乎从复选框中获取它的值)。 其次,不包含每个构建命令名称的名称数组。

所以我看到了一个解决方案,但只是在从 Chirpy 修改和重建/重新部署您自己的版本(并提出拉取请求)的路上:

代码不依赖于命令及其名称。 (例如缺少重建)

你可以像这样改变上面的方法:

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);
        }
    }
};

或者使用等效的处理程序方法而不是 lambda 表达式。 您应该将其放入 Chirp 类的订阅 OnStartupComplete 方法中。

取消订阅必须放在同一个类的 OnDisconnection 方法中。 (至于所有其他订阅的处理程序......)

更新:

当插件断开连接时,并不意味着工作室将立即关闭。可以卸载加载项。所以你也应该从 OnDisconneconnection 调用 RemoveAll。 (或删除并处置任务列表...)

更新2:

您还可以制作自定义命令,并将其绑定到热键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多