保存后自动构建,适用于Visual Studio 2015?

时间:2015-10-20 10:41:48

标签: msbuild visual-studio-2015

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

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

Redgate' s .Net Demon曾经做过这种后台编译,它确实非常有用,但它已经停止了,因为" Visual Studio 2015将引入微软'新的Roslyn编译器,我们认为这些改进使.NET Demon变得多余。"

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

3 个答案:

答案 0 :(得分:6)

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

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

可能你可以尝试一下。我非常感谢您的反馈。

答案 1 :(得分:2)

Visual Commander有runs Cppcheck on the saved file的示例扩展名。您可以用 DTE.ExecuteCommand(“Build.BuildSolution”)替换Cppcheck;

答案 2 :(得分: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);
    }
}