承接上一篇關於模板的介紹,這次說說自動生成問題;程序員都是懶的,本人就是懶癌晚期……
思路
1.利用Xcode和我們自定義的工程模板生成項目
2.寫json配置文件,在用腳本配合文件模板生成功能模塊代碼
3.利用xcodeproj添加文件引用
1.利用Xcode和我們自定義的工程模板生成項目
好的工程組織架構應該是一目了然的,當然也和作者的習慣有關,模板都是可以自定義的
2.寫json配置文件,在用腳本配合文件模板生成功能模塊代碼
配置文件如下:
proj_path:工程文件的路徑
parent_path:該模塊的相對於工程文件的路徑(本例:/Users/mac/Desktop/wwwww/wwwww/Module/Service)
moudels:需要添加的功能模塊
完整架構如下

我的項目都是mvvm架構,功能上基本上都按照視圖控制器來分,每個功能模塊包含:Controller、Model、View三部分,如圖所示
文件生成的工作就很簡單了,挑選相應的模塊,該換的換~
3.利用xcodeproj添加文件引用
再來就是添加文件引用了,需要用到ruby框架Xcodeproj,這個就是在cocoapods上使用的項目管理工具,很犀利…… 我們要做的就是寫一個遍歷腳本把相應的文件引用添加進工程即可,貼上我的腳本供參考一下:
1 require 'xcodeproj' 2 require 'json' 3 4 #移除索引 5 def removeBuildPhaseFilesRecursively(aTarget, aGroup) 6 aGroup.files.each do |file| 7 aTarget.resources_build_phase.remove_file_reference(file) 8 end 9 10 aGroup.groups.each do |group| 11 removeBuildPhaseFilesRecursively(aTarget, group) 12 end 13 end 14 15 #添加索引 16 def addFilesToGroup(aGroup, full_path, aTarget) 17 current_path = full_path 18 mGroup = aGroup 19 Dir.foreach(current_path) do |entry| 20 filePath = File.join(current_path, entry) 21 # 過濾目錄和.DS_Store文件 22 if entry != ".DS_Store" && !filePath.to_s.end_with?(".meta") && entry != "." && entry != ".." then 23 if File::ftype(filePath) == "directory" 24 mGroup = aGroup.find_subpath(File.join(entry),true) 25 addFilesToGroup(mGroup,filePath,aTarget) 26 else 27 # 向group中增加文件引用 28 if nil == mGroup.find_subpath(entry) 29 fileReference = mGroup.new_reference(filePath) 30 aTarget.resources_build_phase.add_file_reference(fileReference, true) 31 end 32 end 33 end 34 end 35 end 36 37 fconfig = File.read('moudels.json') 38 configs = JSON.parse(fconfig) 39 for project_item in configs do 40 proj_path = project_item["proj_path"] 41 parent_path = project_item["parent_path"] 42 moudels = project_item["moudels"] 43 44 #相對於 ruby文件 .xcodeproj 的路徑 45 project = Xcodeproj::Project.open(proj_path) 46 target = project.targets.first 47 project_dir = project.project_dir 48 target_name = target.name 49 50 for model in moudels do 51 moudel_name = model["moudel_name"] 52 moudel_path = "#{project_dir}/#{target_name}/#{parent_path}/#{moudel_name}" 53 mapiGroup = project.main_group.find_subpath(File.join(target.name, parent_path, moudel_name), true) 54 55 puts "mapiGroup : #{mapiGroup}" 56 puts "moudel_path : #{moudel_path}" 57 addFilesToGroup(mapiGroup, moudel_path,target) 58 end 59 60 61 puts "重組目錄結構..." 62 project.save 63 end
嗯,就這樣吧