본문 바로가기

iOS

[iOS] Ruby on Rails를 활용하여, 사용하지 않는 이미지 리소스 제거

반응형

프로젝트를 진행하며, 사용하지 않는 이미지 리소스들이 점차 쌓이게 되었고, 저장된 이미지 리소스만 67MB가 되었습니다..

새로운 이미지를 추가할 때마다, 한숨이 늘어가는 것을 보며 사용하지 않는 것들을 지울 수 없을까?라는 생각을 가지게 되었습니다.

저와 비슷한 생각을 가진 사람들이 있지 않을까 해서, 검색을 해봤지만 SwiftGen을 사용하여 camel case로 변환된 것 까지 검출하는 방법은 찾을 수 없었습니다..

따라서, 저희에게 맞도록 스크립트를 작성하는 것을 목표로 시작했습니다.

(Ruby on Rails를 이용하여 스크립트를 작성했습니다.)

안쓰는 이미지 리소스들을 찾는 과정을 간단하게 설명하면 다음과 같습니다.

1. Asset 폴더에 저장되어 있는 모든 이미지 리소스 리스트를 받아온다.
2. 프로젝트 내에서 사용 중인 파일에서 원본 이미지 형식으로 사용하고 있는 항목을 제외한다.
3. 프로젝트 내에서 사용 중인 파일에서 camel case로 변환되어 사용하고 있는 항목을 제외한다.
4. 남은 이미지 리소스 리스트는 사용하지 않으므로, 제거한다.

 

1. Asset 폴더에 저장되어 있는 모든 이미지 리소스 리스트를 받아온다.

 

 

위와 같은 방식으로 Assets 내부의 이미지 경로들을 가져올 수 있습니다. 다만, appIcon은 내부 소스에서 사용하지 않으므로 AppIcon 관련 경로는 제거합니다.

이미지 경로를 받아오게 되면

./PROJ/Assets.xcassets/Profile/edit_profile.imageset/pencil.png 

같은 형식의 리스트를 받아올 수 있습니다.

edit_profile.imageset은 프로젝트 내부에서 사용하는 이름이고,

그 하위 요소는 Contents json 파일과 실제 이미지 파일이 들어 있습니다.

 

프로젝트 내부에서는 imageset 이름을 사용하기 때문에,

imageset 이름이 필요하며, 해당 Directory 경로와

camel case로 변환된 이름이 필요합니다.

(저희는 SwiftGen으로 이미지 리소스를 관리하기 때문에 camel case로 변환된 정보가 필요했습니다.)

 

따라서 ImageConverter라는 class를 만들고,

imageset 이름, camel case로 변환된 이름, 경로를 저장할 수 있도록 합니다.

 

converted_image_name_downcased는 lower camel case로 변환한 것을 소문자로 다시 변환한 형태입니다.

(SwiftGen이 camel case로 변환하는 작업과, rails에서 camel case로 변환하는 작업이 다소 차이가 있는 문제가 있어서 소문자로 변환하여 비교 작업을 진행했습니다..)

 

 

이미지 경로를 바탕으로 ImageConverter를 만드는 것과

2. 프로젝트 내에서 사용 중인 파일에서 원본 이미지 형식으로 사용하고 있는 항목을 제외한다.
3. 프로젝트 내에서 사용 중인 파일에서 camel case로 변환되어 사용하고 있는 항목을 제외한다.

위의 항목에 대한 기능을 위한 함수 집합을 ImageUtils class를 통해 관리하도록 했습니다.

 

5~16 line: 이미지 경로들을 바탕으로 ImageConverter 배열을 반환하는 함수입니다.

 

27~29 line: 이미지 사이즈를 포함한 이미지 이름을 반환하는 함수입니다.

 

18~20 line: 이미지 경로를 바탕으로 imageaset Directory 경로를 반환하는 함수입니다.

이미지 이름을 받아와서 "/이미지 이름. 확장자"를 chomp 한 결과를 반환합니다.

./PROJ/Assets.xcassets/Profile/edit_profile.imageset/pencil.png
=>
./PROJ/Assets.xcassets/Profile/edit_profile.imageset

 

22~25 line: 이미지 경로를 통해 imageset 이름을 반환하는 함수입니다.

./PROJ/Assets.xcassets/Profile/edit_profile.imageset

=>

edit_profile.imageset

=>

edit_profile

 

31~45 line: 파일 경로들의 파일을 읽으면서 정규 표현식에 해당하는 리스트를 반환하는 함수입니다.

/Asset.Assets\.(\w+)/ : SwiftGen을 통해 변환된 형식으로 사용하는 경우의 정규 표현식

/\"(.*?)\"/ : 쌍따옴표 내에서 사용되는 모든 문자열을 검출하는 정규 표현식

 

 

47~55 line: SwiftGen을 통한 camel case로 변환된 이미지가 사용되는지 확인하고

사용되는 것들을 리스트에서 제거합니다.

 

57~66 line: 쌍따옴표 내의 문자열과 imageset 이름들을 비교하여 사용되는지 확인하고

사용되는 것들을 리스트에서 제거합니다.
쌍따옴표 내의 문자열을 비교하는 이유는 xib, storyboard에서 image="name"으로 사용되는 경우가 있으며, swift 파일 내에서 하드코딩으로 이미지를 설정하는 경우가 있기 때문입니다.

 

준비 작업은 완료되었습니다. 위 순서 그대로 진행하면 다음과 같습니다.

Asset.swift 파일은 제거한 후에 어차피 다시 생성하는 작업을 거쳐야 하기 때문에,

시작하기 전에 먼저 삭제하여 사용 여부에 간섭을 주지 않도록 하며

사용하지 않는 이미지들을 삭제한 후에 다시 생성합니다.

9~11 line: Asset 폴더에 저장되어 있는 모든 이미지 리소스 리스트를 받고 ImageConverter로 변환


13~15 line: 프로젝트 내부에서 사용되는 쌍따옴표 내의 문자열, Asset.Assets. 형식의 문자열들 도출

 

17 line: 사용하는 camel case 형식의 데이터를 제거

 

18 line: 사용하는 쌍따옴표 내의 문자열 형식의 데이터를 제거

 

21~29 line: 잔여 ImageConverter는 사용되지 않는 이미지로 간주 및 삭제

 

결과적으로 50MB의 이미지 리소스를 제거할 수 있었습니다..

반응형

'iOS' 카테고리의 다른 글

[UIKit/SwiftUI] Design System framework  (0) 2021.09.19
[iOS] Mock 데이터 기반 TDD 적용하기 - OHHTTPStubs  (1) 2020.06.08