2010-06-29 12 views
10

¿Existe alguna manera de que Visual Studio informe un error/advertencia cuando construye una solución que tiene archivos perdidos (icono de triángulo amarillo con exclamación) que necesariamente causar un error de compilación? Como un archivo de configuración faltante que se lee durante el tiempo de ejecución.Informe de error/advertencia si faltan archivos en proyecto/solución en Visual Studio

Gracias

+0

También me gustaría obtener una respuesta a esta pregunta. Me resulta irritante que un archivo pueda faltar y, sin embargo, la compilación se compila con éxito, junto con la compilación de vistas. Seguramente, al menos, al menos debería haber una configuración en Visual Studio o el proyecto que puedo configurar para hacer cumplir esto. –

Respuesta

11

es necesario definir un EnvironmentEvents macro. Consulte la descripción general sobre cómo hacer esto aquí: Customize Your Project Build Process.

Y aquí es el código que puede pegar directamente en el entorno macro para comprobar los archivos que faltan:

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 

Se mostrará el texto "falta archivo" directamente en el Visual Studio "Construir" ventana de salida. Debería ser bastante fácil de entender y sintonizar con sus necesidades. Por ejemplo, podría agregar errores a la salida de error.

+1

Visual Studio 2012/2013 ya no es compatible con macros, consulte http://stackoverflow.com/questions/20689829/report-error-warning-if-missing-files-in-project-solution-in-visual-studio-2012/ 20711912 # 20711912 para una solución actualizada – Turch

+0

¡Gracias por el VS 2012 y hasta la redirección! – granadaCoder

3

Cuando teníamos archivos perdidos, nos estaban volviendo locos los errores de compilación, como no poder escribir xyz.pdb a pesar de que el archivo terminó siendo escrito. Tomé lo que Simon me había proporcionado (¡gracias!) Y lo volteé un poco; específicamente, agregué un poco de recursividad y agregué soporte para carpetas y archivos con subarchivos (por ejemplo, conjuntos de datos, códigos subyacentes).

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 
0

Si le sucede que tiene un ambiente similar a Linux con acceso a la carpeta del proyecto (por ejemplo, si se utiliza git para el control de versiones, es probable que pueda utilizar los incluidos Git Bash para esto, o si usa Cygwin), aquí está mi muy rápida y sucia forma:

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

(¿Cómo funciona esto: intento ls cada archivo denominado en el proyecto, y enviar la salida stdout del comando ls a /dev/null, por lo que será oculto. Si no existe ningún archivo, ls borrará sus nombres en stderr en lugar de stdout, por lo que ser visible.)

Tenga en cuenta que esto no comprende los escapes codificados en URL, por lo que obtendrá algunos falsos positivos si su proyecto contiene nombres de archivos con caracteres como '(' en ellos.

+0

Maldición, tengo que aprender sed algún día porque funcionó como un encanto para mí, muchas gracias :) –

1

En caso de que alguien más tropiece con este hilo, hay un plugin que le dará un error de compilación cuando falten archivos de su proyecto.

Cuestiones relacionadas