ruby 實現自動刪除工程中未引用的檔案

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 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 安裝與簡單實用