Найти неиспользуемые ресурсы в a.NET решение
Как вы идете о поиске неиспользуемых значков ,изображений, строк.файлы resx, которые могут стать сиротами и больше не требуется?
10 ответов:
это не информация, которую алгоритм может надежно вычислить. Проверяемая программа может получить список всех ресурсов и сделать что-то с ними, например, позволить пользователю выбрать один из нескольких значков.
ваш лучший выбор, вероятно, искать все ссылки на ваш ресурс-доступ API выбора и проверить их вручную. Используя
grep
/sed
вы можете уменьшить количество сайтов, которые вам нужно проверить вручную, обработав все "легкие" , где простая строка используемый.
недавно ResXManager 1.0.0.41 добавлена функция для отображения количества ссылок на строковый ресурс.
Я не смог найти ни одного существующего решения, которое бы искало ссылки на строковые ресурсы в файлах XAML и пакетно удаляло неиспользуемые.
поэтому я написал это:https://github.com/Microsoft/RESX-Unused-Finder
Он ищет в каталоге проекта ссылки на строковые ресурсы, а затем отображает список тех, для которых он не смог найти соответствия. Вы можете указать шаблон для поиска, чтобы он мог найти ссылки в файл XAML.
Я создал бесплатное расширение с открытым исходным кодом VS, которое ищет неиспользуемые изображения в проекте, только что опубликовал первую версию:https://github.com/jitbit/vs-unused-image-finder
Так как я не мог найти простой и быстро решение тем не менее, я нашел по крайней мере решение, которое позволяет мне получить результат, который я ищу, даже если это займет некоторое время (идеально подходит для ленивого воскресного дня).
решение включает Visual Studio .NET 2010 и ReSharper (я использую версию 7.1) и выглядит следующим образом.
пошаговое решение
1.) щелкните правой кнопкой мыши основной RESX файл внутри VS.NET и выберите "Найти обычаи" из контекстного меню:
это вызовет окно ReSharper "найти результаты".
2.) дважды щелкните каждое вхождение в окне решения:
откроется окно исходного кода с ресурсом.
3.) переименовать этот ресурс из окна исходного кода:
It появится диалоговое окно ReSharper "переименовать ресурс".
4.) дайте ресурсу новое имя с уникальный префикс. В моем примере это "TaskDialog_":
он переименует как ресурс, так и автоматически созданный класс c# wrapper/access.
5.) повторите описанные выше шаги 2, 3 и 4 для всех ресурсов в окне "Usages".
6.) откройте RESX файл в Редакторе ресурсов Visual Studio и выберите все файлы без префикса:
7.) Теперь нажмите кнопку "Удалить ресурс" в верхней части окна или просто нажмите Del
недавно я создал инструмент, который обнаруживает и удаляет неиспользуемые строковые ресурсы. Я использовал информацию в этом посте в качестве ссылки. Инструмент может быть не идеален, но он делает тяжелую часть и будет полезен, если у вас есть большой проект с долгой историей. Мы использовали этот инструмент внутренне для консолидации файлов ресурсов и удаления неиспользуемых ресурсов (мы избавились от 4000+ ресурсов из 10 000).
вы можете посмотреть исходный код, или просто установить ClickOnce отсюда: https://resxutils.codeplex.com/
у меня была похожая проблема. Несколько тысяч строк ресурсов, которые я создал для таблицы перевода, многие из которых больше не требовались или не ссылались на код. Имея около 180 зависимых файлов кода, я не собирался вручную проходить через каждую строку ресурсов.
следующий код (in vb.net) будет проходить через ваш проект поиска осиротевших ресурсов (в ресурсы проекта, а не ресурсы каких-либо отдельных форм). Это заняло около 1 минуты для моего проекта. Он может быть изменен для поиска строк, изображений или любого другого типа ресурсов.
в резюме;
- 1) использует файл проекта решения для сбора всего включенного кода модули и добавляет их в одну строковую переменную;
- 2) перебирает все объекты ресурсов проекта и создает список (в моем случае) тех, которые являются строками;
- 3) строка поиска строка поиска кодов ресурсов в комбинированная текстовая переменная проекта;
- 4) сообщает об объектах ресурсов, на которые нет ссылок.
функция возвращает имена объектов в буфер обмена windows для вставки в электронную таблицу или в виде массива списков имен ресурсов.
edit: пример вызова модуля: 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
Я использую ReSharper для поиска неиспользуемых полей ресурсов, а затем удалить их вручную, если проект содержит небольшое количество ресурсов. Некоторые короткие сценарии могут быть использованы, если у нас уже есть список неиспользуемых элементов.
решение следующее:
- показать все неиспользуемые элементы, как описано в в этой статье
- временные удалить *.Дизайнер.cs из созданных масок файлов (ReSharper → Опции → CodeInspection → GeneratedCode)
- также комментарий или удалить комментарий (это означает, что код является автоматическим генерируется) из верхней части конструктора.cs-файл, прикрепленный к файлу ресурсов.
У вас будет список всех неиспользуемых ресурсов, оставленных для удаления их из resx.
Я рассматривал это сам, и я считаю, что у меня есть два варианта. Оба они зависят от того, что я использую вспомогательный метод для извлечения необходимого ресурса из файлов ресурсов.
лесозаготовки
Добавьте некоторый код в метод или методы" getresource", чтобы при каждом обращении к ресурсу ключ ресурса записывался в журнал. Затем попробуйте получить доступ к каждой части сайта (тестовый скрипт может быть полезен здесь). Итоговый отчет записи должны давать список всех активных ключей ресурсов, остальные могут быть выброшены.Анализ Кода
Я смотрю на Ли T4 способен работать через решение и создать список всех ссылок на вспомогательный метод "getresource". Результирующий список ключей будет активен, остальные можно удалить.существуют ограничения обоих методов. Метод ведения журнала только так хорош, как код, охватываемый тестом, и анализ кода не всегда могут найти ключи, а не строки, содержащие ключи, поэтому там потребуется дополнительная ручная работа.
Я думаю, что попробую оба. Я дам тебе знать, как все пройдет.
переименуйте текущий каталог изображений, а затем создайте новый, выполните поиск по файлам в VS для вашего пути к изображению, т. е. "/content/images", выделите все используемые изображения и перетащите их в новую папку изображений. Затем вы можете исключить старый каталог из проекта или просто удалить его.