ruby 实现自动删除工程中未引用的文件

1,821 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

前言

随着工程的迭代,会因为各种各样的原因导致部分的文件不再使用并且也不在工程的引用范围内,但是却一直在工程项目中存在。那么此时我们要手动处理处理这些文件的时候,就需要一个一个的核对过去。而在一个经过一定迭代的项目中,其文件数量还是很可观的,也就会导致工作量重复且耗时耗力。所以实现了一个脚本,来实现这个重复的工作内容。

实现的思路

  1. 通过 xcodeproj 库,来获取对应工程底下对应 target 所对应的所有引用文件
  2. 通过 find 库,所有该工程目录下所有的文件
  3. 如果文件为 .m 文件,且不在引用文件中,删除对应的 .m 与 .h 文件
  4. 如果当前的目录在删除之后是空目录,则删除目录

传递参数

  1. 工程文件地址 : project_path
  2. 工程名字 : project_name
  3. target 名字 : target_name
  4. 是否要自动删除文件 : auto_delete_file
  5. 是否要自动删除空目录 : 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}"

存在的问题:

  1. 如果当前的 .h 与 .m 在不同目录中或者命令不相同的话 .h 文件将无法被删除;
  2. 如果代码文件与工程文件在不同的目录下的话,将会导致删除不完整,可以手动修改 Find.find(project_path);
  3. 如果不同的 target 中引用的文件有差异,请谨慎使用,否则会导致其他 target 无法使用,可以查询所有 target 中的引用文件并将其写入同一个数组中,在进行查询。

TIPS

  1. xcodeproj 在线文档
  2. xcodeproj 安装与简单实用