Wie finden Sie ungenutzte Symbole, Bilder und Zeichenketten in .resx-Dateien, die möglicherweise "verwaist" sind und nicht mehr benötigt werden?
Antworten
Zu viele Anzeigen?Ich habe vor kurzem ein Tool entwickelt, das ungenutzte String-Ressourcen aufspürt und löscht. Ich habe die Informationen in diesem Beitrag als Referenz verwendet. Das Tool ist vielleicht nicht perfekt, aber es erledigt den schweren Teil der Arbeit und wird nützlich sein, wenn Sie ein großes Projekt mit einer langen Historie haben. Wir haben dieses Tool intern verwendet, um Ressourcendateien zu konsolidieren und ungenutzte Ressourcen zu entfernen (wir sind mehr als 4.000 von 10.000 Ressourcen losgeworden).
Sie können sich den Quellcode ansehen oder ClickOnce einfach von hier aus installieren: https://resxutils.codeplex.com/
Ich hatte ein ähnliches Problem. Mehrere tausend Ressource-Strings, die ich für eine Übersetzungstabelle erstellt hatte, von denen viele nicht mehr benötigt wurden oder vom Code referenziert wurden. Bei etwa 180 abhängigen Codedateien war es unmöglich, jede einzelne Ressourcenzeichenfolge manuell durchzugehen.
Der folgende Code (in vb.net) geht durch Ihr Projekt und findet verwaiste Ressourcen (in der Projektressourcen und nicht die Ressourcen der einzelnen Formulare ). Für mein Projekt benötigte ich etwa 1 Minute. Es kann geändert werden, um Strings, Bilder oder jeden anderen Ressourcentyp zu finden.
Zusammengefasst;
- 1) Verwendet die Projektdatei der Lösung, um den gesamten enthaltenen Code zu sammeln Module zu sammeln und sie an eine einzige String-Variable anzuhängen;
- 2) Führt eine Schleife durch alle Projektressourcenobjekte und erstellt eine Liste (in meinem Fall) derjenigen, die Strings sind;
- 3) Führt eine Stringsuche durch, um Ressourcenstringcodes in der kombinierten Projekttextvariable zu finden;
- 4) Meldet Ressourcenobjekte, die nicht referenziert sind.
Die Funktion gibt die Objektnamen in der Windows-Zwischenablage zum Einfügen in eine Tabelle oder als Listenarray mit den Ressourcennamen zurück.
edit : Beispielaufruf im Modul : 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
Ich verwende ReSharper, um ungenutzte Ressourcenfelder zu finden und sie dann manuell zu entfernen, wenn das Projekt nur eine kleine Menge an Ressourcen enthält. Einige kurze Skript kann verwendet werden, wenn wir bereits Liste der ungenutzten Elemente haben.
Die Lösung ist die nächste:
- alle nicht verwendeten Mitglieder anzeigen, wie in dieser Artikel
- temporäres Entfernen von *.Designer.cs aus den generierten Dateimasken (ReSharper Optionen CodeInspection GeneratedCode)
- Kommentieren oder entfernen Sie auch den Kommentar (der angibt, dass der Code automatisch generiert wird) am Anfang der Datei Designer.cs, die an die Ressourcendatei angehängt ist.
Sie erhalten eine Liste aller nicht verwendeten Ressourcen, die Sie aus resx entfernen können.
Ich habe selbst darüber nachgedacht, und ich glaube, ich habe zwei Möglichkeiten. Beide beruhen auf der Tatsache, dass ich eine Hilfsmethode verwende, um die erforderliche Ressource aus den Ressourcendateien zu extrahieren.
-
Protokollierung
Fügen Sie der oder den "getresource"-Methode(n) einen Code hinzu, damit bei jedem Zugriff auf eine Ressource der Ressourcenschlüssel in ein Protokoll geschrieben wird. Versuchen Sie dann, auf jeden Teil der Website zuzugreifen (ein Testskript könnte hier hilfreich sein). Die daraus resultierenden Protokolleinträge sollten eine Liste aller aktiven Ressourcenschlüssel enthalten, der Rest kann weggeworfen werden. -
Code-Analyse
Ich prüfe, ob T4 ist in der Lage, die Lösung durchzuarbeiten und eine Liste aller Verweise auf die Hilfsmethode "getresource" zu erstellen. Die daraus resultierende Liste der Schlüssel ist aktiv, der Rest kann gelöscht werden.
Bei beiden Methoden gibt es Einschränkungen. Die Protokollierungsmethode ist nur so gut wie der vom Test abgedeckte Code, und die Codeanalyse findet möglicherweise nicht immer die Schlüssel, sondern eher die Zeichenketten, die die Schlüssel enthalten.
Ich denke, ich werde beides ausprobieren. Ich werde Sie wissen lassen, wie es läuft.
Benennen Sie Ihr aktuelles Bildverzeichnis um und erstellen Sie dann ein neues, suchen Sie in VS nach Ihrem Bildpfad, z. B. "/content/images", wählen Sie alle verwendeten Bilder aus und ziehen Sie sie in den neuen Bildordner. Sie können dann das alte Verzeichnis aus dem Projekt ausschließen oder es einfach löschen.
- See previous answers
- Weitere Antworten anzeigen