Как найти неиспользуемые изображения в проекте 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 места, где я видел проблемы, - это когда имена изображений от сервера и когда имя ресурса изображения отличается от имени изображения внутри папки с активами...

Ответ 13

Вы можете попробовать приложение FauxPas для Xcode. Это действительно хорошо в выводах недостающих изображений и многих других проблем/нарушений, связанных с проектом Xcode.