Hat jemand eine einzige Zeile, um nicht verwendete Bilder in einem Xcode-Projekt zu finden? (Angenommen, alle Dateien werden nach Namen im Code oder in den Projektdateien referenziert. Es werden keine Dateinamen mit Code generiert.)
Diese Dateien häufen sich im Laufe des Projektlebens an und es ist schwer zu sagen, ob es sicher ist, ein bestimmtes PNG zu löschen.
Für Dateien, die nicht im Projekt enthalten sind, sondern nur im Ordner rumhängen, können Sie drücken
cmd ⌘ + alt ⌥ + A
und sie werden nicht ausgegraut.
Für Dateien, auf die weder in xib noch in Code verwiesen wird, funktioniert möglicherweise Folgendes:
#!/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
Dies ist eine robustere Lösung. Sie sucht in jeder Textdatei nach any Verweisen auf den Basisnamen. Beachten Sie die obigen Lösungen, die keine Storyboard-Dateien enthielten (völlig verständlich, sie existierten zu diesem Zeitpunkt nicht).
Ack macht das ziemlich schnell, aber es gibt einige offensichtliche Optimierungen, die vorgenommen werden müssen, wenn dieses Skript häufig ausgeführt wird. Dieser Code überprüft jeden Basisnamen zweimal, wenn Sie zum Beispiel über beide Netzhaut-/Nicht-Netzhaut-Assets verfügen.
#!/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
Ich habe Roman's Lösung ausprobiert und ein paar Optimierungen hinzugefügt, um Retina-Bilder zu handhaben. Es funktioniert gut, aber denken Sie daran, dass Bildnamen programmgesteuert im Code generiert werden können und dieses Skript diese Bilder fälschlicherweise als nicht referenziert auflistet. Zum Beispiel könnten Sie haben
NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];
Dieses Skript wird falsch denken image_1.png
ist nicht referenziert.
Hier ist das geänderte Skript:
#!/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
Bitte probieren Sie es aus LSUnusedResources .
Es ist stark beeinflusst von jeffhodnetts nbenutzt , aber ehrlich gesagt ist Unbenutzt sehr langsam und die Ergebnisse sind nicht ganz korrekt. Also habe ich einige Performance-Optimierungen vorgenommen, die Suchgeschwindigkeit ist schneller als bei Unused.
Vielleicht können Sie versuchen schlank , macht einen anständigen Job.
update: Mit emcmanus idea habe ich ein kleines Util ohne Ack erstellt, nur um zusätzliche Einstellungen in einer Maschine zu vermeiden.
Nur dieses Skript funktioniert für mich, das sogar den Speicherplatz in den Dateinamen verwaltet:
Aktualisiert, um Swift
Dateien und cocoapod
zu unterstützen. Standardmäßig wird das Pods-Verzeichnis ausgeschlossen und nur die Projektdateien überprüft. Um auch den Pods-Ordner zu überprüfen, führen Sie mit --pod
attrbiute:
/.finunusedimages.sh --pod
Hier ist das aktuelle Skript:
#!/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
Ich habe die ausgezeichnete Antwort von @EdMcManus geringfügig geändert, um Projekte mit Objektkatalogen zu bearbeiten.
#!/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
Ich schreibe nicht wirklich Bash-Skripte. Wenn es also (wahrscheinlich) Verbesserungen gibt, lass es mich in den Kommentaren wissen und ich aktualisiere es.
Anhand der anderen Antworten ist dies ein gutes Beispiel dafür, wie Sie Bilder in zwei Verzeichnissen ignorieren und nicht nach Vorkommen der Bilder in den pbxproj- oder xcassets-Dateien suchen. Ändern Sie das * in den --ignore-dir = *. Xcassets so, dass es Ihrem Verzeichnis entspricht:
#!/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
Ich habe ein Lua-Skript geschrieben, ich bin nicht sicher, ob ich es teilen kann, weil ich es bei der Arbeit gemacht habe, aber es funktioniert gut. Grundsätzlich macht es das:
Schritt eins - statische Bildreferenzen (das einfache Teil, das von den anderen Antworten abgedeckt wird)
Schritt zwei - dynamische Bildreferenzen (das lustige Stück)
Dann löscht es alles, was es bei beiden Suchvorgängen nicht gefunden hat.
Der Edge-Fall ist, dass Image-Namen, die von einem Server stammen, nicht verarbeitet werden. Um dies zu handhaben, nehmen wir den Servercode in diese Suche auf.
Sie können versuchen FauxPas App für Xcode . Es ist wirklich gut, die fehlenden Bilder und viele andere Probleme/Verstöße im Zusammenhang mit Xcode-Projekt zu finden.
Sie können ein Shell-Skript erstellen, das grep
Ihren Quellcode enthält, und die gefundenen Bilder mit Ihrem Projektordner vergleichen.
Mit Leichtigkeit können Sie Ihre gesamte Quelldatei in einer Schleife wiedergeben, Bilder in einem Array oder etwas Gleichwertigem speichern und verwenden
cat file.m | grep [-V] myImage.png
Mit diesem Trick können Sie alle Bilder in Ihrem Projektquellcode durchsuchen !!
hoffe das hilft!
Ich habe dieses Framework verwendet: -
http://jeffhodnett.github.io/Unused/
Funktioniert verdammt gut! Ich habe nur zwei Probleme festgestellt, wenn Bildnamen vom Server stammen und der Name des Bild-Assets nicht mit dem Namen des Bildes im Asset-Ordner übereinstimmt ...
Verwenden Sie http://jeffhodnett.github.io/Unused/ , um die nicht verwendeten Bilder zu finden.