web-dev-qa-db-fra.com

Comment trouver des images inutilisées dans un projet Xcode?

Quelqu'un at-il une ligne pour trouver des images inutilisées dans un projet Xcode? (En supposant que tous les fichiers sont référencés par leur nom dans le code ou les fichiers de projet - aucun nom de fichier généré par le code.)

Ces fichiers ont tendance à s'accumuler au cours de la vie d'un projet et il peut être difficile de dire s'il est sûr de supprimer un png donné.

93
Paul Robinson

Pour les fichiers qui ne sont pas inclus dans le projet, mais qui traînent simplement dans le dossier, vous pouvez appuyer sur

cmd ⌘ + alt ⌥ + A

et ils ne seront pas grisés.

Pour les fichiers qui ne sont référencés ni dans xib ni dans le code, quelque chose comme ça pourrait fonctionner:

#!/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
59
Roman

Il s'agit d'une solution plus robuste - elle vérifie la référence any au nom de base dans n'importe quel fichier texte. Notez les solutions ci-dessus qui n'incluaient pas de fichiers de storyboard (parfaitement compréhensibles, elles n'existaient pas à l'époque).

Ack rend cela assez rapide, mais il y a des optimisations évidentes à faire si ce script s'exécute fréquemment. Ce code vérifie chaque nom de base deux fois si vous avez des actifs rétine/non-rétine, par exemple.

#!/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
80
Ed McManus

J'ai essayé la solution de Roman et j'ai ajouté quelques ajustements pour gérer les images de la rétine. Cela fonctionne bien, mais rappelez-vous que les noms d'images peuvent être générés par programmation dans le code et que ce script ne répertoriera pas correctement ces images comme non référencées. Par exemple, vous pourriez avoir

NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];

Ce script pensera à tort image_1.png n'est pas référencé.

Voici le script modifié:

#!/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
24
rob

Veuillez essayer LSUnusedResources .

Il est fortement influencé par le jeffhodnett inutilisé , mais honnêtement inutilisé est très lent, et les résultats ne sont pas entièrement corrects. J'ai donc fait une optimisation des performances, la vitesse de recherche est plus rapide que Inutilisée.

23
LessFun

Peut-être que vous pouvez essayer mince , fait un travail décent.

mise à jour: Avec l'idée d'emcmanus, je suis allé de l'avant et j'ai créé un petit util sans ack juste pour éviter une configuration supplémentaire dans une machine.

https://github.com/arun80/xcodeutils

12
Arun

Seul ce script fonctionne pour moi, qui gère même l'espace dans les noms de fichiers:

Modifier

Mis à jour pour prendre en charge les fichiers Swift et cocoapod. Par défaut, il exclut le répertoire Pods et vérifie uniquement les fichiers du projet. Pour exécuter également le dossier Pods, exécutez avec --pod attrbiute:

/.finunusedimages.sh --pod

Voici le script réel:

#!/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
6
ingaham

J'ai apporté une très légère modification à l'excellente réponse fournie par @EdMcManus pour gérer les projets utilisant des catalogues d'actifs.

#!/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

Je n'écris pas vraiment de scripts bash, donc s'il y a des améliorations à apporter ici (probablement) faites le moi savoir dans les commentaires et je le mettrai à jour.

3
Stakenborg

En utilisant les autres réponses, celle-ci est un bon exemple de la façon d'ignorer les images sur deux répertoires et de ne pas rechercher les occurrences des images dans les fichiers pbxproj ou xcassets (soyez prudent avec l'icône de l'application et les écrans de démarrage). Modifiez le * dans --ignore-dir = *. Xcassets pour correspondre à votre répertoire:

#!/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
2
Gabriel Madruga

J'ai écrit un script lua, je ne suis pas sûr de pouvoir le partager car je l'ai fait au travail, mais ça marche bien. Fondamentalement, il fait ceci:

Première étape - références d'images statiques (le bit facile, couvert par les autres réponses)

  • examine récursivement les répertoires d'images et extrait les noms d'images
  • supprime les noms d'images de .png et @ 2x (non requis/utilisé dans imageNamed :)
  • recherche textuellement chaque nom d'image dans les fichiers source (doit être à l'intérieur du littéral de chaîne)

Étape deux - références d'images dynamiques (le bit amusant)

  • extrait une liste de tous les littéraux de chaîne dans la source contenant des spécificateurs de format (par exemple,% @)
  • remplace les spécificateurs de format dans ces chaînes par des expressions régulières (par exemple, "foo% dbar" devient "foo [0-9] * bar"
  • recherche textuellement les noms d'images à l'aide de ces chaînes d'expression régulière

Supprime ensuite tout ce qu'il n'a trouvé dans aucune des recherches.

Le cas d'Edge est que les noms d'images provenant d'un serveur ne sont pas gérés. Pour gérer cela, nous incluons le code du serveur dans cette recherche.

2
Sam

Vous pouvez essayer FauxPas App for Xcode . Il est vraiment bon de trouver les images manquantes et de nombreux autres problèmes/violations liés au projet Xcode.

2
Kunal Shah

Vous pouvez créer un script Shell qui grep votre code source et comparer les images fondées avec votre dossier de projet.

Voici le (s) homme (s) pour GREP et LS

Vous pouvez facilement boucler tout votre fichier source, enregistrer des images dans un tableau ou quelque chose d’égal et utiliser

cat file.m | grep [-V] myImage.png

Avec cette astuce, vous pouvez rechercher toutes les images dans le code source de votre projet !!

j'espère que cela t'aides!

2
elp

J'ai utilisé ce cadre: -

http://jeffhodnett.github.io/Unused/

Fonctionne très bien! Je n'ai vu que 2 problèmes lorsque les noms d'images proviennent du serveur et lorsque le nom de l'élément d'image est différent du nom de l'image dans le dossier de l'élément ...

2
Swasidhant

Utilisez http://jeffhodnett.github.io/Unused/ pour trouver les images inutilisées.

0
Praveen Matanam