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) # 、显示所有的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
XcodeProj,使用Ruby更改工程文件的更多相关文章
- Xcodeproj相关以及删除 多层文件夹、库、资源逻辑
一.介绍Xcodeproj是CocoaPods用ruby开发的一个插件库,可以用来新建.修改Xcode工程. 二.wiki和资源Xcodeproj wiki :https://www.rubydo ...
- Xcode工程文件pbxproj
Xcode工程文件pbxproj Xcode会去读Project.pbxproj文件,把pbxproj转成plist文件,看起根目录结构 rootObject:指向的是我们的工程对象.(对应一个24个 ...
- Visual Studio各版本工程文件之间的转换
转载于:http://www.cnblogs.com/jmliao/p/5594179.html 由于VS版本比较多,低版本无法直接打开高版本的工程文件,通过对工程文件进行一些修改可以解决这些问题. ...
- 转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
http://www.cnblogs.com/WayneLiu/p/5060277.html 前言:重装系统前我使用的是vs2015(有点装*),由于使用2015实在在班上太另类了, 导致我想在其他同 ...
- SVN版本更新后,upData工程之后,Xcode 工程文件打不开解决办法
svn更新代码后,打开xcode工程文件,会出现 xxx..xcodeproj cannot be opened becausethe project file cannot be parsed. ...
- Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
svn更新代码后,打开xcode工程文件,会出现 xxx..xcodeproj cannot be opened because the project file cannot be parsed ...
- Android开发:彻底更改工程名
对于已经建立的工程,如果发现原来的工程名不合适,此时若想彻底更改工程名,需要三个步骤: 1.更改工程名 选中工程名,右键-->Refactor-->Rename. 2.更改src文件下包名 ...
- Keil工程文件的建立、设置与目标文件的获得
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 汇编的方法了.机器汇编是通过汇编软件 ...
- Xcode工程文件打不开:cannot be opened because the project file cannot be parsed
svn更新代码后,打开xcode工程文件,会出现 xxx..xcodeproj cannot be opened because the project file cannot be parsed ...
随机推荐
- sqli-labs(十八)
第五十五关:和上一关类似,只是拼凑的方法不一样,所以需要先判断后台是怎么拼凑的 分别输入id=1'--+ id=1"--+ id=') --+ ...
- MFC AfxMessageBox MessageBox MessageBoxA 默认标题修改
在工程的资源里添加String Table资源,AFX_IDS_APP_TITLE,然后设置其值即可,AFX_IDS_APP_TITLE的值就是AfxMessageBox.MessageBox.Mes ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- oracle查询数据字典的sql
使用的sql语句如下: select t1.username 用户, t2.TABLE_NAME 表名称, t3.comments 表业务含义, t2.COLUMN_NAME 字段名称, t4.com ...
- linux的swap相关
linux的系统采用的内存方案一般都是 物理内存+swap.物理内存供日常使用,swap用来救急. 但在实际使用的过程中,发现有时候物理内存还没被完全占用的情况下,已经开始使用swap了.而这时候,由 ...
- html5-css边框img
div{ width: 500px; height: 300px; background: rgb(122,30,60); border:15px solid black; ...
- E. Gerald and Giant Chess
E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...
- Java基础(basis)-----异常与错误处理
1.编译型异常和运行时异常 编译时异常是指程序正确 而由外界条件不满足而产生的异常 java 中要求必须去捕捉住这类异常 不然无法通过编译 运行时异常是指程序存在着bug 如空指针异常 数 ...
- QScrollBar & QSlider & QDial
[1]滚动条 & 滑块 & 表盘 Qt示例工程: (1)slidergroup.h #include <QGroupBox> QT_BEGIN_NAMESPACE clas ...
- MongoDB-Java的两个基本操作Upsert和insertMany
此文只是为了记录几个基本操作,首先Upsert,有多种方法可以进行,但是都需要指定UpdateOptions.upsert(true),其中最简单的办法如下(eqq是一个用来filter的BSON,具 ...