Как найти неиспользуемые изображения в проекте XCode?
У кого-нибудь есть одна строка для поиска неиспользуемых изображений в проекте XCode? (Предполагая, что все файлы ссылаются по имени в коде или файлах проекта - нет имен файлов сгенерированных кодом.)
Эти файлы, как правило, накапливаются в течение всего срока действия проекта, и может быть сложно определить, можно ли удалить любой png.
Ответы
Ответ 1
Для файлов, не включенных в проект, а просто зависания в папке, вы можете нажать
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
Ответ 2
Это более надежное решение - оно проверяет любую ссылку на базовое имя в любом текстовом файле. Обратите внимание на приведенные выше решения, которые не включают файлы раскадровки (вполне понятные, они не существовали в то время).
Ack делает это довольно быстро, но есть некоторые очевидные оптимизации, которые можно сделать, если этот script работает часто. Этот код проверяет каждое базовое имя дважды, если у вас есть как сетчатые, так и не сетчатые активы, например.
#!/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
Ответ 3
Я попробовал решение Roman, и я добавил несколько настроек для обработки изображений сетчатки. Он работает хорошо, но помните, что имена изображений могут быть сгенерированы программным способом в коде, и этот script неправильно отобразил эти изображения как непринятые. Например, у вас может быть
NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];
Этот script будет неправильно думать, что image_1.png
не отображается.
Здесь измененный script:
#!/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
Ответ 4
Попробуйте LSUnusedResources.
На него сильно влияет Unused, но, честно говоря, Unused очень медленный, и результаты не совсем корректны. Поэтому я сделал некоторую оптимизацию производительности, скорость поиска быстрее, чем не используется.
Ответ 5
Возможно, вы можете попробовать slender, достойную работу.
update: С идеей emcmanus я пошел дальше и создаю небольшую утилиту без поддержки, чтобы избежать дополнительной настройки на машине.
https://github.com/arun80/xcodeutils
Ответ 6
Для меня работает только этот script, который даже обрабатывает пространство в именах файлов:
Изменить
Обновлено для поддержки файлов swift
и cocoapod
. По умолчанию он исключает каталог Pods и проверяет только файлы проекта. Чтобы выполнить проверку папки Pods, запустите с --pod
attrbiute:
/.finunusedimages.sh --pod
Вот фактический script:
#!/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 [ "$1" != "--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 $'\0' 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
Ответ 7
Вы можете сделать оболочку script grep
исходным кодом и сравнить созданные изображения с папкой проекта.
Здесь человек (ов) для grep
и LS
Легко вы можете зацикливать весь исходный файл, сохранить изображения в массиве или что-то равное и использовать
cat file.m | grep [-V] myImage.png
С помощью этого трюка вы можете искать все изображения в исходном коде проекта!
надеюсь, что это поможет!
Ответ 8
Я написал lua script, я не уверен, что могу поделиться им, потому что я сделал это на работе, но он работает хорошо. В основном он делает это:
Шаговые ссылки на статические изображения (легкий бит, покрытый другими ответами)
- рекурсивно просматривает изображения и вытаскивает имена изображений
- удаляет имена изображений .png и @2x (не требуется/используется в imageNamed:)
- текстовое поиск каждого имени изображения в исходных файлах (должно быть внутри строкового литерала)
Двухэтапные ссылки на изображение (забавный бит)
- выводит список всех строковых литералов в источнике, содержащем спецификаторы формата (например,% @)
- заменяет спецификаторы формата в этих строках регулярными выражениями (например, "foo% dbar" становится "foo [0-9] * bar"
- текстовый поиск по именам изображений с использованием этих строк регулярных выражений
Затем удаляет все, что не удалось найти в любом поиске.
Кромка - это то, что имена изображений, поступающие с сервера, не обрабатываются. Чтобы справиться с этим, мы включаем код сервера в этот поиск.
Ответ 9
Я сделал очень небольшое изменение в превосходном ответе, предоставленном @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, поэтому, если есть улучшения, которые будут сделаны здесь (вероятно), дайте мне знать в комментариях, и я обновлю его.
Ответ 10
Используя другие ответы, этот пример является хорошим примером того, как игнорировать изображения в двух каталогах и не выполнять поиск изображений изображений в файлах 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
Ответ 11
Я использовал эту структуру: -
http://jeffhodnett.github.io/Unused/
Хорошо работает! Только 2 места, где я видел проблемы, - это когда имена изображений от сервера и когда имя ресурса изображения отличается от имени изображения внутри папки с активами...
Ответ 12
Используйте http://jeffhodnett.github.io/Unused/, чтобы найти неиспользуемые изображения.
Ответ 13
Вы можете попробовать приложение FauxPas для Xcode. Это действительно хорошо в выводах недостающих изображений и многих других проблем/нарушений, связанных с проектом Xcode.