IT

Xcode 프로젝트에서 사용하지 않는 이미지를 찾는 방법은 무엇입니까?

lottoking 2020. 8. 29. 21:36
반응형

Xcode 프로젝트에서 사용하지 않는 이미지를 찾는 방법은 무엇입니까?


Xcode 프로젝트에서 사용하지 않는 이미지를 사용하는 한 줄이 있습니까? (모든 파일이 코드 또는 프로젝트 파일의 이름으로 참조된다고 가정하면 코드 생성 파일 이름이 없습니다.)

이 파일은 프로젝트의 수명 동안 쌓이는 경향이 있고 주어진 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

이보다 강력한 솔루션입니다-그것은 모든 텍스트 파일의 기본 이름을 참조합니다. 스토리 보드를 포함하지 않은 위의 솔루션에 유의하십시오.

Ack는 매우 빨리 만들지 만,이 펼쳐가 자주 실행 몇 가지 명백한 최적화가 있습니다. 예를 들어이 코드는 retina / non-retina 자산이있는 경우 모든 기본 이름을 두 번 확인합니다.

#!/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의 미사용에 크게 영향을 받지만 솔직히 미사용은 매우 느리고 결과가 제거됩니다. 그래서 성능을 최적화했습니다. 검색 속도가 미사용보다 빠 사용.


날씬한 것을 시도 하고 괜찮은 일을 할 수 있습니다 .

업데이트 : emcmanus 아이디어를 사용하여 컴퓨터에서 추가 설정을 피하기 위해 ack없이 작은 유틸리티를 만들었습니다.

https://github.com/arun80/xcodeutils


이 펼쳐 만이 파일 이름의 공간을 처리하는 나를 위해 작동합니다.

편집하다

지원에 업데이트 swift파일과 cocoapod. 기본적으로 Pod 디렉터리를 제외하고 프로젝트 파일 만 확인합니다. 실행하여 포드 폴더도 확인하려면 --podattrbiute로 실행 하십시오.

/.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 스크립트를 작성하지 않으므로 여기서 개선해야 할 사항이 있으면 주석으로 알려 주시면 업데이트하겠습니다.


grep소스 코드를 작성하고 발견 된 이미지를 프로젝트 폴더와 비교할 수있는 셸 스크립트를 만들 수 있습니다 .

여기 남자 (들) GREPLS

쉽게 모든 소스 파일을 반복하고 이미지를 배열로 저장하거나 동일하게 사용할 수 있습니다.

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

이 트릭을 사용하면 프로젝트 소스 코드의 모든 이미지를 검색 할 수 있습니다 !!

도움이 되었기를 바랍니다!


루아 스크립트를 작성했는데 직장에서했기 때문에 공유 할 수 있을지 모르겠지만 잘 작동합니다. 기본적으로 다음을 수행합니다.

1 단계-정적 이미지 참조 (다른 답변에서 다루는 쉬운 부분)

  • 이미지 디렉토리를 재귀 적으로 살펴보고 이미지 이름을 가져옵니다.
  • .png 및 @ 2x의 이미지 이름을 제거합니다 (필수 / imageNamed :에서 사용되지 않음).
  • 소스 파일에서 각 이미지 이름을 텍스트로 검색합니다 (문자열 리터럴 내에 있어야 함).

2 단계-동적 이미지 참조 (재미있는 부분)

  • 형식 지정자를 포함하는 소스의 모든 문자열 리터럴 목록을 가져옵니다 (예 : % @).
  • 이 문자열의 형식 지정자를 정규식으로 대체합니다 (예 : "foo % dbar"는 "foo [0-9] * bar"가됩니다.)
  • 이러한 정규식 문자열을 사용하여 이미지 이름을 텍스트로 검색합니다.

그런 다음 두 검색에서 찾지 못한 모든 것을 삭제합니다.

가장 중요한 경우는 서버에서 가져온 이미지 이름이 처리되지 않는다는 것입니다. 이를 처리하기 위해이 검색에 서버 코드를 포함합니다.


Xcode 용 FauxPas 앱을 사용해 볼 수 있습니다 . Xcode 프로젝트와 관련된 누락 된 이미지 및 기타 많은 문제 / 위반을 찾는 데 정말 좋습니다.


다른 답변을 사용하면 이것은 두 디렉토리의 이미지를 무시하고 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

이 프레임 워크를 사용했습니다.

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

잘 작동합니다! 내가 문제를 본 두 곳은 이미지 이름이 서버에서 왔고 이미지 자산 이름이 자산 폴더 내의 이미지 이름과 다른 경우입니다.


http://jeffhodnett.github.io/Unused/사용 하여 사용하지 않는 이미지를 찾으십시오.

참고 URL : https://stackoverflow.com/questions/6113243/how-to-find-unused-images-in-an-xcode-project

반응형