vfastdev 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/vfastdev +245 -0
  3. data/lib/vfastdev.rb +216 -0
  4. metadata +60 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 36eb2a935955165465ca8c9b119d6ef203f485ee
4
+ data.tar.gz: e39a391145074d34acb6b3c600875292ccf4bc2d
5
+ SHA512:
6
+ metadata.gz: 2a07df0f18610bdd7727a5320a6b32c1d904ceee2a4705f09ced731127f1d2da012e7b05ec78d4ca9d495b5e2d85ebb9c882487bf6afb748e99abaebe0b522c4
7
+ data.tar.gz: e763cec7188ed3f1e567e7216ba65e3722295a2f7a37d9596a0322452bfab2b1694bb517c3b0d4368930fcca87478681db301c0fdd89a5591e40fc69b7dd0e2c
data/bin/vfastdev ADDED
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'xcodeproj'
4
+ require 'rexml/document'
5
+ require 'fileutils'
6
+ require 'open-uri'
7
+ require 'open3'
8
+ require 'optparse'
9
+
10
+ # 检查当前代码版本和静态库版本相差多久
11
+
12
+
13
+ usage = <<EOF
14
+ \033[1mNAME\033[0m
15
+ \033[1mvfastdev\033[0m -- Spec快速开发模式。
16
+
17
+ \033[1mDESCRIPTION\033[0m
18
+ \033[1mvfastdev\033[0m 会在工程根目录生成FastDev目录,按照保留指定的模块作为工程引入,剩余模块将会通过下载develop最新的静态库快照引入Spec工程。
19
+ 通过这样可以在一定程度上提高编译速度。目前只支持x86_64的静态库,意味着只在64位模拟器上面生效。
20
+
21
+ \033[1mUSAGE\033[0m
22
+ vfastdev -h
23
+ 显示帮助文档
24
+ vfastdev -k "[biz name]..." -
25
+
26
+ \033[1mEXAMPLE\033[0m
27
+
28
+ vfastdev -k "VSBizUserCenter VSBizCollection"
29
+ 保留VSBizUserCenter和VSBizCollection作为工程引入,其它业务模块通过静态库引入。Spec和Pods工程会默认保留。
30
+
31
+ \033[1mISSUes\033[0m
32
+ 1.如果你的代码版本和develop相差太多,可能导致出现找不到头文件,没有这个方法,找不到符号的问题
33
+ 2.由于业务模块之间依赖还比较严重,并且依赖比较隐晦。在FastDev下面修改业务模块的内容,可能导致运行看起来没有问题,但是在非FastDev下面编译会报错,例如提示没有这个函数的问题。
34
+ 这个问题目前环境下比较难避免,因为不知道修改的东西被谁引用了。
35
+ 3.真机和32位模拟器不嫩使用,因为只有x86_64的符号。
36
+ 4.VSBaseModule/VSPublic这类被公共依赖的工程不能再FastDev下面修改。
37
+ 5.同一个.xcodeproj文件不能被同时打开,使用FastDev打开的工程之前先关闭原来的工程。
38
+ 6.由于FastDev/Spec.xcodeproj是副本,修改它不会影响Spec.xcodeproj原本,如果需要修改Spec.xcodeproj,不能使用FastDev。
39
+ 7.出现___llvm_profile_runtime未找到符号的错误,可在Spec target的OTHER_LDFLAGS增加-fprofile-instr-generate来解决
40
+ EOF
41
+
42
+ $source_names = []
43
+ if ARGV.count > 1
44
+ if ARGV[0] == '-k'
45
+ param = ARGV[1]
46
+ $source_names = param.split(" ")
47
+ elsif ARGV[0] == '-h'
48
+ puts(usage)
49
+ exit(1)
50
+ end
51
+ else
52
+ puts(usage)
53
+ exit(1)
54
+ end
55
+
56
+ # 判断目录是否存在
57
+
58
+ unless File.exist?('FastDev')
59
+ puts '创建FastDev目录'
60
+ Dir.mkdir('FastDev')
61
+ end
62
+
63
+ Dir.chdir('FastDev')
64
+
65
+ if File.exist?('Spec.xcodeproj')
66
+ puts '删除FastDev/Spec.xcodeproj'
67
+ FileUtils.rm_rf('Spec.xcodeproj')
68
+ end
69
+
70
+ if File.exist?('Spec.xcworkspace')
71
+ puts '删除FastDev/Spec.xcworkspace'
72
+ FileUtils.rm_rf('Spec.xcworkspace')
73
+ end
74
+
75
+ vs_framework_dir = 'VSFrameworks'
76
+
77
+ if File.exist?(vs_framework_dir)
78
+ puts '删除FastDev/VSFrameworks'
79
+ FileUtils.rm_rf(vs_framework_dir)
80
+ end
81
+
82
+ puts '拷贝Spec.xcodeproj到FastDev'
83
+ FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')
84
+ puts '拷贝Spec.xcworkspace到FastDev'
85
+ FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')
86
+
87
+ puts '创建目录FastDev/VSFrameworks'
88
+ Dir.mkdir(vs_framework_dir)
89
+
90
+ vs_framework_name = []
91
+ tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
92
+ tmp_workspace.file_references.each do |file_ref|
93
+ match = /VS[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
94
+ if match != nil
95
+ name = match[0]
96
+ vs_framework_name << name
97
+ end
98
+ end
99
+
100
+
101
+
102
+ puts "工作空间包含的VS模块:#{vs_framework_name}"
103
+
104
+ begin
105
+ open('http://192.168.33.79:8000/lib/latest_framework_info?app_id=Spec') do |f|
106
+ puts "静态库版本信息: " + f.read
107
+ end
108
+ rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
109
+ puts "获取静态库版本信息失败: " + $!
110
+ end
111
+
112
+ puts '下载模块静态库'
113
+ Dir.chdir(vs_framework_dir)
114
+
115
+ vs_framework_name.each do |name|
116
+ puts '下载:'+ name
117
+ File.open("#{name}.framework.zip", 'wb') do |f|
118
+ framework_name = "#{name}.framework"
119
+ url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
120
+ begin
121
+ f.write(open(url) do |f1| f1.read end)
122
+ rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
123
+ puts $!
124
+ end
125
+
126
+ end
127
+ end
128
+
129
+ puts '解压静态库'
130
+ # 调用shell解压更简单,ruby不好写解压
131
+ system `
132
+ zip_names=$(ls)
133
+ for name in $zip_names
134
+ do
135
+ unzip -qq $name
136
+ rm $name
137
+ done
138
+ `
139
+ Dir.chdir('..')
140
+
141
+ biz_names = $source_names
142
+ k_framework_names = []
143
+ biz_names.each do |name|
144
+ k_framework_names << name + ".framework"
145
+ end
146
+
147
+ project_path = 'Spec.xcodeproj'
148
+ project = Xcodeproj::Project.open(project_path)
149
+
150
+ puts '更改Spec.xcodeproj的pecmain group的引用路径'
151
+ project.main_group.set_source_tree('SOURCE_ROOT')
152
+ project.main_group.set_path('../Spec')
153
+
154
+
155
+ puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
156
+ # 修改info.plist,pch,entitlements的引用路径
157
+ project.targets.each do |target|
158
+ target.build_configurations.each do |config|
159
+ if config.build_settings.has_key?('INFOPLIST_FILE')
160
+ info_plist_config = config.build_settings['INFOPLIST_FILE']
161
+
162
+ info_plist_config = "../Spec/" + info_plist_config
163
+ config.build_settings['INFOPLIST_FILE'] = info_plist_config
164
+ end
165
+ if config.build_settings.has_key?('GCC_PREFIX_HEADER')
166
+ pch_config = config.build_settings['GCC_PREFIX_HEADER']
167
+ pch_config = "../Spec/" + pch_config
168
+ config.build_settings['GCC_PREFIX_HEADER'] = pch_config
169
+ end
170
+ if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
171
+ entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
172
+ entitlements_config = "../Spec/" + entitlements_config
173
+ config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
174
+ end
175
+ end
176
+ end
177
+
178
+ puts 'FRAMEWORK_SEARCH_PATHS新增路径'
179
+ project.build_configuration_list.build_configurations.each do |config|
180
+ if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
181
+ paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
182
+ if paths.is_a?(String)
183
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths,vs_framework_dir]
184
+ else
185
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] << vs_framework_dir
186
+ end
187
+ end
188
+ end
189
+
190
+ puts'修改静态库库的引用'
191
+ project.files.each do |file_ref|
192
+ if file_ref.last_known_file_type == "wrapper.framework" && file_ref.name =~ /^VS/ && !k_framework_names.include?(file_ref.name)
193
+ file_ref.set_source_tree("SOURCE_ROOT")
194
+ file_ref.set_path(vs_framework_dir + "/" + file_ref.name)
195
+ elsif file_ref.explicit_file_type == "wrapper.framework" && file_ref.path =~ /^VS/ && !k_framework_names.include?(file_ref.path)
196
+ file_ref.set_source_tree("SOURCE_ROOT")
197
+ file_ref.name = file_ref.path
198
+ file_ref.set_path(vs_framework_dir + "/" + file_ref.path)
199
+ end
200
+ end
201
+
202
+ puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
203
+ project.targets.each do |target|
204
+ target.shell_script_build_phases.each do |phase|
205
+ if phase.name == 'Copy Modular Resources'
206
+ phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
207
+ end
208
+ end
209
+ end
210
+ project.save
211
+
212
+ puts'生成新的workspace'
213
+ workspace_xml = <<XML
214
+ <?xml version="1.0" encoding="UTF-8"?>
215
+ <Workspace
216
+ version = "1.0">
217
+ </Workspace>
218
+ XML
219
+
220
+
221
+ workspace = Xcodeproj::Workspace.from_s(workspace_xml)
222
+ spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
223
+ workspace << spec_file_ref
224
+
225
+ if $source_names.include?("VSBaseModule")
226
+ base_module_file_ref = Xcodeproj::Workspace::FileReference.new("../VSBaseModule/VSBaseModule.xcodeproj")
227
+ workspace << base_module_file_ref
228
+ end
229
+
230
+ biz_names.each do |each|
231
+ fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
232
+ workspace << fileRef
233
+ end
234
+ if $source_names.include?("VSPublic")
235
+ public_file_ref = Xcodeproj::Workspace::FileReference.new("../VSPublic/VSPublic.xcodeproj")
236
+ workspace << public_file_ref
237
+ end
238
+
239
+ pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
240
+ workspace << pods_file_ref
241
+
242
+ workspace_path = "Spec.xcworkspace"
243
+ workspace.save_as(workspace_path)
244
+
245
+ puts'FastDev完成。关闭旧的Spec.xcworkspace,打开FastDev/Spec.xcworkspace文件开始开发。'
data/lib/vfastdev.rb ADDED
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'xcodeproj'
4
+ require 'rexml/document'
5
+ require 'fileutils'
6
+ require 'open-uri'
7
+ require 'open3'
8
+
9
+ usage = <<EOF
10
+ \033[1mNAME\033[0m
11
+ \033[1mvfastdev\033[0m -- Spec快速开发模式。
12
+
13
+ \033[1mDESCRIPTION\033[0m
14
+ \033[1mvfastdev\033[0m 会在工程根目录生成FastDev目录,按照保留指定的业务模块作为工程引入,剩余业务模块将会通过下载develop最新的静态库快照引入Spec工程。
15
+ 通过这样可以在一定程度上提高编译速度。目前只支持x86_64的静态库,意味着只在64位模拟器上面生效。
16
+
17
+ \033[1mEXAMPLE\033[0m
18
+ vfastdev -h
19
+ 显示帮助文档
20
+ vfastdev -k "VSBizUserCenter VSBizCollection"
21
+ 保留VSBizUserCenter和VSBizCollection作为工程引入,其它业务模块通过静态库引入
22
+ EOF
23
+
24
+ $source_biz_names = []
25
+ if ARGV.count > 1
26
+ if ARGV[0] == '-k'
27
+ param = ARGV[1]
28
+ $source_biz_names = param.split(" ")
29
+ elsif ARGV[0] == '-h'
30
+ puts(usage)
31
+ exit(1)
32
+ end
33
+ else
34
+ puts(usage)
35
+ exit(1)
36
+ end
37
+
38
+ # 判断目录是否存在
39
+
40
+ unless File.exist?('FastDev')
41
+ puts '创建FastDev目录'
42
+ Dir.mkdir('FastDev')
43
+ end
44
+
45
+ Dir.chdir('FastDev')
46
+
47
+ if File.exist?('Spec.xcodeproj')
48
+ puts '删除FastDev/Spec.xcodeproj'
49
+ FileUtils.rm_rf('Spec.xcodeproj')
50
+ end
51
+
52
+ if File.exist?('Spec.xcworkspace')
53
+ puts '删除FastDev/Spec.xcworkspace'
54
+ FileUtils.rm_rf('Spec.xcworkspace')
55
+ end
56
+
57
+ if File.exist?('VSBizFrameworks')
58
+ puts '删除FastDev/VSBizFrameworks'
59
+ FileUtils.rm_rf('VSBizFrameworks')
60
+ end
61
+
62
+ puts '拷贝Spec.xcodeproj到FastDev'
63
+ FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')
64
+ puts '拷贝Spec.xcworkspace到FastDev'
65
+ FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')
66
+
67
+ puts '创建目录FastDev/VSBizFrameworks'
68
+ Dir.mkdir('VSBizFrameworks')
69
+
70
+ biz_framework_name = []
71
+ tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
72
+ tmp_workspace.file_references.each do |file_ref|
73
+ match = /VSBiz[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
74
+ if match != nil
75
+ name = match[0]
76
+ biz_framework_name << name
77
+ end
78
+ end
79
+
80
+ puts "工作空间包含的VSBiz业务模块:#{biz_framework_name}"
81
+ puts '下载业务模块静态库'
82
+ Dir.chdir('VSBizFrameworks')
83
+
84
+ biz_framework_name.each do |name|
85
+ puts name
86
+ File.open("#{name}.framework.zip", 'wb') do |f|
87
+ framework_name = "#{name}.framework"
88
+ url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
89
+ puts url
90
+ begin
91
+ f.write(open(url) do |f1| f1.read end)
92
+ rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
93
+ puts $!
94
+ end
95
+
96
+ end
97
+ end
98
+
99
+ puts '解压静态库'
100
+ # 调用shell解压更简单,ruby不好写解压
101
+ system `
102
+ zip_names=$(ls)
103
+ for name in $zip_names
104
+ do
105
+ unzip -qq $name
106
+ rm $name
107
+ done
108
+ `
109
+ Dir.chdir('..')
110
+
111
+ biz_names = $source_biz_names
112
+ biz_framework_names = []
113
+ biz_names.each do |name|
114
+ biz_framework_names << name + ".framework"
115
+ end
116
+
117
+ project_path = 'Spec.xcodeproj'
118
+ project = Xcodeproj::Project.open(project_path)
119
+
120
+ puts '更改Spec.xcodeproj的pecmain group的引用路径'
121
+ project.main_group.set_source_tree('SOURCE_ROOT')
122
+ project.main_group.set_path('../Spec')
123
+
124
+
125
+ puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
126
+ # 修改info.plist,pch,entitlements的引用路径
127
+ project.targets.each do |target|
128
+ target.build_configurations.each do |config|
129
+ if config.build_settings.has_key?('INFOPLIST_FILE')
130
+ info_plist_config = config.build_settings['INFOPLIST_FILE']
131
+
132
+ info_plist_config = "../Spec/" + info_plist_config
133
+ config.build_settings['INFOPLIST_FILE'] = info_plist_config
134
+ end
135
+ if config.build_settings.has_key?('GCC_PREFIX_HEADER')
136
+ pch_config = config.build_settings['GCC_PREFIX_HEADER']
137
+ pch_config = "../Spec/" + pch_config
138
+ config.build_settings['GCC_PREFIX_HEADER'] = pch_config
139
+ end
140
+ if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
141
+ entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
142
+ entitlements_config = "../Spec/" + entitlements_config
143
+ config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
144
+ end
145
+ if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
146
+ paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
147
+ puts(">>>>>>>>>>>>>>>>>#{paths}")
148
+ # entitlements_?config = "../Spec/" + entitlements_config
149
+ # config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
150
+ end
151
+ end
152
+ end
153
+
154
+ puts 'FRAMEWORK_SEARCH_PATHS新增路径'
155
+ project.build_configuration_list.build_configurations.each do |config|
156
+ if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
157
+ paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
158
+ if paths.is_a?(String)
159
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths,"VSBizFrameworks"]
160
+ else
161
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] << "VSBizFrameworks"
162
+ end
163
+ end
164
+ end
165
+
166
+ puts'修改静态库库的引用'
167
+ project.files.each do |file_ref|
168
+ if file_ref.last_known_file_type == "wrapper.framework" && file_ref.name =~ /^VSBiz/ && !biz_framework_names.include?(file_ref.name)
169
+ file_ref.set_source_tree("SOURCE_ROOT")
170
+ file_ref.set_path("VSBizFrameworks/" + file_ref.name)
171
+ elsif file_ref.explicit_file_type == "wrapper.framework" && file_ref.path =~ /^VSBiz/ && !biz_framework_names.include?(file_ref.path)
172
+ file_ref.set_source_tree("SOURCE_ROOT")
173
+ file_ref.name = file_ref.path
174
+ file_ref.set_path("VSBizFrameworks/" + file_ref.path)
175
+ end
176
+ end
177
+
178
+ puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
179
+ project.targets.each do |target|
180
+ target.shell_script_build_phases.each do |phase|
181
+ if phase.name == 'Copy Modular Resources'
182
+ phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
183
+ end
184
+ end
185
+ end
186
+ project.save
187
+
188
+ puts'生成新的workspace'
189
+ workspace_xml = <<XML
190
+ <?xml version="1.0" encoding="UTF-8"?>
191
+ <Workspace
192
+ version = "1.0">
193
+ </Workspace>
194
+ XML
195
+
196
+
197
+ workspace = Xcodeproj::Workspace.from_s(workspace_xml)
198
+
199
+ spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
200
+ base_module_file_ref = Xcodeproj::Workspace::FileReference.new("../VSBaseModule/VSBaseModule.xcodeproj")
201
+ public_file_ref = Xcodeproj::Workspace::FileReference.new("../VSPublic/VSPublic.xcodeproj")
202
+ pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
203
+
204
+ workspace << spec_file_ref
205
+ workspace << base_module_file_ref
206
+ biz_names.each do |each|
207
+ fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
208
+ workspace << fileRef
209
+ end
210
+ workspace << public_file_ref
211
+ workspace << pods_file_ref
212
+
213
+ workspace_path = "Spec.xcworkspace"
214
+ workspace.save_as(workspace_path)
215
+
216
+ puts'FastDev完成。打开FastDev/Spec.xcworkspace文件开始开发。'
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vfastdev
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Sen.Mao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: xcodeproj
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ description: iOS FastDev工具
28
+ email: sen.mao
29
+ executables:
30
+ - vfastdev
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - bin/vfastdev
35
+ - lib/vfastdev.rb
36
+ homepage: http://gitlab.tools.vipshop.com/sen.mao/FastDev
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 2.3.0
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.5.2.3
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: FastDev!
60
+ test_files: []