XcodeProj,使用Ruby更改工程文件
一,Ruby基础
Ruby迭代器each、map、collect、inject
each——连续访问集合的所有元素
collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。
map——-同collect。
inject——遍历集合中的各个元素,将各个元素累积成返回一个值。
二,Ruby脚本
此脚本的作用是,待CoreLib工程中的文件copy到SDK工程中后,给这些文件添加依赖。目的是为了减少人工干预。
灵感来自于Cocapods。需要使用到Xcodeproj这个工具。
此脚本的缺陷是:如果是在编译过程中去给文件添加依赖,修改到了Xcode的工程文件,工程会停止运行,必须要跑两遍,才会有结果,所以后来这个方法被否决了。
require 'xcodeproj' project_path = './EcoRobotCoreLib/EcoRobotCoreLib.xcodeproj' # 工程的全路径 sdk_project_path = './EcoRobotSDK/EcoRobotSDK.xcodeproj' project = Xcodeproj::Project.open(project_path) # 1、显示所有的target project.targets.each do |target| puts target.name end # 增加新的文件到工程中 target = project.targets.first group = project.main_group.find_subpath(File.join('testXcodeproj','newGroup'), true) group.set_source_tree('SOURCE_ROOT') # 获取全部的文件引用 file_ref_list = target.source_build_phase.files_references # 设置文件引用是否存在标识 file_ref_mark = false # 检测需要添加的文件是否存在 for file_ref_temp in file_ref_list puts file_ref_temp.path.to_s if file_ref_temp.path.to_s.end_with?('ViewController1.m') then file_ref_mark = true end end if !file_ref_mark then file_ref = group.new_reference('ViewController1.h文件路径') target.add_file_references([file_ref]) else puts '文件引用已存在' end if !file_ref_mark then file_ref = group.new_reference('ViewController1.m文件路径') target.add_file_references([file_ref]) else puts '文件引用已存在' end project.save puts '文件添加完成'
require 'xcodeproj' project_path = './EcoRobotSDK/EcoRobotSDK.xcodeproj' # 工程的全路径 project = Xcodeproj::Project.open(project_path) #获取target target = project.targets.first puts target.name #根据路径名寻找group,def find_subpath(path, should_create = false) ,不重新创建 group = project.main_group.find_subpath(File.join('CommonClass(公共类)','StaticLibaryHeaders', 'iotclient'), false) #如果找不到路径,就退出 if !group exit end group.set_source_tree('<group>') #SOURCE_ROOT "<group>" puts "group.real_path:#{group.real_path}" header_path=group.real_path.to_s; #+"/Class/StaticLibaryHeaders/iotclient"; puts "#{header_path}" # 获取全部的文件引用 file_ref_list = target.headers_build_phase.files_references file_ref_mark = false; if File::directory?(header_path) Dir::foreach(header_path) do |file| if file !="." and file !=".." # puts file.to_s for file_ref_temp in file_ref_list if file_ref_temp && file_ref_temp.path.to_s.end_with?(file.to_s) then # if file_ref_temp.path.to_s.end_with?(file.to_s) then file_ref_mark = true puts "文件依赖存在,头文件:#{file}" break; end end if file_ref_temp && !file_ref_mark puts "文件依赖不存在,file:#{file}" puts File.basename(file) puts "路径地址:#{header_path}/#{file}" file_ref = group.new_reference("#{header_path}/#{file}") target.add_file_references([file_ref]); end file_ref_mark = false end end end project.save; # def traverse_dir(file_path) # if File.directory? file_path # Dir.foreach(file_path) do |file| # if file !="." and file !=".." # traverse_dir(file_path+"/"+file) # end # end # else # puts "File:#{File.basename(file_path)}" # # 检测需要添加的文件是否存在 # # for file_ref_temp in file_ref_list # # puts file_ref_temp.path.to_s # # if file_ref_temp.path.to_s.end_with?('#{File.basename(file_path)}') then # # # file_ref_mark = true # # file_ref = group.new_reference(file_path) # # target.add_file_references([file_ref]); # # end # # end # end # end # traverse_dir(header_path); #对的 # if File::directory?(header_path) # Dir::foreach(header_path) do |file| # puts file.to_s # end # end # file_ref_list = target.headers_build_phase.files_references # for file_ref_temp in file_ref_list # if file_ref_temp # puts file_ref_temp.path.to_s # end # end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2016-05-22 iOS面试和招聘