Come si fa a trovare icone, immagini, stringhe inutilizzate in file .resx che potrebbero essere diventati "orfani" e non più necessari?Trova risorse inutilizzate in una soluzione .NET
risposta
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.
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.
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.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.
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.
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
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:
Si aprirà la finestra "Trova risultati" di ReSharper.
2.) doppio clic su ogni occorrenza nella finestra soluzione:
Si aprirà la finestra del codice sorgente con la risorsa.
3.) Rinominare questa risorsa all'interno della finestra del codice sorgente:
Si aprirà dialogo "Rinomina risorse" di ReSharper.
4.) Dare la risorsa un nuovo nome con un prefisso univoco. Nel mio esempio questo è "TaskDialog_":
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:
7.) Ora fare clic sul pulsante "Rimuovi risorse" sul parte superiore della finestra o semplicemente premere il tastodel:
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
.
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
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! –
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/
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
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:
- mostra tutti i membri utilizzati come descritto in questo articolo http://chrisseroka.wordpress.com/2013/10/28/find-unused-private-and-public-methods-with-resharper/
- rimozione temporanea * .Designer.cs dalle maschere file generato (ReSharper-> Opzioni-> CodeInspection- > GeneratedCode)
- Inoltre commenta o rimuove il commento (che indica che il codice è auto generato) all'inizio del file Designer.cs allegato al file di risorse.
Si avrà un elenco di tutte le risorse inutilizzate, rimasto per rimuoverle da resx.
Recentemente ResXManager 1.0.0.41 è stata aggiunta una funzionalità per mostrare il numero di riferimenti a una risorsa stringa.
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
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.
+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
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
- 1. Trova file di risorse inutilizzate (.jsp, .xhtml, immagini) in Eclipse
- 2. Come rimuovere le risorse inutilizzate dalle librerie?
- 3. Rimuovere le risorse inutilizzate utilizzando Android Studio?
- 4. Net Nucleo creare una soluzione
- 5. Trova classi inutilizzate in un progetto Java Eclipse
- 6. Le risorse inutilizzate del lucchetto Android vengono utilizzate nell'app
- 7. iPhone: esiste un modo automatico per identificare le risorse inutilizzate?
- 8. Retargeting Tutti i progetti in una soluzione su .NET 4.5.2
- 9. Rimozione di variabili locali inutilizzate dal codice .NET
- 10. Suddivisione di una soluzione .NET/repo Git per più app
- 11. Rimuovi localizzazioni inutilizzate dall'APK
- 12. Dove si trova System.Linq in .NET 4.0?
- 13. Dove si trova SqliteDataReader in sqlite-net?
- 14. Come rilevare proprietà inutilizzate in primavera
- 15. è sbagliato lasciare azioni REST inutilizzate?
- 16. Android Studio non trova le mie risorse
- 17. Trova le variabili e le funzioni inutilizzate in un progetto MATLAB-Simulink
- 18. soluzione accumulo .net da file batch
- 19. Trova tutte le risorse incorporate in un altro assieme
- 20. Gettati di perdite di risorse .NET
- 21. Soluzione OLAP gratuita per .NET in esecuzione su Mono/MySQL
- 22. Cerco intelligenza collettiva .NET/C# risorse
- 23. Come rimuovo le risorse inutilizzate da librerie di terze parti che ho incluso su Android?
- 24. Integrazione di PayPal in C#/Soluzione NET usando WSDL (SOAP)
- 25. In che modo spray trova le risorse, ad es. javascript
- 26. Carica l'immagine dalla cartella in soluzione?
- 27. Rimozione di librerie inutilizzate in R
- 28. Visual Studio 2012 "Trova nei file" ricerca oltre la soluzione quando è specificata "Soluzione completa"
- 29. Riflessione .NET: Trova i tipi usati
- 30. Incorporare programmaticamente le risorse in un assembly .NET
La domanda non riguarda le immagini fisiche nelle directory, ma le risorse nei file resx. –