Xcodeプロジェクトで未使用の画像を見つけるための1行はありますか? (すべてのファイルがコードまたはプロジェクトファイルの名前で参照されていると仮定します-コードはファイル名を生成しません。)
これらのファイルはプロジェクトの存続期間中に蓄積される傾向があり、特定のpngを削除しても安全かどうかを見分けるのは困難です。
プロジェクトに含まれていないが、フォルダー内でただハングしているファイルの場合は、
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
これは、より堅牢なソリューションです。テキストファイル内のベース名への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
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
試してみてください LSUnusedResources 。
Jeffhodnettの nused の影響を大きく受けていますが、正直なところ、Unusedは非常に遅く、結果は完全に正確ではありません。そのため、パフォーマンスの最適化を行いました。検索速度は未使用よりも高速です。
slender を試すことができるかもしれませんが、まともな仕事をします。
update:emcmanusのアイデアで、私は先に進み、マシンでの追加セットアップを避けるためだけにackなしで小さなユーティリティを作成しました。
ファイル名のスペースを処理するこのスクリプトだけが私のために働いています:
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
@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スクリプトを書いていないので、ここで(おそらく)改善すべき点があればコメントで知らせて、それを更新します。
他の回答を使用すると、これは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
私はluaスクリプトを書きました。仕事でやったから共有できるかどうかはわかりませんが、うまくいきます。基本的にこれはこれを行います:
ステップ1-静的画像参照(簡単なビット、他の回答でカバー)
ステップ2-動的画像参照(楽しいビット)
次に、どちらの検索でも見つからなかったものをすべて削除します。
Edgeの場合、サーバーから取得された画像名は処理されません。これを処理するために、この検索にサーバーコードを含めます。
Xcode用のFauxPasアプリ を試すことができます。不足している画像や、Xcodeプロジェクトに関連する他の多くの問題/違反の発見に非常に役立ちます。
私はこのフレームワークを使用しました:-
http://jeffhodnett.github.io/Unused/
うまく動作します!私が問題を見つけたのは、画像名がサーバーからのものであり、画像アセット名がアセットフォルダ内の画像の名前と異なる場合だけです。
http://jeffhodnett.github.io/Unused/ を使用して、未使用の画像を見つけます。