【问题标题】:Report error/warning if missing files in project/solution in Visual Studio如果 Visual Studio 中的项目/解决方案中缺少文件,则报告错误/警告
【发布时间】:2010-06-29 23:19:30
【问题描述】:

当您构建的解决方案缺少必然导致编译错误的文件(带有感叹号的黄色三角形图标)时,Visual Studio 是否有办法报告错误/警告?就像在运行时读取的丢失的配置文件一样。

谢谢

【问题讨论】:

  • 我也想知道这个问题的答案。我发现一个文件可能丢失但构建成功编译,以及视图编译,这让我很生气。当然,至少,Visual Studio 或项目中至少应该有一个设置,我可以设置来强制执行此操作。

标签: visual-studio


【解决方案1】:

您需要定义一个EnvironmentEvents macro。请在此处查看有关如何执行此操作的一般说明:Customize Your Project Build Process

下面是可以直接粘贴到宏环境中检查缺失文件的代码:

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
    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

Public 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 & Environment.NewLine)
End Sub

它将直接在 Visual Studio“构建”输出窗口中显示“丢失文件”文本。它应该很容易理解并根据您的需求进行调整。例如,您可以在错误输出中添加错误。

【讨论】:

【解决方案2】:

当我们丢失文件时,我们会遇到疯狂的编译错误,例如即使文件最终被写入,也无法写入 xyz.pdb。我拿了西蒙提供的东西(谢谢!)并把它翻了个身;具体来说,我添加了一些递归并添加了对带有子文件(例如数据集、代码隐藏)的文件夹和文件的支持。

Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin

    For Each proj As Project In DTE.Solution.Projects
        walkTree(proj.ProjectItems, False)
    Next

End Sub

Private Sub walkTree(ByVal list As ProjectItems, ByVal showAll As Boolean)

    For Each item As ProjectItem In list

        ' from http://msdn.microsoft.com/en-us/library/z4bcch80(v=vs.80).aspx
        ' physical files:   {6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}
        ' physical folders: {6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}

        If (item.Kind = "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}" OrElse _
            item.Kind = "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}") Then

            For i As Integer = 1 To item.FileCount ' appears to be 1 all the time...

                Dim existsOrIsFolder As Boolean = (item.Kind = "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}" OrElse System.IO.File.Exists(item.FileNames(i)))

                If (showAll OrElse _
                    existsOrIsFolder = False) Then

                    WriteToBuildWindow(String.Format("{0}, {1}, {2} ", existsOrIsFolder, item.ContainingProject.Name, item.FileNames(i)))

                End If

            Next

            If (item.ProjectItems.Count > 0) Then
                walkTree(item.ProjectItems, showAll)
            End If

        End If

    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 & Environment.NewLine)
End Sub

【讨论】:

    【解决方案3】:

    万一其他人偶然发现此线程,当您的项目中缺少文件时,plugin 会给您一个构建错误。

    【讨论】:

      【解决方案4】:

      如果你碰巧有一个可以访问项目文件夹的类 linux 环境(例如,如果你使用 git 进行版本控制,你可能可以使用包含的 Git Bash,或者如果你使用 Cygwin),这里是我真正快速而肮脏的方式:

      grep '<Content Include="' "project_file.csproj" | sed 's/^.*"\([^"]*\)".*/\1/' | sed 's/\\/\//g' | xargs -d'\n' ls > /dev/null
      

      (这是如何工作的:我尝试ls项目中命名的每个文件,并将ls命令的stdout输出发送到/dev/null,因此它将被隐藏。如果任何文件不存在, ls 会将他们的名字吐到 stderr 而不是 stdout,所以这些都是可见的。)

      请注意,这不理解 URL 编码的转义,因此如果您的项目包含带有“(”等字符的文件名,您将得到一些误报。

      【讨论】:

      • 该死,我总有一天要学习 sed,因为它对我来说就像一个魅力,非常感谢 :)
      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多