2008-10-29 13 views

Respuesta

10

Esto no es información que un algoritmo pueda calcular de manera confiable. El programa inspeccionado podría obtener una lista de todos los recursos y hacer algo con ellos, como dejar que el usuario elija entre varios iconos.

Su mejor opción es, probablemente, buscar todas las referencias a su API de acceso a recursos e inspeccionarlas manualmente. Con grep/sed, puede reducir los sitios que tiene que inspeccionar manualmente al manejar todos los "fáciles" donde se usa una cadena simple.

1

He estado considerando esto yo mismo y creo que tengo dos opciones. Ambos se basan en el hecho de que utilizo un método auxiliar para extraer el recurso requerido de los archivos de recursos.

  1. registro
    añadir algo de código para el método "getResource" o métodos de modo que cada vez que se accede a un recurso, el recurso clave se escribe en un registro. Luego intente acceder a cada parte del sitio (un script de prueba podría ser útil aquí). Las entradas de registro resultantes deberían proporcionar una lista de todas las claves de recurso activas, el resto puede eliminarse.

  2. análisis de código
    estoy mirando si T4 es capaz de trabajar a través de la solución y la creación de una lista de todas las referencias al método de ayuda "getResource". La lista resultante de claves estará activa, el resto se puede eliminar.

Existen limitaciones de ambos métodos. El método de registro es tan bueno como el código cubierto por la prueba y el análisis del código puede no encontrar siempre las claves en lugar de las cadenas que contienen las claves, por lo que se requerirá algún trabajo manual adicional.

Creo que voy a probar ambos. Te dejaré saber cómo va.

1

Cambie el nombre de su directorio de imagen actual y cree uno nuevo, realice una búsqueda de hallazgos dentro de VS para su ruta de imagen, es decir, '/ content/images', seleccione todas las imágenes usadas y arrástrelas al nuevo carpeta de imágenes. Puede excluir el directorio anterior del proyecto o simplemente eliminarlo.

+0

La pregunta no es sobre imágenes físicas en directorios, sino recursos en archivos resx. –

10

he creado un código abierto libre de estomatitis vesicular extensión que busca las imágenes no utilizadas en un proyecto, acabo de publicar la primera versión: https://github.com/jitbit/vs-unused-image-finder

+0

Esto no funcionó como esperaba. Se eliminaron las imágenes usadas – Jack

+0

@Jack. Por favor, informe el problema en la página de Github describiendo cómo se "usaron" las imágenes, para que podamos solucionarlo – Alex

6

ya que no pude encontrar una solución rápidasencilla y todavía, Encontré al menos una solución que me permite obtener el resultado que estoy buscando, incluso si lleva algo de tiempo (ideal para una tarde de domingo flojo).

La solución incluye Visual Studio .NET 2010 y ReSharper (estoy usando la versión 7.1) y es como la siguiente.

paso a paso de la solución

1.) Haga clic con el resx primaria en VS.NET y seleccione "Usos" en el menú contextual:

enter image description here

Con ello se abre "Buscar Resultados de" ventana de ReSharper. Haga doble clic en cada caso en la ventana de solución

2.):

enter image description here

Esto abrirá la ventana de código fuente con el recurso.

3.) Cambiar nombre de este recurso desde el interior de la ventana de código fuente:

enter image description here

Se abrirá el diálogo "Cambiar el nombre de recurso" de ReSharper.

4.) Proporcione al recurso un nuevo nombre con un prefijo único . En mi ejemplo, esto es "TaskDialog_":

enter image description here

cambiará el nombre tanto del recurso y también el C# clase contenedora/acceso generada automáticamente.

5.) Repita los pasos 2, 3 y 4 anteriores para todos los recursos en la ventana "Usos".

6.) Abrir el archivo en RESX editor de recursos de Visual Studio y seleccionar todos los archivos sin el prefijo:

enter image description here

7.) Ahora haga clic en el botón "Eliminar de recursos" en la la parte superior de la ventana o simplemente pulse la tecla dedel:

enter image description here

Finalmente tiene un archivo RESX con solo los recursos utilizados en su archivo.

8.) (opcionalmente) Si tiene recursos en varios idiomas (por ejemplo, "Resources.de.resx" para el alemán), repita los pasos 7 y 8 para esos archivos RESX, también.

Advertencia

Tenga en cuenta que esto no funcionará si tiene acceso a las cadenas que no sean a través del establecimiento inflexible, clase C# generada automáticamente Resources.

3

Tuve un problema similar. Varias miles de cadenas de recursos que había creado para una tabla de traducción, muchas de las cuales ya no eran necesarias o referencia por código. Con alrededor de 180 archivos de código dependientes, no había forma de que fuera a examinar manualmente cada cadena de recursos.

El siguiente código (en vb.net) irá a través de su proyecto buscando recursos huérfanos (en los recursos del proyecto , no en los recursos de formularios individuales). Me tomó alrededor de 1 minuto para mi proyecto. Se puede modificar para buscar cadenas, imágenes o cualquier otro tipo de recurso.

En resumen;

  • 1) utiliza el archivo de proyecto de solución para reunir todos los códigos módulos incluidos y los añade en una sola variable de cadena;
  • 2) Pasa por todos los objetos de recursos del proyecto y crea una lista (en mi caso) de los que son cadenas;
  • 3) Hace una búsqueda de cadena encontrar los códigos de cadena de recursos en la variable de texto de proyecto combinada;
  • 4) Informa los objetos de recursos a los que no se hace referencia.

La función devuelve los nombres de los objetos en el portapapeles de Windows para pegarlos en una hoja de cálculo o como una matriz de lista de los nombres de los recursos.

edición: Ejemplo de llamada en el módulo: 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

Gracias, espero que no le importe agregar una nota extra o dos. Teníamos un formulario con un par de miles de recursos que necesitábamos investigar, así que esto fue útil en el camino. Resultó que el formulario tenía su propiedad Localizable True, por lo que todos los controles tenían configuraciones almacenadas en el resx del formulario. Poniendo a false las cosas conmutadas a normal y reduciendo el tamaño de resz de 600 + k a 35k! –

5

recientemente he construido una herramienta que detecta y elimina los recursos de cadena no utilizados. Usé la información en esta publicación como referencia. Es posible que la herramienta no sea perfecta, pero cumple con la parte de levantamiento de objetos pesados ​​y será útil si tiene un proyecto grande con una larga historia. Utilizamos esta herramienta internamente para consolidar archivos de recursos y eliminar recursos no utilizados (eliminamos más de 4.000 recursos de 10.000).

se puede ver en el código fuente, o simplemente instalar ClickOnce desde aquí: https://resxutils.codeplex.com/

+2

Esto parecía prometedor (una vez que descubrí que tenía que eliminar Resources.Designer.cs para que mostrara los resultados). Pero no pudo encontrar referencias en los archivos XAML, que es un obstáculo. – RandomEngy

2

uso ReSharper para encontrar campos de recursos no utilizados y luego eliminarlos manualmente si el proyecto contiene una pequeña cantidad de recursos. Algunos guiones cortos se pueden usar si ya tenemos una lista de elementos no utilizados.

La solución está al lado:

Tendrá una lista de todos los recursos no utilizados, a la izquierda para eliminarlos de resx.

14

no pude encontrar ninguna solución existente que buscar referencias de recursos de cadena en archivos XAML y lotes eliminar las no utilizadas.

Así que escribió esto: https://github.com/Microsoft/RESX-Unused-Finder

RESX Unused Finder screenshot

Se busca en un directorio del proyecto para las referencias a recursos de cadena, a continuación, muestra una lista de los que no pudo encontrar un partido para. Puede especificar una plantilla para buscar para que pueda encontrar referencias en archivos XAML.

+0

+1. Daría más si fuera posible. Estaba buscando una gran herramienta desde hace un tiempo y esta se destaca por mí! Gran trabajo ! – DeMama

+0

Esta herramienta es excelente, especialmente si usa WPF. Generamos clases que proxy para AppResources y esta herramienta lo maneja perfectamente. Usamos extensiones de marcado XAML personalizadas y funciona con eso también. Muy bien hecho. – Skrymsli

Cuestiones relacionadas