2010-06-29 10 views
10

C'è un modo per Visual Studio di segnalare un errore/avviso quando si crea una soluzione che presenta file mancanti (icona a triangolo giallo con esclamazione) che hanno necessariamente causa un errore di compilazione? Come un file di configurazione mancante che viene letto durante l'esecuzione.Segnala errore/avviso in caso di file mancanti nel progetto/soluzione in Visual Studio

Grazie

+0

Vorrei anche una risposta a questa domanda. Sto trovando irritante che un file può essere mancante e ancora la compilazione della compilazione con successo, insieme alla compilazione della vista. Sicuramente, perlomeno, ci dovrebbe essere almeno un'impostazione in Visual Studio o il progetto che posso impostare per far rispettare questo. –

risposta

11

è necessario definire un EnvironmentEvents macro. Vedere la descrizione generale su come farlo qui: Customize Your Project Build Process.

E qui è il codice è possibile incollare direttamente nell'ambiente macro per controllare i file mancanti:

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 

Si visualizzerà il testo "mancante file" direttamente in Visual Studio "Build" finestra di uscita. Dovrebbe essere abbastanza facile da capire e sintonizzare con i tuoi bisogni. Ad esempio, è possibile aggiungere errori all'output dell'errore.

+1

Visual Studio 2012/2013 non supporta più le macro, vedere http://stackoverflow.com/questions/20689829/report-error-warning-if-missing-files-in-project-solution-in-visual-studio-2012/ 20711912 # 20711912 per una soluzione aggiornata – Turch

+0

Grazie per il VS 2012 e il reindirizzamento verso l'alto! – granadaCoder

3

Quando mancavano i file, stavamo ottenendo errori di compilazione pazzeschi, come l'impossibilità di scrivere xyz.pdb anche se il file ha finito per essere scritto. Ho preso ciò che Simon aveva fornito (grazie!) E l'ho girato un po '; in particolare, ho aggiunto un po 'di ricorsione e aggiunto supporto per cartelle e file con sotto-file (ad esempio set di dati, code-behind).

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

Se vi capita di avere un ambiente Linux-like con accesso alla cartella del progetto (per esempio, se si utilizza git per il controllo di versione, probabilmente si può utilizzare la dotazione Git Bash per questo, o se si utilizza Cygwin), ecco il mio modo davvero rapido e sporco:

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

(Come funziona: cerco di ls ogni file denominato nel progetto, e inviare l'output stdout del comando ls-/dev/null, quindi sarà Se qualche file non esiste, ls cancellerà i loro nomi su stderr anziché su stdout, quindi quelli visibile.)

Si noti che questo non comprende gli escape codificati tramite URL, quindi si otterranno alcuni falsi positivi se il progetto contiene nomi di file con caratteri come '(' in essi.

+0

Dannazione, devo imparare qualcosa da un giorno perché ha funzionato come un incantesimo per me, grazie mille :) –

1

Nel caso in cui qualcun altro si imbattesse in questo thread, c'è un plugin che ti darà un errore di compilazione quando nel tuo progetto mancano dei file.

Problemi correlati