当您构建一个缺少文件的解决方案(带有感叹号的黄色三角形图标)时,Visual Studio是否有办法报告错误/警告,这必然会导致编译错误?就像在运行时读取的缺少配置文件一样。
由于
答案 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;在其中),则会产生一些误报。