Как найти неиспользуемые изображения в проекте Xcode?
есть ли у кого-нибудь одна строка для поиска неиспользуемых изображений в проекте Xcode? (Предполагая, что все файлы ссылаются по имени в коде или файлах проекта - имена файлов, созданных без кода.)
эти файлы, как правило, накапливаются в течение всего срока службы проекта, и может быть трудно сказать, безопасно ли удалять любой данный png.
13 ответов:
для файлов, которые не включены в проект, но просто зависают в папке, вы можете нажать
cmd ⌘ + alt ⌥ + A
и они не будут затенены.
для файлов, на которые нет ссылок ни в xib, ни в коде, что-то вроде этого может работать:
#!/bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]'` find . -iname '*.png' | while read png do name=`basename $png` if ! grep -qhs "$name" "$PROJ"; then echo "$png is not referenced" fi done
Это более надежное решение - это проверка любой ссылка на базовое имя в любом текстовом файле. Обратите внимание на решения выше, которые не включали файлы раскадровки (полностью понятно, что они не существовали в то время).
Ack делает это довольно быстро, но есть некоторые очевидные оптимизации, чтобы сделать, если этот скрипт работает часто. Этот код проверяет каждое базовое имя дважды, если у вас есть оба retina/non-retina активы, например.
#!/bin/bash for i in `find . -name "*.png" -o -name "*.jpg"`; do file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x` result=`ack -i "$file"` if [ -z "$result" ]; then echo "$i" fi done # Ex: to remove from git # for i in `./script/unused_images.sh`; do git rm "$i"; done
я попробовал решение Романа,и я добавил несколько настроек для обработки изображений сетчатки. Он работает хорошо, но помните, что имена изображений могут быть сгенерированы программно в коде, и этот скрипт неверно перечислит эти изображения как неиспользуемые. Например, у вас может быть
NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];этот скрипт будет неправильно думать
image_1.png- это неиспользуемая.вот измененный скрипт:
#!/bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm'` for png in `find . -name '*.png'` do name=`basename -s .png $png` name=`basename -s @2x $name` if ! grep -qhs "$name" "$PROJ"; then echo "$png" fi done
пожалуйста, попробуйте LSUnusedResources.
Это сильно зависит от джеффходнетта не используется, но честно неиспользованный очень медленно, и результаты не совсем корректно. Поэтому я сделал некоторую оптимизацию производительности, скорость поиска более быстрая, чем неиспользуемая.
может быть, вы можете попробовать тонкие, делает достойную работу.
обновление: С идеей emcmanus я пошел вперед и создал небольшой util без ack, чтобы избежать дополнительной настройки в машине.
только этот скрипт работает для меня, который даже обрабатывать пространства имен:
Edit
обновлено для поддержки
swiftфайлы иcocoapod. По умолчанию он исключает стручки dir и проверяет только файлы проекта. Чтобы запустить, чтобы проверить папку стручков, а также, запустите с--podattrbiute :
/.finunusedimages.sh --podвот собственно скрипт:
#!/bin/sh #varables baseCmd="find ." attrs="-name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm' -o -name '*.swift'" excudePodFiles="-not \( -path */Pods/* -prune \)" imgPathes="find . -iname '*.png' -print0" #finalize commands if [ "" != "--pod" ]; then echo "Pod files excluded" attrs="$excudePodFiles $attrs" imgPathes="find . $excudePodFiles -iname '*.png' -print0" fi #select project files to check projFiles=`eval "$baseCmd $attrs"` echo "Looking for in files: $projFiles" #check images eval "$imgPathes" | while read -d $'' png do name=`basename -s .png "$png"` name=`basename -s @2x $name` name=`basename -s @3x $name` if grep -qhs "$name" $projFiles; then echo "(used - $png)" else echo "!!!UNUSED - $png" fi done
вы можете сделать скрипт, что
grepваш исходный код и сравнить созданные изображения с папкой проекта.легко вы можете зациклить весь исходный файл, сохранить изображения в массиве или что-то равное и использовать
cat file.m | grep [-V] myImage.pngС помощью этого трюка вы можете искать все изображения в исходном коде вашего проекта!!
надеюсь, что это помогает!
Я написал сценарий lua, я не уверен, что могу поделиться им, потому что я сделал это на работе, но он работает хорошо. В основном он делает это:
Шаг первый-статические ссылки на изображения (легкий бит, покрытый другими ответами)
- рекурсивно просматривает изображения dirs и вытаскивает имена изображений
- удаляет имена изображений .png и @2x (не требуется / используется в imageNamed:)
- текстовый поиск каждого имени изображения в исходных файлах (должно быть внутри строкового литерала)
Шаг второй-динамические ссылки на изображения (немного весело)
- выводит список всех строковых литералов в исходном коде, содержащий спецификаторы формата (например, %@)
- заменяет спецификаторы формата в этих строках регулярными выражениями (например, "foo%dbar "становится" foo[0-9] * bar"
- текстовый поиск по именам изображений с помощью этих строк регулярных выражений
затем удаляет все это не нашел ни в одном поиске.
крайний случай заключается в том, что имена изображений, поступающие с сервера, не обрабатываются. Чтобы справиться с этим, мы включаем код сервера в этот поиск.
Я сделал очень небольшое изменение в отличный ответ, предоставленный @EdMcManus для обработки проектов, использующих каталоги активов.
#!/bin/bash for i in `find . -name "*.imageset"`; do file=`basename -s .imageset "$i"` result=`ack -i "$file" --ignore-dir="*.xcassets"` if [ -z "$result" ]; then echo "$i" fi doneЯ действительно не пишу скрипты bash, поэтому, если здесь есть улучшения (вероятно), дайте мне знать в комментариях, и я обновлю его.
Я использовал эту структуру: -
http://jeffhodnett.github.io/Unused/
работает чертовски хорошо! Только в 2 местах я видел проблемы, когда имена изображений с сервера и когда имя ресурса изображения отличается от имени изображения в папке активов...
вы можете попробовать FauxPas приложение для Xcode. Это действительно хорошо в выводах недостающих изображений и многих других проблем/ нарушений, связанных с проектом Xcode.
используя другие ответы, это хороший пример того, как игнорировать изображения в двух каталогах и не искать вхождения изображений в файлах pbxproj или xcassets (будьте осторожны с значком приложения и заставками). Измените * в --ignore-dir=*.xcassets в соответствии с вашим каталогом:
#!/bin/bash for i in `find . -not \( -path ./Frameworks -prune \) -not \( -path ./Carthage -prune \) -not \( -path ./Pods -prune \) -name "*.png" -o -name "*.jpg"`; do file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x | xargs basename -s @3x` result=`ack -i --ignore-file=ext:pbxproj --ignore-dir=*.xcassets "$file"` if [ -z "$result" ]; then echo "$i" fi done
использовать http://jeffhodnett.github.io/Unused/ чтобы найти неиспользуемые изображения.
Comments