Как найти неиспользуемые изображения в проекте Xcode?



есть ли у кого-нибудь одна строка для поиска неиспользуемых изображений в проекте Xcode? (Предполагая, что все файлы ссылаются по имени в коде или файлах проекта - имена файлов, созданных без кода.)



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

708   13  

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

https://github.com/arun80/xcodeutils

только этот скрипт работает для меня, который даже обрабатывать пространства имен:

Edit

обновлено для поддержки swift файлы и cocoapod. По умолчанию он исключает стручки dir и проверяет только файлы проекта. Чтобы запустить, чтобы проверить папку стручков, а также, запустите с --pod attrbiute :

/.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 ваш исходный код и сравнить созданные изображения с папкой проекта.

вот человек(ы) для GREP и LS

легко вы можете зациклить весь исходный файл, сохранить изображения в массиве или что-то равное и использовать

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

    Ничего не найдено.