【问题标题】:Automatically Build after save, for Visual Studio 2015?保存后自动构建,对于 Visual Studio 2015?
【发布时间】:2015-10-20 10:41:47
【问题描述】:

在使用 Visual Studio 时,我希望它能够持续构建我的项目。也就是说,每次保存后,开始构建。我倾向于处理大型(超过 35 个项目)解决方案,因此让所有内容保持最新状态可以节省我启动应用程序的时间。

Roslyn 会在您键入时为您提供编译器错误,但它实际上并没有运行完整的构建过程,这意味着您仍然需要告诉 VS 构建并等待它完成,然后才能调试或运行测试。

Redgate 的 .Net Demon 曾经进行这种后台编译,它确实很有用,但它已停止使用,因为“Visual Studio 2015 将引入 Microsoft 的新 Roslyn 编译器,我们认为这些改进会使 .NET Demon 变得多余。”

是否有选项或扩展可以让 Visual Studio 2015 在 IDE 中保存文件或修改项目后自动启动构建?

【问题讨论】:

  • .NET Demon 也快很多,因为它只重建发生变化的项目。

标签: msbuild visual-studio-2015


【解决方案1】:

我开始开发一个名为 BuildOnSave 的新开源扩展程序,并且正是这样做的:它在保存文件时构建当前解决方案或启动项目。

它在 Visual Studio 扩展库上可用:https://visualstudiogallery.msdn.microsoft.com/2b31b977-ffc9-4066-83e8-c5596786acd0

也许你可以试一试。非常感谢您的反馈。

【讨论】:

  • 看起来不错,但是在具有 1 个以上项目的解决方案中,我收到此错误:“---------- BuildOnSave: Project: CTM-API, Configuration: Debug Any CPU ---------- C:\Cyber​​Gym\Projects\Dev\CTM\CTM.sln.metaproj : error MSB4057: The target "CTM-API" does not exist in the project. Done building project "CTM. sln" -- 失败。========== BuildOnSave: 0 成功,0 失败 ===========" 但是在 VS 中手动构建项目时一切正常。无论如何,Tnx。
  • 您好 Dudi,感谢您报告此问题。我目前正在测试一个新版本,它可能已经解决了这个问题。您能否尝试github.com/pragmatrix/BuildOnSave/releases 的最新版本,并尽可能向 github 问题跟踪器报告更多问题。那太好了!
  • 您好,这个扩展是仅在解决方案没有错误时构建,还是会在每次保存时尝试构建而不考虑解决方案/项目的状态?
  • 每次保存文件时都会构建。仅在 Intellisense 未发现任何错误时构建可能是一个有趣的添加选项。
【解决方案2】:

runs Cppcheck on the saved file 有一个 Visual Commander 的示例扩展。您可以将 Cppcheck 替换为 DTE.ExecuteCommand("Build.BuildSolution");

【讨论】:

  • 这看起来正是我所需要的。谢谢!此外,Visual Commander 看起来确实很有用。
【解决方案3】:

基于 Sergey Vlasov 的回答,这里是 Visual Commander 扩展的修改版本;

using EnvDTE;
using EnvDTE80;

public class E : VisualCommanderExt.IExtension
{
    private EnvDTE80.DTE2 DTE;
    private EnvDTE.Events events;
    private EnvDTE.DocumentEvents documentEvents;
    private EnvDTE.BuildEvents buildEvents;

    public void SetSite(EnvDTE80.DTE2 DTE_, Microsoft.VisualStudio.Shell.Package package)
    {
        DTE = DTE_;
        events = DTE.Events;
        documentEvents = events.DocumentEvents;
        buildEvents = events.BuildEvents;

        buildEvents.OnBuildProjConfigDone += OnBuildProjectDone;
        documentEvents.DocumentSaved += OnDocumentSaved;
    }

    public void Close()
    {
        documentEvents.DocumentSaved -= OnDocumentSaved;
        buildEvents.OnBuildProjConfigDone -= OnBuildProjectDone;
    }

    private void OnDocumentSaved(EnvDTE.Document doc)
    {
        if(doc.Language == "CSharp")
        {
            var sb = DTE.Solution.SolutionBuild;
            sb.Build();
        }
    }

    private void OnBuildProjectDone(string project, string projectConfig, string platform, string solutionConfig, bool success)
    {
        //OutputString("Project " + project + " " + (success ? "build" : "failed to build"));   
    }

    private void OutputString(string line)
    {
        GetOutputPane().OutputString(line + System.Environment.NewLine);
    }

    private EnvDTE.OutputWindowPane GetOutputPane()
    {
        string cppcheckPaneName = "VCmd"; 
        foreach (EnvDTE.OutputWindowPane pane in 
            DTE.ToolWindows.OutputWindow.OutputWindowPanes)
        {
            if (pane.Name == cppcheckPaneName)
                return pane;
        }
        return DTE.ToolWindows.OutputWindow.OutputWindowPanes.Add(cppcheckPaneName);
    }
}

【讨论】:

  • 嘿,我上周创建了一个扩展,它使用上述方法构建您的解决方案,但我认为使用 DTE 方法构建解决方案会导致您在构建时键入时出现光标停顿和焦点窃取问题正在运行,所以这个周末我尝试了一种不同的方法,效果很好。它现在在图库中,我正在寻找反馈:visualstudiogallery.msdn.microsoft.com/…
  • @Armin 我试试看!如果您将此添加为答案,您更有可能为您的扩展程序带来流量,您可以给您投赞成票:)
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2015-08-05
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多