持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
前言
随着工程的迭代,会因为各种各样的原因导致部分的文件不再使用并且也不在工程的引用范围内,但是却一直在工程项目中存在。那么此时我们要手动处理处理这些文件的时候,就需要一个一个的核对过去。而在一个经过一定迭代的项目中,其文件数量还是很可观的,也就会导致工作量重复且耗时耗力。所以实现了一个脚本,来实现这个重复的工作内容。
实现的思路
- 通过 xcodeproj 库,来获取对应工程底下对应 target 所对应的所有引用文件
- 通过 find 库,所有该工程目录下所有的文件
- 如果文件为 .m 文件,且不在引用文件中,删除对应的 .m 与 .h 文件
- 如果当前的目录在删除之后是空目录,则删除目录
传递参数
- 工程文件地址 : project_path
- 工程名字 : project_name
- target 名字 : target_name
- 是否要自动删除文件 : auto_delete_file
- 是否要自动删除空目录 : auto_delete_empty_dir
实现代码
require 'xcodeproj'
require 'find'
project_path = "~/project"
project_name = "project.xcodeproj"
target_name = "project"
auto_delete_file = true
auto_delete_empty_dir = true
proj = Xcodeproj::Project.open("#{project_path}/#{project_name}")
src_target = proj.targets.find { |item| item.to_s == target_name }
# 获取所有引用.m文件
target_list = []
for file in src_target.source_build_phase.files
target_list << file.file_ref.real_path.to_s
end
Find.find(project_path) do |f|
f_type = f.split('.')[-1]
# 判断是否是多余的.m文件
if f_type == 'm'
if !target_list.include?(f) && File.basename(f)[0] != '.'
# 获取对应的.h文件
hf = f.chop + 'h'
delete_file(f)
delete_file(hf)
end
end
# 如果需要删除空目录
if auto_delete_empty_dir
# 获取当前目录
f_dir = File::dirname(f)
if File::directory?(f)
f_dir = f
end
# 说明为空目录
if Dir::entries(f_dir).count==2
p f_dir
Dir::delete(f_dir)
end
end
end
def delete_file(file)
p file
# 如果需要删除文件且文件存在
if auto_delete_file && File::exist?(file)
File::delete(file)
end
end
p Time.new.strftime("%Y-%m-%d %H:%M:%S")
p "#{'-'*15}success#{'-'*15}"
存在的问题:
- 如果当前的 .h 与 .m 在不同目录中或者命令不相同的话 .h 文件将无法被删除;
- 如果代码文件与工程文件在不同的目录下的话,将会导致删除不完整,可以手动修改
Find.find(project_path)
; - 如果不同的 target 中引用的文件有差异,请谨慎使用,否则会导致其他 target 无法使用,可以查询所有 target 中的引用文件并将其写入同一个数组中,在进行查询。