自动构建Visual Studio 2015吗?在保存后自动构建。

7
当使用Visual Studio时,我希望它能够持续构建我的项目。也就是说,在每次保存后启动一个构建过程。我倾向于处理大型(35+项目)解决方案,因此保持一切最新可以节省启动应用程序所需的时间。
Roslyn会在您输入时给出编译器错误,但它实际上并不运行完整的构建过程,这意味着您仍然需要告诉VS进行构建并等待其完成,然后才能进行调试或运行测试。
Redgate的.Net Demon曾经做过这种后台编译,非常有用,但已被停止使用,因为“Visual Studio 2015将引入微软的新Roslyn编译器,其中改进使得.NET Demon变得多余。”
是否有选项或扩展可以在IDE中保存文件或修改项目后自动开始构建Visual Studio 2015?

.NET Demon 更快,因为它仅重新构建发生更改的项目。 - Guillaume86
3个回答

6

看起来不错,但在有多个项目的解决方案中,我遇到了这个错误: “---------- BuildOnSave: Project: CTM-API, Configuration: Debug Any CPU ---------- C:\CyberGym\Projects\Dev\CTM\CTM.sln.metaproj : error MSB4057: 项目中不存在目标“CTM-API”。 完成构建项目“CTM.sln”--失败。 ========== BuildOnSave: 0 成功,0 失败 ==========" 但是在VS中手动构建项目时一切都很好。 无论如何,谢谢。 - Dudi
嘿Dudi,感谢你报告这个问题。我正在测试一个新版本,可能已经修复了这个问题。你能否尝试一下来自https://github.com/pragmatrix/BuildOnSave/releases的最新发布,并在可能的情况下向GitHub问题跟踪器报告进一步的问题。那将非常棒! - Armin
你好,这个扩展只在解决方案没有错误的情况下进行构建,还是每次保存时无论解决方案/项目的状态如何都会尝试构建? - alimbada
每次保存文件时都会进行构建。仅在Intellisense未发现任何错误时进行构建可能是一个有趣的选项。 - Armin

2

那看起来正是我需要的。谢谢!此外,Visual Commander 看起来通常非常有用。 - Steve Cooper

0

在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方法构建解决方案会导致光标停顿和焦点窃取问题,当您在构建运行时键入时。因此,我在本周末尝试了不同的方法,并且效果非常好。它现在在Visual Studio Gallery中,我正在寻求反馈意见:https://visualstudiogallery.msdn.microsoft.com/2b31b977-ffc9-4066-83e8-c5596786acd0 - Armin
@Armin 我来试试!如果你把这个作为答案添加进去,你更有可能吸引流量到你的扩展,并且我可以给你点赞 :) - Steve Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接