項(xiàng)目越來(lái)越大,一些沒(méi)用了的圖片資源沒(méi)有及時(shí)刪除,占用項(xiàng)目空間,一個(gè)個(gè)檢查太耗時(shí)間代價(jià)。gitHub上有個(gè)人寫(xiě)了一個(gè)python腳本,可以幫助解決這個(gè)問(wèn)題。
一、腳本
原文地址:http://www.cocoachina.com/ios/20171030/20975.html。
腳本代碼如下:
# coding=utf-8
import os
import re
import shutil
# 是否開(kāi)啟自動(dòng)刪除,開(kāi)啟后當(dāng)檢查到未用到的圖,
# 將自動(dòng)被刪除。建議確認(rèn)所有的圖沒(méi)用后開(kāi)啟
IS_OPEN_AUTO_DEL = False
# 將要解析的項(xiàng)目名稱
DESPATH = "/Users/xx/Documents/xxxx/xxxx"
# 可能檢查出錯(cuò)的圖片,需要特別留意下
ERROR_DESPATH = "/Users/xx/Desktop/unUseImage/error.log"
# 解析結(jié)果存放的路徑
WDESPATH = "/Users/xx/Desktop/unUseImage/image.log"
# 項(xiàng)目中沒(méi)有用到的圖片
IMAGE_WDESPATH = "/Users/xx/Desktop/unUseImage/images/"
# 目錄黑名單,這個(gè)目錄下所有的圖片將被忽略
BLACK_DIR_LIST = [
DESPATH + '/ThirdPart', # Utils 下所有的文件將被忽略
]
# 已知某些圖片確實(shí)存在,比如像下面的圖,腳本不會(huì)自動(dòng)檢查出,需要手動(dòng)加入這個(gè)數(shù)組中
# NSString *name = [NSString stringWithFormat:@"loading_%d",i];
# UIImage *image = [UIImage imageNamed:name];
EXCEPT_IMAGES = [
'loading_',
'launch-guide'
]
# 項(xiàng)目中所有的圖
source_images = dict()
# 項(xiàng)目中所有使用到的圖
use_images = set()
# 異常圖片
err_images = set()
# 目錄是否在黑名單中 BLACK_DIR_LIST
def isInBlackList(filePath):
if os.path.isfile(filePath):
return filename(filePath) in BLACK_DIR_LIST
if filePath:
return filePath in BLACK_DIR_LIST
return False
# 是否為圖片
def isimage(filePath):
ext = os.path.splitext(filePath)[1]
return ext == '.png' or ext == '.jpg' or ext == '.jpeg' or ext == '.gif'
# 是否為 APPIcon
def isappicon(filePath):
return 'appiconset' in filePath
def filename(filePath):
return os.path.split(filePath)[1]
def is_except_image(filePath):
name = filename(filePath)
for item in EXCEPT_IMAGES:
if item in name:
return True
return False
def auto_remove_images():
with open(WDESPATH, 'r') as f:
for line in f.readlines():
path = DESPATH + line.strip('\n')
if not os.path.isdir(path):
if 'Assets.xcassets' in line:
path = os.path.split(path)[0]
if os.path.exists(path):
shutil.rmtree(path)
else:
os.remove(path)
def un_use_image(filePath):
if re.search(r'\w@3x.(png|jpg|jpeg|gif)', filePath):
return
if re.search(r'\w(@2x){0,1}.(png|jpg|jpeg|gif)', filePath):
exts = os.path.splitext(filePath)
result = (filename(filePath).replace('@2x', '')).replace(exts[1],'')
source_images[result] = filePath
def find_image_name(filePath):
f = open(filePath)
for index, line in enumerate(f):
line = line.strip()
regx = r'\[\s*UIImage\s+imageNamed\s*:\s*@"(.+?)"'
matchs = re.findall(regx, line)
if matchs:
for item in matchs:
use_images.add(item)
else:
err_matchs = re.findall(r'\[UIImage imageNamed:', line)
if err_matchs:
name = filename(filePath)
for item in err_matchs:
err_images.add(str(index + 1) + ':' + name + '\n' + line + '\n')
def find_from_file(path):
paths = os.listdir(path)
for aCompent in paths:
aPath = os.path.join(path, aCompent)
if isInBlackList(aPath):
print('在黑名單中,被自動(dòng)忽略' + aPath)
continue
if os.path.isdir(aPath):
find_from_file(aPath)
elif os.path.isfile(aPath) and isimage(aPath) and not isappicon(aPath) and not is_except_image(aPath):
un_use_image(aPath)
elif os.path.isfile(aPath) and os.path.splitext(aPath)[1]=='.m':
find_image_name(aPath)
if __name__ == '__main__':
if os.path.exists(IMAGE_WDESPATH):
shutil.rmtree(IMAGE_WDESPATH)
os.makedirs(IMAGE_WDESPATH)
with open(WDESPATH, 'w') as wf:
find_from_file(DESPATH)
for item in set(source_images.keys()) - use_images:
value = source_images[item]
wf.write(value.replace(DESPATH, '') + '\n')
ext = os.path.splitext(value)[1]
shutil.copyfile(value, IMAGE_WDESPATH + item + ext)
with open(ERROR_DESPATH, 'w') as ef:
for item in err_images:
ef.write(item)
if IS_OPEN_AUTO_DEL:
auto_remove_images()
二、使用
如果沒(méi)學(xué)過(guò)python也沒(méi)關(guān)系,直接執(zhí)行這個(gè)腳本就可以了。
0xx1
Sublime里,然后修改“DESPATH”為你項(xiàng)目的路徑,其他幾個(gè)路徑需要設(shè)置用戶名的設(shè)置一下用戶名:
# 將要解析的項(xiàng)目名稱
DESPATH = "修改為你的項(xiàng)目路徑"
# 可能檢查出錯(cuò)的圖片,需要特別留意下
ERROR_DESPATH = "/Users/修改為你的用戶名/Desktop/unUseImage/error.log"
# 解析結(jié)果存放的路徑
WDESPATH = "/Users/修改為你的用戶名/Desktop/unUseImage/image.log"
# 項(xiàng)目中沒(méi)有用到的圖片
IMAGE_WDESPATH = "/Users/修改為你的用戶名/Desktop/unUseImage/images/"
0xx2
保存文件至桌面,起名:unUseImage.py
0xx3
文件保存到桌面后,cd到桌面下;
打開(kāi)終端執(zhí)行命令執(zhí)行腳本:python unUseImage.py。
桌面會(huì)生成一個(gè)文件件:文件夾里images里面是你項(xiàng)目中可能沒(méi)有用到的圖片。
三、注意
執(zhí)行此腳本生成的文件夾中,images里面的圖片是項(xiàng)目里有可能沒(méi)有用到的圖片,但是這里面有些圖片項(xiàng)目里面是用到了的,但是還是撿出來(lái)了,所以刪除項(xiàng)目中這些圖片資源的時(shí)候需要再比對(duì)確認(rèn)一下,以防錯(cuò)刪。