2008-10-29 2 views

ответ

10

Это не информация, которую алгоритм может надежно вычислить. Проверенная программа может получить список всех ресурсов и сделать что-то с ними, например, разрешить пользователю выбирать из нескольких значков.

Ваш лучший выбор - это, вероятно, поиск всех ссылок на ваш API доступа к ресурсам и их проверка вручную. Используя grep/sed, вы можете уменьшить количество сайтов, которые вы должны проверить вручную, используя все «простые», где используется простая строка.

1

Я сам это рассматривал, и я считаю, что у меня есть два варианта. Оба они полагаются на то, что я использую вспомогательный метод для извлечения необходимого ресурса из файлов ресурсов.

  1. Вход
    Добавьте код в метод «getresource» или методов, так что каждый раз, когда ресурс доступен, главный ресурс записывается в журнал. Затем попробуйте получить доступ к каждой части сайта (здесь может быть полезен тестовый скрипт). В результате записи журнала должны содержать список всех ключей активного ресурса, остальные могут быть удалены.

  2. Анализ кода
    Я смотрю ли T4 способен работать через решение и создать список всех ссылок на «getresource» вспомогательный метод. Полученный список ключей будет активным, остальные могут быть удалены.

Существуют ограничения обоих методов. Метод ведения журналов не хуже кода, охватываемого тестом, и анализ кода может не всегда находить ключи, а не строки, содержащие ключи, поэтому там потребуется некоторая дополнительная ручная работа.

Я думаю, что попробую оба. Я дам вам знать, как это происходит.

1

Переименуйте свой текущий каталог изображений, а затем создайте новый, выполните поиск в режиме поиска в VS для вашего пути к изображению, то есть «/ content/images», выберите все используемые изображения и перетащите их в новый папке изображений. Затем вы можете исключить старый каталог из проекта или просто удалить его.

+0

Вопрос не в физических изображениях в каталогах, а в ресурсах в файлах resx. –

10

Я создал свободный с открытым исходным кодом VS расширения, который выглядит для неиспользуемых изображений в проекте, только что опубликовал первую версию: https://github.com/jitbit/vs-unused-image-finder

+0

Это не сработало для меня. Он удалил использованные изображения – Jack

+0

@Jack, пожалуйста, сообщите о проблеме на странице Github, описывающей, как были использованы изображения, поэтому мы можем исправить это. – Alex

6

Так как я не мог найти быстрый раствора простого и пока я нашел хотя бы решение, которое позволяет мне получить результат, который я ищу, даже если это занимает некоторое время (идеально подходит для ленивого воскресного дня).

Решение включает Visual Studio .NET 2010 и ReSharper (я использую версию 7.1) и выглядит следующим образом.

Шаг за шагом решения

1.) правой кнопкой мыши основной файл RESX в VS.NET и выберите «Поиск использований» из контекстного меню:

enter image description here

Это приведет «Найти результаты» окно ReSharper в.

2.) Дважды щелкните каждое вхождение в окне решения:

enter image description here

Это откроет окно исходного кода с ресурсом.

3.) Переименуйте этот ресурс из окна исходного кода:

enter image description here

Он появится "Переименовать ресурс" диалог ReSharper в.

4.) Дайте ресурсу новое имя с уникальным префиксом. В моем примере это «TaskDialog_»:

enter image description here

Это будет переименовать как ресурс, а также автоматически сгенерированный C# класс обертка/доступа.

5.) Повторите вышеуказанные шаги 2, 3 и 4 для всех ресурсов в окне «Использование».

6.) Откройте файл Resx в редакторе ресурсов Visual Studio и выбрать все файлы без префикса:

enter image description here

7.) Теперь нажмите на кнопку "Удалить ресурс" на верхняя часть окна или просто нажмите Del ключа:

enter image description here

У вас, наконец, есть файл RESX с только активными ресурсами в вашем файле.

8.) (необязательно) Если у вас есть ресурсы на нескольких языках (например, «Resources.de.resx» для немецкого языка), повторите шаги 7 и 8 для этих файлов RESX.

Предупреждение

Пожалуйста, обратите внимание, что это не будет работать, если вы доступ к другим, чем через сильно типизированных, автоматически генерируемой C# класса Resources строк.

3

У меня была аналогичная проблема. Несколько тысяч строк ресурсов, которые я создал для таблицы переводов, многие из которых больше не требуются или ссылки по коду. Примерно с 180 зависимыми кодовыми файлами я не мог вручную перейти через каждую строку ресурса.

Следующий код (в см.net) проведет ваш поиск проектов с потерянными ресурсами (в ресурсах проекта , а не в ресурсах отдельных форм). Для моего проекта потребовалось около 1 минуты. Его можно изменить, чтобы найти строки, изображения или любой другой тип ресурса.

Подводя итог;

  • 1) Использование файла проекта решение собрать все включенные кодовые модули и присоединяет их в одну строковую переменную;
  • 2) Пропускает все объекты ресурса проекта и создает список (в моем случае) тех, которые являются строками;
  • 3) Производит ли поиск строк поиск строк строки ресурса в комбинированной текстовой переменной проекта;
  • 4) Сообщает объекты ресурсов, на которые не ссылаются.

Функция возвращает имена объектов в буфере обмена Windows для вставки в электронную таблицу или в виде массива списков имен ресурсов.

редактировать: пример вызова модуля: 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

Спасибо, надеюсь, вы не возражаете, добавив лишнюю заметку или две. У нас была форма с несколькими тысячами строк ресурсов, которые нам нужно было исследовать, так что это было полезно на этом пути. Оказалось, что форма имеет свойство Localizable True, поэтому все элементы управления имеют настройки, сохраненные в resx формы. Установка на ложные переключаемые вещи в нормальное состояние и уменьшение размера resz от 600 + k до 35k! –

5

Я недавно построил инструмент, который обнаруживает и удаляет неиспользуемые строковые ресурсы. Я использовал информацию в этом сообщении как ссылку. Инструмент может быть не идеальным, но он выполняет тяжелую работу и будет полезен, если у вас большой проект с длинной историей. Мы использовали этот инструмент для консолидации файлов ресурсов и удаления неиспользуемых ресурсов (мы избавились от 4000 других ресурсов из 10 000).

Вы можете посмотреть на исходный код, или просто установить ClickOnce здесь: https://resxutils.codeplex.com/

+2

Это выглядело многообещающим (однажды я обнаружил, что вам нужно удалить Resources.Designer.cs, чтобы он показывал какие-либо результаты). Но он не мог найти ссылки в файлах XAML, что является сделкой. – RandomEngy

2

Я использую ReSharper для поиска неиспользуемых полей ресурсов, а затем удалить их вручную, если проект содержит небольшое количество ресурсов. Некоторый короткий скрипт можно использовать, если у нас уже есть список неиспользуемых элементов.

Решение в следующем:

  • показать все неиспользуемые элементы, как описано в этой статье http://chrisseroka.wordpress.com/2013/10/28/find-unused-private-and-public-methods-with-resharper/
  • временно удалить * .Designer.cs из порождаемых масок файлов (ReSharper-> Options-> CodeInspection- > GeneratedCode)
  • Также комментарий или удаление комментария (что указывает, что код авто сгенерирован) сверху файла Designer.cs, прикрепленного к файлу ресурсов.

У вас будет список всех неиспользуемых ресурсов, оставленных для удаления их из resx.

14

я не мог найти любые существующие решения, которые будут искать ссылки ресурсов строки в XAML файлах и партии-удалить неиспользуемые.

Так что я написал: https://github.com/Microsoft/RESX-Unused-Finder

RESX Unused Finder screenshot

Он ищет директорию проекта для ссылок на строковые ресурсы, а затем отображает список тех, что не может найти соответствие. Вы можете указать шаблон для поиска, чтобы он мог найти ссылки в файлах XAML.

+0

+1. Дала бы больше, если бы это было возможно. На какое-то время искал отличный инструмент, и этот человек выделяется для меня! Отличная работа ! – DeMama

+0

Этот инструмент замечательный, особенно если вы используете WPF. Мы генерируем классы, которые прокси для AppResources, и этот инструмент отлично справляется с этим. Мы используем пользовательские расширения разметки XAML, и он также работает с этим. Очень хорошо сделано. – Skrymsli

Смежные вопросы