【问题标题】:How to remove unused images from an Xcode project如何从 Xcode 项目中删除未使用的图像
【发布时间】:2014-03-06 09:42:07
【问题描述】:

我正在关注此link 以从 xcode 项目中查找未使用的图像,但它们对我来说效果不佳。我尝试了 Rob 的回答和 Roman 的回答,但他们给了我所有的 png 图像。 我尝试使用tool 它也给了我所有的png图片

编辑

我使用脚本的方式
1)我复制脚本并将其粘贴到终端并按Enter。

2) 将脚本保存在 txt 文件中,在终端中输入 sh myscript.txt

【问题讨论】:

  • 它的工作原理不怪作者
  • @iDev 我希望他们这样做。但是他们不适合我
  • 我不知道为什么人们在没有阅读整个问题的情况下将问题标记为重复,看起来他们只是将标题复制粘贴到谷歌上并标记为重复
  • 所以把你的句子改成“他们不为我工作”

标签: ios shell


【解决方案1】:

我创建了一个 python 脚本来识别 swift 项目中未使用的图像:'unused_assets.py' @ gist,可以轻松地为你的 Objective-c 项目调整它。

脚本可以这样使用:

python3 unused_assets.py '/Users/DevK/MyProject' '/Users/DevK/MyProject/MyProject/Assets/Assets.xcassets'

这里有几个使用脚本的规则:

  • 重要的是传递项目文件夹路径作为第一个参数,资产文件夹路径作为第二个参数
  • 假设所有图像都保存在 Assets.xcassets 文件夹中,并在 swift/objective-c 文件或故事板中使用

第一个版本的限制:

  • 不适用于目标 c 文件,但可以进行调整以实现以下代码注释中指定的预期行为

随着时间的推移,我会根据反馈尝试改进它,但是第一个版本应该对大多数人都有好处。

这里是代码。 我试图通过在每个重要步骤中添加适当的 cmets 来使代码自我解释,如果您还需要更多详细信息,请告诉我

# Usage e.g.: python3 unused_assets.py '/Users/DevK/MyProject' '/Users/DevK/MyProject/MyProject/Assets/Assets.xcassets'
# It is important to pass project folder path as first argument, assets folder path as second argument
# It is assumed that all the images are maintained within Assets.xcassets folder and are used either within swift files or within storyboards

"""
@author = "Devarshi Kulshreshtha"
@copyright = "Copyright 2020, Devarshi Kulshreshtha"
@license = "GPL"
@version = "1.0.1"
@contact = "kulshreshtha.devarshi@gmail.com"
"""

import sys
import glob
from pathlib import Path
import mmap
import os
import time

# obtain start time
start = time.time()

arguments = sys.argv

# pass project folder path as argument 1
projectFolderPath = arguments[1].replace("\\", "") # replacing backslash with space
# pass assets folder path as argument 2
assetsPath = arguments[2].replace("\\", "") # replacing backslash with space

print(f"assetsPath: {assetsPath}")
print(f"projectFolderPath: {projectFolderPath}")

# obtain all assets / images 
# obtain paths for all assets

assetsSearchablePath = assetsPath + '/**/*.imageset'  #alternate way to append: fr"{assetsPath}/**/*.imageset"
print(f"assetsSearchablePath: {assetsSearchablePath}")

imagesNameCountDict = {} # empty dict to store image name as key and occurrence count
for imagesetPath in glob.glob(assetsSearchablePath, recursive=True):
    # storing the image name as encoded so that we save some time later during string search in file 
    encodedImageName = str.encode(Path(imagesetPath).stem)
    # initializing occurrence count as 0
    imagesNameCountDict[encodedImageName] = 0

print("Names of all assets obtained")

# search images in swift files
# obtain paths for all swift files

# For objective-c project, change '/**/*.swift' to '/**/*.m' 
swiftFilesSearchablePath = projectFolderPath + '/**/*.swift' #alternate way to append: fr"{projectFolderPath}/**/*.swift"
print(f"swiftFilesSearchablePath: {swiftFilesSearchablePath}")

for swiftFilePath in glob.glob(swiftFilesSearchablePath, recursive=True):
    with open(swiftFilePath, 'rb', 0) as file, \
        mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
        # search all the assests within the swift file
        for encodedImageName in imagesNameCountDict:
            # file search
            if s.find(encodedImageName) != -1:
                # updating occurrence count, if found 
                imagesNameCountDict[encodedImageName] += 1

print("Images searched in all swift files!")

# search images in storyboards
# obtain path for all storyboards

storyboardsSearchablePath = projectFolderPath + '/**/*.storyboard' #alternate way to append: fr"{projectFolderPath}/**/*.storyboard"
print(f"storyboardsSearchablePath: {storyboardsSearchablePath}")
for storyboardPath in glob.glob(storyboardsSearchablePath, recursive=True):
    with open(storyboardPath, 'rb', 0) as file, \
        mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
        # search all the assests within the storyboard file
        for encodedImageName in imagesNameCountDict:
            # file search
            if s.find(encodedImageName) != -1:
                # updating occurrence count, if found
                imagesNameCountDict[encodedImageName] += 1

print("Images searched in all storyboard files!")
print("Here is the list of unused assets:")

# printing all image names, for which occurrence count is 0
print('\n'.join({encodedImageName.decode("utf-8", "strict") for encodedImageName, occurrenceCount in imagesNameCountDict.items() if occurrenceCount == 0}))

print(f"Done in {time.time() - start} seconds!")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多