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é.
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
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
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
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.
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.
Seul ce script fonctionne pour moi, qui gère même l'espace dans les noms de fichiers:
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
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.
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
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)
Étape deux - références d'images dynamiques (le bit amusant)
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.
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.
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!
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 ...
Utilisez http://jeffhodnett.github.io/Unused/ pour trouver les images inutilisées.