2008-10-29 14 views

risposta

10

Questa non è un'informazione che un algoritmo può calcolare in modo affidabile. Il programma ispezionato può recuperare un elenco di tutte le risorse e fare qualcosa con loro, come lasciare che l'utente scelga tra diverse icone.

La tua migliore scommessa è probabilmente quella di cercare tutti i riferimenti alla tua API di accesso alle risorse di scelta e ispezionarli manualmente. Utilizzando grep/sed potresti essere in grado di ridurre i siti che devi controllare manualmente gestendo tutti quelli "facili" in cui viene utilizzata una semplice stringa.

1

Ho preso in considerazione questo da solo e credo di avere due opzioni. Entrambi si basano sul fatto che utilizzo un metodo di supporto per estrarre la risorsa richiesta dai file di risorse.

  1. Logging
    aggiungere del codice al metodo "GetResource" o metodi in modo che ogni volta che una risorsa si accede, la chiave di risorsa viene scritto un registro. Quindi prova ad accedere ad ogni parte del sito (uno script di test potrebbe essere utile qui). Le voci di registro risultanti dovrebbero fornire un elenco di tutte le chiavi delle risorse attive, il resto può essere annullato.

  2. analisi del codice
    sto guardando se T4 è in grado di lavorare attraverso la soluzione e la creazione di un elenco di tutti i riferimenti al metodo di supporto "GetResource". L'elenco risultante di chiavi sarà attivo, il resto può essere cancellato.

Esistono limitazioni di entrambi i metodi. Il metodo di registrazione è valido solo come il codice coperto dal test e l'analisi del codice potrebbe non trovare sempre le chiavi piuttosto che le stringhe contenenti i tasti, quindi ci sarà bisogno di un lavoro manuale aggiuntivo.

Penso che proverò entrambi. Ti farò sapere come va.

1

Rinominare la directory di immagini corrente e quindi crearne una nuova, effettuare una ricerca di file di ricerca all'interno di VS per il percorso dell'immagine, ad esempio "/ contenuto/immagini", selezionare più volte tutte le immagini utilizzate e trascinarle nella nuova cartella di immagini. È quindi possibile escludere la vecchia directory dal progetto o semplicemente eliminarla.

+0

La domanda non riguarda le immagini fisiche nelle directory, ma le risorse nei file resx. –

10

ho creato un open-source VS estensione che cerca le immagini non utilizzate in un progetto, appena pubblicato la prima versione: https://github.com/jitbit/vs-unused-image-finder

+0

Questo non ha funzionato come previsto per me. Ha cancellato le immagini usate – Jack

+0

@Jack per favore segnala il problema nella pagina Github che descrive come sono state utilizzate le immagini, quindi possiamo risolverlo – Alex

6

Dal momento che non riusciva a trovare una rapida soluzione di semplice e ancora, ho trovato almeno una soluzione che mi permette di ottenere il risultato che sto cercando, anche se ci vuole del tempo (ideale per una pigra domenica pomeriggio).

La soluzione include Visual Studio .NET 2010 e ReSharper (sto utilizzando la versione 7.1) e funziona come segue.

Step-by-step soluzione

1.) destro del mouse il file RESX primario in VS.NET e selezionare "Trova Usi" dal menu contestuale:

enter image description here

Si aprirà la finestra "Trova risultati" di ReSharper.

2.) doppio clic su ogni occorrenza nella finestra soluzione:

enter image description here

Si aprirà la finestra del codice sorgente con la risorsa.

3.) Rinominare questa risorsa all'interno della finestra del codice sorgente:

enter image description here

Si aprirà dialogo "Rinomina risorse" di ReSharper.

4.) Dare la risorsa un nuovo nome con un prefisso univoco. Nel mio esempio questo è "TaskDialog_":

enter image description here

E rinominerà sia la risorsa e anche il C# classe wrapper/accesso auto-generata.

5.) Ripetere i passaggi 2, 3 e 4 precedenti per tutte le risorse nella finestra "Usaggi".

6.) Aprire il file RESX in editor di risorse di Visual Studio e selezionare tutti i file senza il prefisso:

enter image description here

7.) Ora fare clic sul pulsante "Rimuovi risorse" sul parte superiore della finestra o semplicemente premere il tastodel:

enter image description here

Alla fine si dispone di un file RESX con solo le risorse utilizzate in modo acuto nel file.

8.) (opzionale) Se si dispone di risorse in più lingue (ad esempio "Resources.de.resx" per il tedesco), ripetere i punti 7 e 8 per i file RESX, anche.

Attenzione

Si prega di notare che questo non funzionerà se si accede le corde se non attraverso l'fortemente tipizzato, auto-generato C# classe Resources.

3

Ho avuto un problema simile. Diverse migliaia di stringhe di risorse che avevo creato per una tabella di conversione, molte delle quali non erano più necessarie o riferimento per codice. Con circa 180 file di codice dipendenti, non avevo modo di passare manualmente a ciascuna stringa di risorse.

Il seguente codice (in vb.net) passerà attraverso il tuo progetto di ricerca delle risorse orfane (nelle risorse del progetto , non nelle risorse dei singoli moduli). Ci sono voluti circa 1 minuto per il mio progetto. Può essere modificato per trovare stringhe, immagini o qualsiasi altro tipo di risorsa.

In sintesi;

  • 1) utilizza il file soluzione di progetto per raccogliere tutto il codice moduli inclusi e li accoda in una singola variabile di tipo stringa;
  • 2) Cicli attraverso tutti gli oggetti risorsa di progetto e crea un elenco (nel mio caso) di quelli che sono stringhe;
  • 3) Esegue una ricerca di stringa per trovare i codici stringa di risorse nella variabile di testo del progetto combinata;
  • 4) Segnala gli oggetti risorsa a cui non viene fatto riferimento.

La funzione restituisce i nomi degli oggetti negli Appunti di Windows per incollare in un foglio di calcolo o come matrice di elenco dei nomi di risorse.

modificare: esempio di chiamata nel modulo: modTest
? modTest.GetUnusedResources("C:\Documents and Settings\me\My Documents\Visual Studio 2010\Projects\myProj\myProj.vbproj", True, true)

'project file is the vbproj file for my solution 
Public Function GetUnusedResources(projectFile As String, useClipboard As Boolean, strict As Boolean) As List(Of String) 


    Dim myProjectFiles As New List(Of String) 
    Dim baseFolder = System.IO.Path.GetDirectoryName(projectFile) + "\" 

    'get list of project files 
    Dim reader As Xml.XmlTextReader = New Xml.XmlTextReader(projectFile) 
    Do While (reader.Read()) 
     Select Case reader.NodeType 
      Case Xml.XmlNodeType.Element 'Display beginning of element. 
       If reader.Name.ToLowerInvariant() = "compile" Then ' only get compile included files 
        If reader.HasAttributes Then 'If attributes exist 
         While reader.MoveToNextAttribute() 
          If reader.Name.ToLowerInvariant() = "include" Then myProjectFiles.Add((reader.Value)) 
         End While 
        End If 
       End If 
     End Select 
    Loop 

    'now collect files into a single string 
    Dim fileText As New System.Text.StringBuilder 
    For Each fileItem As String In myProjectFiles 
     Dim textFileStream As System.IO.TextReader 
     textFileStream = System.IO.File.OpenText(baseFolder + fileItem) 
     fileText.Append(textFileStream.ReadToEnd) 
     textFileStream.Close() 
    Next 
    ' Debug.WriteLine(fileText) 

    ' Create a ResXResourceReader for the file items.resx. 
    Dim rsxr As New System.Resources.ResXResourceReader(baseFolder + "My Project\Resources.resx") 
    rsxr.BasePath = baseFolder + "Resources" 
    Dim resourceList As New List(Of String) 
    ' Iterate through the resources and display the contents to the console. 
    For Each resourceValue As DictionaryEntry In rsxr 
     ' Debug.WriteLine(resourceValue.Key.ToString()) 
     If TypeOf resourceValue.Value Is String Then ' or bitmap or other type if required 
      resourceList.Add(resourceValue.Key.ToString()) 
     End If 
    Next 
    rsxr.Close() 'Close the reader. 

    'finally search file string for occurances of each resource string 
    Dim unusedResources As New List(Of String) 
    Dim clipBoardText As New System.Text.StringBuilder 
    Dim searchText = fileText.ToString() 
    For Each resourceString As String In resourceList 
     Dim resourceCall = "My.Resources." + resourceString ' find code reference to the resource name 
     Dim resourceAttribute = "(""" + resourceString + """)" ' find attribute reference to the resource name 
     Dim searchResult As Boolean = False 
     searchResult = searchResult Or searchText.Contains(resourceCall) 
     searchResult = searchResult Or searchText.Contains(resourceAttribute) 
     If Not strict Then searchResult = searchResult Or searchText.Contains(resourceString) 
     If Not searchResult Then ' resource name no found so add to list 
      unusedResources.Add(resourceString) 
      clipBoardText.Append(resourceString + vbCrLf) 
     End If 
    Next 

    'make clipboard object 
    If useClipboard Then 
     Dim dataObject As New DataObject ' Make a DataObject clipboard 
     dataObject.SetData(DataFormats.Text, clipBoardText.ToString())  ' Add the data in string format. 
     Clipboard.SetDataObject(dataObject) ' Copy data to the clipboard. 
    End If 

    Return unusedResources 

End Function 
+0

Grazie, spero che non ti dispiaccia aggiungere una nota in più o due. Avevamo un modulo con un paio di migliaia di stringhe di risorse che dovevamo investigare, quindi questo è stato utile lungo la strada. Si è scoperto che il modulo aveva la proprietà Localizable True, quindi tutti i controlli avevano le impostazioni memorizzate nel resx del modulo. Impostando su false commutazioni le cose tornano alla normalità e riducono le dimensioni di resz da 600 + k a 35k! –

5

Recentemente ho costruito uno strumento che rileva e rimuove le risorse inutilizzate stringa. Ho usato le informazioni in questo post come riferimento. Lo strumento potrebbe non essere perfetto, ma fa la parte di sollevamento pesante e sarà utile se hai un grande progetto con una lunga storia. Abbiamo utilizzato questo strumento internamente per consolidare i file di risorse e rimuovere le risorse inutilizzate (ci siamo liberati di oltre 4.000 risorse su 10.000).

si può guardare il codice sorgente, o semplicemente installare ClickOnce da qui: https://resxutils.codeplex.com/

+2

Questo sembrava promettente (una volta trovato che dovevi eliminare Resources.Designer.cs per farlo mostrare i risultati). Ma non è stato in grado di trovare riferimenti nei file XAML, che è un dealbreaker. – RandomEngy

2

Io uso ReSharper per la ricerca di campi di risorse non utilizzate e quindi rimuovere manualmente se il progetto contiene piccole quantità di risorse. Alcuni script brevi possono essere utilizzati se abbiamo già un elenco di elementi inutilizzati.

La soluzione è prossima:

Si avrà un elenco di tutte le risorse inutilizzate, rimasto per rimuoverle da resx.

30

Recentemente ResXManager 1.0.0.41 è stata aggiunta una funzionalità per mostrare il numero di riferimenti a una risorsa stringa.

Screenshot showing the new reference column

14

non ho potuto trovare alcuna soluzione esistente che la ricerca di stringhe riferimenti di risorse nel file XAML e batch rimuovere quelli inutilizzati.

Così ho scritto questo: https://github.com/Microsoft/RESX-Unused-Finder

RESX Unused Finder screenshot

Si cerca una directory di progetto per i riferimenti a risorse di tipo stringa, quindi visualizza un elenco di quelli che non poteva trovare una corrispondenza per. È possibile specificare un modello da cercare in modo che possa trovare riferimenti nei file XAML.

+0

+1. Darei di più se fosse possibile. Stavo cercando un grande strumento per un po 'di tempo e questo spicca per me! Ottimo lavoro ! – DeMama

+0

Questo strumento è ottimo specialmente se si utilizza WPF. Generiamo classi che proxy per AppResources e questo strumento lo gestisce perfettamente. Utilizziamo le estensioni markup XAML personalizzate e funziona anche con questo. Molto ben fatto. – Skrymsli

Problemi correlati