webentwicklung-frage-antwort-db.com.de

Wie finde ich nicht verwendete Bilder in einem Xcode-Projekt?

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.

93
Paul Robinson

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
59
Roman

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
80
Ed McManus

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
24
rob

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.

23
LessFun

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.

https://github.com/arun80/xcodeutils

12
Arun

Nur dieses Skript funktioniert für mich, das sogar den Speicherplatz in den Dateinamen verwaltet:

Bearbeiten

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
6
ingaham

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.

3
Stakenborg

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
2
Gabriel Madruga

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)

  • durchsucht rekursiv die Bildverzeichnisse und ruft die Bildnamen auf
  • entfernt die Bildnamen von .png und @ 2x (nicht erforderlich/wird in imageNamed verwendet :)
  • sucht in Textform nach jedem Bildnamen in den Quelldateien (muss im String-Literal stehen)

Schritt zwei - dynamische Bildreferenzen (das lustige Stück)

  • ruft eine Liste aller Zeichenfolgenliterale in der Quelle mit Formatangaben ab (z. B.% @).
  • ersetzt Formatbezeichner in diesen Zeichenfolgen durch reguläre Ausdrücke (z. B. "foo% dbar" wird zu "foo [0-9] * bar").
  • durchsucht die Bildnamen mithilfe dieser Regex-Zeichenfolgen in Textform

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.

2
Sam

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.

2
Kunal Shah

Sie können ein Shell-Skript erstellen, das grep Ihren Quellcode enthält, und die gefundenen Bilder mit Ihrem Projektordner vergleichen.

Hier der Mann für GREP und LS

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!

2
elp

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 ...

2
Swasidhant

Verwenden Sie http://jeffhodnett.github.io/Unused/ , um die nicht verwendeten Bilder zu finden.

0
Praveen Matanam