如果Visual Studio中的项目/解决方案中缺少文件,则报告错误/警告

时间:2010-06-29 23:19:31

标签: visual-studio

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

由于

4 个答案:

答案 0 :(得分:11)

您需要定义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“Build”输出窗口中显示“missing files”文本。理解和调整您的需求应该相当容易。例如,您可以向错误输出添加错误。

答案 1 :(得分:3)

当我们丢失文件时,我们得到了疯狂的编译错误,就像无法编写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

答案 2 :(得分:2)

如果有其他人偶然发现这个帖子,那么当您的项目中缺少文件时会出现plugin,这会导致构建错误。

答案 3 :(得分:0)

如果您碰巧有类似Linux的环境可以访问项目文件夹(例如,如果您使用git进行版本控制,您可以使用附带的Git Bash,或者如果您使用Cygwin),这里和#39;是我真正快速而又肮脏的方式:

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,因此这些文件将可见。)

请注意,这并不了解网址编码的转义信息,因此如果您的项目包含的文件名包含&#39;(&#39;在其中),则会产生一些误报。