【问题标题】:Report error/warning if missing files in project/solution in Visual Studio 2012 / 2013如果 Visual Studio 2012 / 2013 中的项目/解决方案中缺少文件,则报告错误/警告
【发布时间】:2014-01-08 12:02:16
【问题描述】:

Visual Studio no longer supports macros,所以下面问题的答案只对以前的版本有效:

Report error/warning if missing files in project/solution in Visual Studio

当您构建缺少文件的解决方案时,Visual Studio 2012 / 2013 是否可以报告错误/警告?

【问题讨论】:

  • 一个小的 Visual Studio 扩展?

标签: visual-studio visual-studio-2012 visual-studio-2013


【解决方案1】:

根据您引用的 VS 宏代码,我为 Visual Commander 创建了一个扩展以报告警告:

Imports EnvDTE
Imports EnvDTE80

Public Class E
    Implements VisualCommanderExt.IExtension

    Sub SetSite(DTE_ As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.IExtension.SetSite
        DTE = DTE_
        events = DTE.Events
        buildEvents = events.BuildEvents
        AddHandler buildEvents.OnBuildBegin, AddressOf OnBuildBegin
    End Sub

    Sub Close() Implements VisualCommanderExt.IExtension.Close
        RemoveHandler buildEvents.OnBuildBegin, AddressOf OnBuildBegin
    End Sub

    Private Sub OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction)
        For Each proj As Project In DTE.Solution.Projects
            For Each item As ProjectItem In proj.ProjectItems
                If (item.Kind <> "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}") Then ' only check physical file items
                    Continue For
                End If

                For i As Integer = 1 To item.FileCount
                    Dim path As String = item.FileNames(i)
                    If Not System.IO.File.Exists(item.FileNames(i)) Then
                        WriteToBuildWindow("!! Missing file:" & item.FileNames(i) + " in project " + proj.Name)
                    End If
                Next
            Next
        Next
    End Sub

    Private Sub WriteToBuildWindow(ByVal text As String)
        Dim ow As OutputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
        Dim build As OutputWindowPane = ow.OutputWindowPanes.Item("Build")
        build.OutputString(text & System.Environment.NewLine)
    End Sub

    private DTE As EnvDTE80.DTE2
    private events As EnvDTE.Events
    private buildEvents as EnvDTE.BuildEvents

End Class

【讨论】:

  • 太棒了!视觉指挥官绝对是要走的路。我做了一个小的修改来处理文件夹中的文件。我会接受这个,如果你想更新你的答案,我会摆脱我的。
  • 不适用于 VS2013 和 Visual Commander 免费版:/
【解决方案2】:

我修改了 Sergey 的脚本以递归处理文件夹。

更新:为每个项目添加了一个消息框弹出窗口,其中列出了 Thomas Svensen 在 cmets 中建议的缺失文件

更新 2:现在将丢失的文件写入输出窗口并作为错误列表中的错误。这不会导致构建失败,只会导致错误列表中的一行。

Imports EnvDTE
Imports EnvDTE80

Public Class E
    Implements VisualCommanderExt.IExtension

    Sub SetSite(DTE_ As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.IExtension.SetSite
        DTE = DTE_
        events = DTE.Events
        buildEvents = events.BuildEvents
        AddHandler buildEvents.OnBuildBegin, AddressOf OnBuildBegin
    End Sub

    Sub Close() Implements VisualCommanderExt.IExtension.Close
        RemoveHandler buildEvents.OnBuildBegin, AddressOf OnBuildBegin
    End Sub

    Private Sub OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction)
        For Each proj As Project In DTE.Solution.Projects
            Dim missingFiles As String = ""
            For Each item As ProjectItem In proj.ProjectItems
                missingFiles = missingFiles + CheckProjectItem(item, proj)
            Next
            If missingFiles.Length > 0 Then
                ' comment out to remove message box popup and only have missing files listed in output / error windows
                System.Windows.MessageBox.Show("Project " + proj.Name + " missing files:" + System.Environment.NewLine + missingFiles)
            End If
        Next
    End Sub

    Private Function CheckProjectItem(ByVal item As EnvDTE.ProjectItem, ByVal proj As EnvDTE.Project)
        Dim missingFiles As String = ""
        For Each chiltItem As ProjectItem In item.ProjectItems
            missingFiles = missingFiles + CheckProjectItem(chiltItem, proj)
        Next

        If (item.Kind = "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}") Then ' only check physical file items
            For i As Integer = 1 To item.FileCount
                Dim path As String = item.FileNames(i)
                If Not System.IO.File.Exists(item.FileNames(i)) Then
                    LogMissingFile(item.FileNames(i), proj.Name)
                    missingFiles = missingFiles + item.FileNames(i) + System.Environment.NewLine 
                End If
            Next
        End If
        Return missingFiles
    End Function

    Private Sub LogMissingFile(ByVal fileName As String, ByVal projectName As String)
        Dim ow As OutputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
        Dim build As OutputWindowPane = ow.OutputWindowPanes.Item("Build")
        Dim outputString As String = "!! Missing file: " + fileName  + " in project " + projectName + System.Environment.NewLine
        Dim errorString As String = "Missing file in project " + projectName + ": " + fileName
        ' write to ONLY the Output window
        ' build.OutputString(outputString)
        ' write to BOTH Output and Error window; vsTaskPriorityHigh will show as error, vsTaskPriorityMedium as warning, and vsTaskPriorityLow as message
        build.OutputTaskItemString(outputString, vsTaskPriority.vsTaskPriorityHigh, vsTaskCategories.vsTaskCategoryMisc, vsTaskIcon.vsTaskIconCompile, fileName, 0, errorString)
    End Sub

    private DTE As EnvDTE80.DTE2
    private events As EnvDTE.Events
    private buildEvents as EnvDTE.BuildEvents

End Class

【讨论】:

  • 不错的开始,但我想要一个更明显的错误消息,所以我改为System.Windows.MessageBox.Show("!! Missing file:" &amp; item.FileNames(i) + " in project " + proj.Name) 理想情况下,我会让构建失败。你知道怎么做吗?
  • @ThomasSvensen 不错!我会把它添加到脚本中。我不知道是否/如何让 Visual Commander 破坏构建 - 您必须询问创建者。我尝试输入 Throw New System.Exception("An exception has occurred.") 来搞笑,但没有任何效果。
  • @ThomasSvensen 我又做了一项更改,让它在错误列表窗口中添加一行。不幸的是,这不会导致构建中断,但它确实使它更引人注目。
【解决方案3】:

关于在检测到丢失文件时中断构建,我发现最接近的方法是使用以下方法取消构建(结合 OnBuildBegin 事件):

DTE.ExecuteCommand("Build.Cancel")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多