web-dev-qa-db-ja.com

Xcodeプロジェクトで未使用の画像を見つける方法は?

Xcodeプロジェクトで未使用の画像を見つけるための1行はありますか? (すべてのファイルがコードまたはプロジェクトファイルの名前で参照されていると仮定します-コードはファイル名を生成しません。)

これらのファイルはプロジェクトの存続期間中に蓄積される傾向があり、特定のpngを削除しても安全かどうかを見分けるのは困難です。

93
Paul Robinson

プロジェクトに含まれていないが、フォルダー内でただハングしているファイルの場合は、

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

これは、より堅牢なソリューションです。テキストファイル内のベース名へのany参照をチェックします。ストーリーボードファイルを含まない上記のソリューションに注意してください(完全に理解可能で、当時存在していませんでした)。

Ackはこれを非常に高速にしますが、このスクリプトが頻繁に実行される場合には、明らかな最適化がいくつかあります。たとえば、網膜と非網膜の両方のアセットがある場合、このコードはすべてのベース名を2回チェックします。

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

Romanのソリューションを試し、網膜画像を処理するためのいくつかの調整を追加しました。正常に機能しますが、コードでイメージ名をプログラムで生成でき、このスクリプトがこれらのイメージを参照されていないものとして誤ってリストすることに注意してください。たとえば、あなたは

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

試してみてください LSUnusedResources

Jeffhodnettの nused の影響を大きく受けていますが、正直なところ、Unusedは非常に遅く、結果は完全に正確ではありません。そのため、パフォーマンスの最適化を行いました。検索速度は未使用よりも高速です。

23
LessFun

slender を試すことができるかもしれませんが、まともな仕事をします。

update:emcmanusのアイデアで、私は先に進み、マシンでの追加セットアップを避けるためだけにackなしで小さなユーティリティを作成しました。

https://github.com/arun80/xcodeutils

12
Arun

ファイル名のスペースを処理するこのスクリプトだけが私のために働いています:

編集

Swiftファイルとcocoapodをサポートするように更新されました。デフォルトでは、Podsディレクトリは除外され、プロジェクトファイルのみがチェックされます。実行してPodsフォルダーもチェックするには、--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 [ "$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

@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スクリプトを書いていないので、ここで(おそらく)改善すべき点があればコメントで知らせて、それを更新します。

3
Stakenborg

他の回答を使用すると、これは2つのディレクトリ上の画像を無視し、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
2
Gabriel Madruga

私はluaスクリプトを書きました。仕事でやったから共有できるかどうかはわかりませんが、うまくいきます。基本的にこれはこれを行います:

ステップ1-静的画像参照(簡単なビット、他の回答でカバー)

  • 再帰的に画像ディレクトリを調べ、画像名を引き出します
  • .pngおよび@ 2xの画像名を削除します(imageNamed:では不要/使用されます)
  • ソースファイル内の各画像名をテキストで検索します(文字列リテラル内にある必要があります)

ステップ2-動的画像参照(楽しいビット)

  • 書式指定子を含むソース内のすべての文字列リテラルのリストを引き出します(例、%@)
  • これらの文字列の書式指定子を正規表現に置き換えます(たとえば、「foo%dbar」は「foo [0-9] * bar」になります)
  • これらの正規表現文字列を使用して画像名をテキストで検索します

次に、どちらの検索でも見つからなかったものをすべて削除します。

Edgeの場合、サーバーから取得された画像名は処理されません。これを処理するために、この検索にサーバーコードを含めます。

2
Sam

Xcode用のFauxPasアプリ を試すことができます。不足している画像や、Xcodeプロジェクトに関連する他の多くの問題/違反の発見に非常に役立ちます。

2
Kunal Shah

ソースコードをgrepするシェルスクリプトを作成し、作成した画像をプロジェクトフォルダーと比較できます。

ここで GREP および LS のマン

簡単にすべてのソースファイルをループし、画像を配列または同等のものに保存して使用できます

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

このトリックを使用すると、プロジェクトのソースコード内のすべての画像を検索できます。

お役に立てれば!

2
elp

私はこのフレームワークを使用しました:-

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

うまく動作します!私が問題を見つけたのは、画像名がサーバーからのものであり、画像アセット名がアセットフォルダ内の画像の名前と異なる場合だけです。

2
Swasidhant

http://jeffhodnett.github.io/Unused/ を使用して、未使用の画像を見つけます。

0
Praveen Matanam