vfastdev 0.1.0 → 0.1.1

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 +4 -4
  2. data/bin/vfastdev +233 -166
  3. data/lib/vfastdev.rb +256 -162
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72a30c7c34af2f074984f9e8eaea796c346493ba
4
- data.tar.gz: 7880a72ad358e6e8d27d41ba03a3d758d73cf9fe
3
+ metadata.gz: e6490015cfc3cdeb16f4e23027b9f545964e01fd
4
+ data.tar.gz: aa8676c4068503cd1ebe5a41ec85d38f1fb7136e
5
5
  SHA512:
6
- metadata.gz: f62baadf70b9f7592c1a64dd3602512010e930d8b3de868629440fcbc1fc0d5c06543fb9c8b5e116ec3327622c0c495fa28bdbad9d3975e82d978710be9f805b
7
- data.tar.gz: e589aba852de41b023612272a923dd2e330fac443ca420ef99016995aac39fe93b657990bb8092dc2c9bf464a3a38f46320a9b51d4e7ce9fca8aeb994ba6299b
6
+ metadata.gz: 2478252d4e953206824cf59c886619ee639afca1291e54090193712de78639314162155d5bfb4bee66b57873701a2e8de7bde665bd88ef0e11b74692e95b1e5a
7
+ data.tar.gz: ccd41b0f65119a17d4d4a106b56280ab91adb5d8347367ac310a4e0c3358e1532de8be670715998829caea22625d5f47a9e5a0363182ee45e08f6581c83555ca
data/bin/vfastdev CHANGED
@@ -21,117 +21,245 @@ usage = <<EOF
21
21
  \033[1mUSAGE\033[0m
22
22
  vfastdev -h
23
23
  显示帮助文档
24
- vfastdev -k "[biz name]..."
24
+ vfastdev -k "[project name]..." [-n]
25
+ -k表示要保留的工程,"[project name]..."是指定保留的工程名字,可多个用空格分割,-n表示不需要下载静态库
25
26
 
26
27
  \033[1mEXAMPLE\033[0m
27
28
  vfastdev -k "VSBizUserCenter VSBizCollection"
28
29
  保留VSBizUserCenter和VSBizCollection作为工程引入,其它业务模块通过静态库引入。Spec,VSBaseModule,VSPublic,Pods工程会默认保留。
29
30
 
30
31
  \033[1mISSUES\033[0m
31
- 1.如果你的代码版本和develop相差太多,可能导致出现找不到头文件,没有这个方法,找不到符号的问题
32
+ 1.如果你的代码版本和develop相差太多,可能导致出现“找不到头文件”,“没有这个方法”,“找不到符号”等问题
32
33
  2.由于业务模块之间依赖还比较严重,并且依赖比较隐晦。在FastDev下面修改业务模块的内容,可能导致运行看起来没有问题,但是在非FastDev下面编译会报错,例如提示没有这个函数的问题。
33
- 这个问题目前环境下比较难避免,因为不知道修改的东西被谁引用了。
34
- 3.真机和32位模拟器不嫩使用,因为只有x86_64的符号。
35
- 4.VSBaseModule/VSPublic这类被公共依赖的工程不能再FastDev下面修改。
34
+ 这个问题目前环境下比较难避免,因为不知道修改的东西被谁引用了。
35
+ 3.真机和32位模拟器不能使用,因为静态库只有x86_64的符号。
36
+ 4.VSBaseModule/VSPublic这类被公共依赖的工程不能在FastDev下面修改。
36
37
  5.同一个.xcodeproj文件不能被同时打开,使用FastDev打开的工程之前先关闭原来的工程。
37
38
  6.由于FastDev/Spec.xcodeproj是副本,修改它不会影响Spec.xcodeproj原本,如果需要修改Spec.xcodeproj,不能使用FastDev。
38
39
  7.出现___llvm_profile_runtime未找到符号的错误,可在Spec target的OTHER_LDFLAGS增加-fprofile-instr-generate来解决。
39
- 8.由于大部分模块都变成静态库,那么会导致查找不到其他模块的代码。
40
+ 8.由于大部分模块都变成静态库,那么会导致查找不到其他模块的源码。
40
41
  9.目前服务器架设在我的iMac上面,如果公司路由器重启会导致ip改变,会导致静态库下载失败。
41
42
  EOF
42
43
 
43
- $source_names = []
44
- if ARGV.count > 1
45
- if ARGV[0] == '-k'
46
- param = ARGV[1]
47
- $source_names = param.split(" ")
48
- elsif ARGV[0] == '-h'
49
- puts(usage)
50
- exit(1)
44
+
45
+ class VFastDev
46
+ def initialize(options)
47
+ @vs_project_names = parse_vs_project_names
48
+ @vs_framework_dir = 'VSFrameworks'
49
+ @fastdev_dir = 'FastDev'
50
+ @project_kept_names = options[:keep] || []
51
+ @no_download_libs = options[:no_download_lib]
52
+ @sync_main_project = options[:sync]
53
+
54
+ @project_kept_names.each do |each|
55
+ unless @vs_project_names.include?(each)
56
+ puts "指定工程#{each}不存在"
57
+ exit 0
58
+ end
59
+ end
60
+ @project_kept_names << "VSBaseModule"
61
+ @project_kept_names << "VSPublic"
62
+ if @sync_main_project
63
+ puts "还没实现"
64
+ else
65
+ init_context
66
+ ajust_project
67
+ unless @no_download_libs
68
+ print_version_info
69
+ download_libs
70
+ unzip_libs
71
+ end
72
+ say_after_done
73
+ end
51
74
  end
52
- else
53
- puts(usage)
54
- exit(1)
55
- end
56
75
 
57
- $source_names << "VSBaseModule"
58
- $source_names << "VSPublic"
59
- # 判断目录是否存在
76
+ # @!method 初始化环境:创建目录,拷贝工程文件
77
+ # @param delete_frameworks 是否删除库目录
78
+ def init_context
79
+ unless File.exist?(@fastdev_dir)
80
+ puts "创建#{@fastdev_dir}目录"
81
+ Dir.mkdir(@fastdev_dir)
82
+ end
83
+ Dir.chdir(@fastdev_dir)
60
84
 
61
- unless File.exist?('FastDev')
62
- puts '创建FastDev目录'
63
- Dir.mkdir('FastDev')
64
- end
85
+ if File.exist?('Spec.xcodeproj')
86
+ puts '删除FastDev/Spec.xcodeproj'
87
+ FileUtils.rm_rf('Spec.xcodeproj')
88
+ end
89
+ puts '拷贝Spec.xcodeproj到FastDev'
90
+ FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')
65
91
 
66
- Dir.chdir('FastDev')
92
+ if File.exist?('Spec.xcworkspace')
93
+ puts '删除FastDev/Spec.xcworkspace'
94
+ FileUtils.rm_rf('Spec.xcworkspace')
95
+ end
96
+ puts '拷贝Spec.xcworkspace到FastDev'
97
+ FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')
98
+
99
+ if File.exist?(@vs_framework_dir)
100
+ unless @no_download_libs
101
+ puts "删除FastDev/#{@vs_framework_dir}"
102
+ FileUtils.rm_rf(@vs_framework_dir)
103
+ puts "创建目录FastDev/#{@vs_framework_dir}"
104
+ Dir.mkdir(@vs_framework_dir)
105
+ end
106
+ else
107
+ puts "创建目录FastDev/#{@vs_framework_dir}"
108
+ Dir.mkdir(@vs_framework_dir)
109
+ end
110
+ end
67
111
 
68
- if File.exist?('Spec.xcodeproj')
69
- puts '删除FastDev/Spec.xcodeproj'
70
- FileUtils.rm_rf('Spec.xcodeproj')
71
- end
112
+ def ajust_project
113
+ exclude_framework_names = [] #排除在外的静态库
114
+ @project_kept_names.each do |name|
115
+ exclude_framework_names << name + ".framework"
116
+ end
72
117
 
73
- if File.exist?('Spec.xcworkspace')
74
- puts '删除FastDev/Spec.xcworkspace'
75
- FileUtils.rm_rf('Spec.xcworkspace')
76
- end
118
+ vs_framework_paths = [] #所有静态库路径
119
+ @vs_project_names.each do |name|
120
+ vs_framework_paths << name + ".framework"
121
+ end
122
+ project_path = 'Spec.xcodeproj'
123
+ project = Xcodeproj::Project.open(project_path)
77
124
 
78
- vs_framework_dir = 'VSFrameworks'
125
+ puts '更改Spec.xcodeproj的main group的引用路径'
126
+ project.main_group.set_source_tree('SOURCE_ROOT')
127
+ project.main_group.set_path('../Spec')
79
128
 
80
- if File.exist?(vs_framework_dir)
81
- puts '删除FastDev/VSFrameworks'
82
- FileUtils.rm_rf(vs_framework_dir)
83
- end
84
129
 
85
- puts '拷贝Spec.xcodeproj到FastDev'
86
- FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')
87
- puts '拷贝Spec.xcworkspace到FastDev'
88
- FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')
89
-
90
- puts '创建目录FastDev/VSFrameworks'
91
- Dir.mkdir(vs_framework_dir)
92
-
93
- vs_framework_names = []
94
- tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
95
- tmp_workspace.file_references.each do |file_ref|
96
- match = /VS[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
97
- if match != nil
98
- name = match[0]
99
- vs_framework_names << name
100
- end
101
- end
130
+ puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
131
+ # 修改info.plist,pch,entitlements的引用路径
132
+ project.targets.each do |target|
133
+ target.build_configurations.each do |config|
134
+ if config.build_settings.has_key?('INFOPLIST_FILE')
135
+ info_plist_config = config.build_settings['INFOPLIST_FILE']
136
+
137
+ info_plist_config = "../Spec/" + info_plist_config
138
+ config.build_settings['INFOPLIST_FILE'] = info_plist_config
139
+ end
140
+ if config.build_settings.has_key?('GCC_PREFIX_HEADER')
141
+ pch_config = config.build_settings['GCC_PREFIX_HEADER']
142
+ pch_config = "../Spec/" + pch_config
143
+ config.build_settings['GCC_PREFIX_HEADER'] = pch_config
144
+ end
145
+ if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
146
+ entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
147
+ entitlements_config = "../Spec/" + entitlements_config
148
+ config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
149
+ end
150
+ end
151
+ end
102
152
 
153
+ puts 'FRAMEWORK_SEARCH_PATHS新增路径'
154
+ project.build_configuration_list.build_configurations.each do |config|
155
+ if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
156
+ paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
157
+ if paths.is_a?(String)
158
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths, @vs_framework_dir]
159
+ else
160
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] << @vs_framework_dir
161
+ end
162
+ end
163
+ end
103
164
 
165
+ puts '修改静态库库的引用'
166
+ project.files.each do |file_ref|
167
+ if file_ref.last_known_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.name) && !exclude_framework_names.include?(file_ref.name)
168
+ file_ref.set_source_tree("SOURCE_ROOT")
169
+ file_ref.set_path(@vs_framework_dir + "/" + file_ref.name)
170
+ elsif file_ref.explicit_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.path) && !exclude_framework_names.include?(file_ref.path)
171
+ file_ref.set_source_tree("SOURCE_ROOT")
172
+ file_ref.name = file_ref.path
173
+ file_ref.set_path(@vs_framework_dir + "/" + file_ref.path)
174
+ end
175
+ end
104
176
 
105
- puts "工作空间包含的VS模块:#{vs_framework_names}"
177
+ puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
178
+ project.targets.each do |target|
179
+ target.shell_script_build_phases.each do |phase|
180
+ if phase.name == 'Copy Modular Resources'
181
+ phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
182
+ end
183
+ end
184
+ end
185
+ project.save
106
186
 
107
- begin
108
- open('http://192.168.33.79:8000/lib/latest_framework_info?app_id=Spec') do |f|
109
- puts "静态库版本信息: " + f.read
110
- end
111
- rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
112
- puts "获取静态库版本信息失败。"
113
- end
187
+ puts '生成新的workspace'
188
+ workspace_xml = <<XML
189
+ <?xml version="1.0" encoding="UTF-8"?>
190
+ <Workspace
191
+ version = "1.0">
192
+ </Workspace>
193
+ XML
194
+
195
+
196
+ workspace = Xcodeproj::Workspace.from_s(workspace_xml)
197
+ spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
198
+ workspace << spec_file_ref
199
+
200
+ @project_kept_names.each do |each|
201
+ fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
202
+ workspace << fileRef
203
+ end
204
+
205
+ pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
206
+ workspace << pods_file_ref
207
+
208
+ workspace_path = "Spec.xcworkspace"
209
+ workspace.save_as(workspace_path)
114
210
 
115
- puts '下载模块静态库'
116
- Dir.chdir(vs_framework_dir)
117
211
 
118
- vs_framework_names.each do |name|
119
- puts '下载:'+ name
120
- File.open("#{name}.framework.zip", 'wb') do |f|
121
- framework_name = "#{name}.framework"
122
- url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
212
+ end
213
+
214
+ # 输出静态库版本信息
215
+ def print_version_info
123
216
  begin
124
- f.write(open(url) do |f1| f1.read end)
125
- rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
126
- puts $!
217
+ open('http://192.168.33.79:8000/lib/latest_framework_info?app_id=Spec') do |f|
218
+ puts "静态库版本信息: " + f.read
219
+ end
220
+ rescue StandardError, Timeout::Error, SystemCallError, Errno::ECONNREFUSED
221
+ puts "获取静态库版本信息失败。"
127
222
  end
223
+ end
128
224
 
225
+ def parse_vs_project_names
226
+ # 分析xcworkspace文件,查找VS开头的工程名字
227
+ names = []
228
+ tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
229
+ tmp_workspace.file_references.each do |file_ref|
230
+ match = /VS[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
231
+ if match != nil
232
+ name = match[0]
233
+ names << name
234
+ end
235
+ end
236
+ return names
129
237
  end
130
- end
131
238
 
132
- puts '解压静态库'
239
+ # 下载静态库
240
+ def download_libs
241
+ @vs_project_names.each do |name|
242
+ puts '下载:' + name
243
+ File.open("#{@vs_framework_dir}/#{name}.framework.zip", 'wb') do |f|
244
+ framework_name = "#{name}.framework"
245
+ url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
246
+ begin
247
+ f.write(open(url) do |f1|
248
+ f1.read
249
+ end)
250
+ rescue StandardError, Timeout::Error, SystemCallError, Errno::ECONNREFUSED
251
+ puts $!
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+ #解压静态库
258
+ def unzip_libs
259
+ puts '解压静态库'
260
+ Dir.chdir(@vs_framework_dir)
133
261
  # 调用shell解压更简单,ruby不好写解压
134
- system `
262
+ system `
135
263
  zip_names=$(ls)
136
264
  for name in $zip_names
137
265
  do
@@ -139,105 +267,44 @@ do
139
267
  rm $name
140
268
  done
141
269
  `
142
- Dir.chdir('..')
143
-
144
- biz_names = $source_names
145
- k_framework_names = []
146
- biz_names.each do |name|
147
- k_framework_names << name + ".framework"
148
- end
149
-
150
- vs_framework_paths = []
151
- vs_framework_names.each do |name|
152
- vs_framework_paths << name + ".framework"
153
- end
154
- project_path = 'Spec.xcodeproj'
155
- project = Xcodeproj::Project.open(project_path)
156
-
157
- puts '更改Spec.xcodeproj的pecmain group的引用路径'
158
- project.main_group.set_source_tree('SOURCE_ROOT')
159
- project.main_group.set_path('../Spec')
160
-
161
-
162
- puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
163
- # 修改info.plist,pch,entitlements的引用路径
164
- project.targets.each do |target|
165
- target.build_configurations.each do |config|
166
- if config.build_settings.has_key?('INFOPLIST_FILE')
167
- info_plist_config = config.build_settings['INFOPLIST_FILE']
168
-
169
- info_plist_config = "../Spec/" + info_plist_config
170
- config.build_settings['INFOPLIST_FILE'] = info_plist_config
171
- end
172
- if config.build_settings.has_key?('GCC_PREFIX_HEADER')
173
- pch_config = config.build_settings['GCC_PREFIX_HEADER']
174
- pch_config = "../Spec/" + pch_config
175
- config.build_settings['GCC_PREFIX_HEADER'] = pch_config
176
- end
177
- if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
178
- entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
179
- entitlements_config = "../Spec/" + entitlements_config
180
- config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
181
- end
270
+ Dir.chdir('..')
182
271
  end
183
- end
184
272
 
185
- puts 'FRAMEWORK_SEARCH_PATHS新增路径'
186
- project.build_configuration_list.build_configurations.each do |config|
187
- if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
188
- paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
189
- if paths.is_a?(String)
190
- config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths,vs_framework_dir]
191
- else
192
- config.build_settings['FRAMEWORK_SEARCH_PATHS'] << vs_framework_dir
193
- end
273
+ def say_after_done
274
+ puts 'FastDev完成。关闭旧的Spec.xcworkspace,打开FastDev/Spec.xcworkspace文件开始开发。'
194
275
  end
195
276
  end
196
277
 
197
- puts'修改静态库库的引用'
198
- project.files.each do |file_ref|
199
- if file_ref.last_known_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.name) && !k_framework_names.include?(file_ref.name)
200
- file_ref.set_source_tree("SOURCE_ROOT")
201
- file_ref.set_path(vs_framework_dir + "/" + file_ref.name)
202
- elsif file_ref.explicit_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.path) && !k_framework_names.include?(file_ref.path)
203
- file_ref.set_source_tree("SOURCE_ROOT")
204
- file_ref.name = file_ref.path
205
- file_ref.set_path(vs_framework_dir + "/" + file_ref.path)
278
+ dev_opts = {
279
+ keep:[],
280
+ no_download_lib:false ,
281
+ sync:false,
282
+ help:false
283
+ }
284
+
285
+ option_parser = OptionParser.new do |opts|
286
+ opts.banner = "哈哈哈哈哈"
287
+ opts.on('-k', '--keep [projects]', '需要保留的工程') do |projects|
288
+ if projects
289
+ dev_opts[:keep] = projects.split(" ")
290
+ end
206
291
  end
207
- end
208
292
 
209
- puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
210
- project.targets.each do |target|
211
- target.shell_script_build_phases.each do |phase|
212
- if phase.name == 'Copy Modular Resources'
213
- phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
214
- end
293
+ opts.on('-n', '--no-download-lib', '不需要下载库') do
294
+ dev_opts[:no_download_lib] = true
215
295
  end
216
- end
217
- project.save
218
-
219
- puts'生成新的workspace'
220
- workspace_xml = <<XML
221
- <?xml version="1.0" encoding="UTF-8"?>
222
- <Workspace
223
- version = "1.0">
224
- </Workspace>
225
- XML
226
296
 
297
+ opts.on('-h', '--help', '显示帮助文档') do
298
+ puts usage
299
+ exit 1
300
+ end
227
301
 
228
- workspace = Xcodeproj::Workspace.from_s(workspace_xml)
229
- spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
230
- workspace << spec_file_ref
231
-
232
- biz_names.each do |each|
233
- fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
234
- workspace << fileRef
235
- end
302
+ opts.on('-s', '--sync', '同步Spec工程改动') do
303
+ dev_opts[:sync] = true
304
+ end
305
+ end.parse!
306
+ puts dev_opts
307
+ vfastdev = VFastDev.new(dev_opts)
236
308
 
237
- pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
238
- workspace << pods_file_ref
239
309
 
240
- workspace_path = "Spec.xcworkspace"
241
- workspace.save_as(workspace_path)
242
310
 
243
- puts'FastDev完成。关闭旧的Spec.xcworkspace,打开FastDev/Spec.xcworkspace文件开始开发。'
data/lib/vfastdev.rb CHANGED
@@ -1,104 +1,265 @@
1
- #!/usr/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require 'xcodeproj'
4
4
  require 'rexml/document'
5
5
  require 'fileutils'
6
6
  require 'open-uri'
7
7
  require 'open3'
8
+ require 'optparse'
9
+
10
+ # 检查当前代码版本和静态库版本相差多久
11
+
8
12
 
9
13
  usage = <<EOF
10
14
  \033[1mNAME\033[0m
11
- \033[1mvfastdev\033[0m -- Spec快速开发模式。
15
+ \033[1mvfastdev\033[0m -- 无侵入式Spec快速开发模式。
12
16
 
13
17
  \033[1mDESCRIPTION\033[0m
14
- \033[1mvfastdev\033[0m 会在工程根目录生成FastDev目录,按照保留指定的业务模块作为工程引入,剩余业务模块将会通过下载develop最新的静态库快照引入Spec工程。
18
+ \033[1mvfastdev\033[0m 会在工程根目录生成FastDev目录,按照保留指定的模块作为工程引入,剩余模块将会通过下载develop最新的静态库快照引入Spec工程。
15
19
  通过这样可以在一定程度上提高编译速度。目前只支持x86_64的静态库,意味着只在64位模拟器上面生效。
16
20
 
17
- \033[1mEXAMPLE\033[0m
21
+ \033[1mUSAGE\033[0m
18
22
  vfastdev -h
19
23
  显示帮助文档
24
+ vfastdev -k "[project name]..." [-n]
25
+ -k表示要保留的工程,"[project name]..."是指定保留的工程名字,可多个用空格分割,-n表示不需要下载静态库
26
+
27
+ \033[1mEXAMPLE\033[0m
20
28
  vfastdev -k "VSBizUserCenter VSBizCollection"
21
- 保留VSBizUserCenter和VSBizCollection作为工程引入,其它业务模块通过静态库引入
29
+ 保留VSBizUserCenter和VSBizCollection作为工程引入,其它业务模块通过静态库引入。Spec,VSBaseModule,VSPublic,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
+ 8.由于大部分模块都变成静态库,那么会导致查找不到其他模块的源码。
41
+ 9.目前服务器架设在我的iMac上面,如果公司路由器重启会导致ip改变,会导致静态库下载失败。
22
42
  EOF
23
43
 
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)
44
+
45
+ class VFastDev
46
+ def initialize(options)
47
+ @vs_project_names = parse_vs_project_names
48
+ @vs_framework_dir = 'VSFrameworks'
49
+ @fastdev_dir = 'FastDev'
50
+ @project_kept_names = options[:keep] || []
51
+ @no_download_libs = options[:no_download_lib]
52
+ @sync_main_project = options[:sync]
53
+
54
+ @project_kept_names.each do |each|
55
+ unless @vs_project_names.include?(each)
56
+ puts "指定工程#{each}不存在"
57
+ exit 0
58
+ end
59
+ end
60
+ @project_kept_names << "VSBaseModule"
61
+ @project_kept_names << "VSPublic"
62
+ if @sync_main_project
63
+ puts "还没实现"
64
+ else
65
+ init_context
66
+ ajust_project
67
+ unless @no_download_libs
68
+ print_version_info
69
+ download_libs
70
+ unzip_libs
71
+ end
72
+ say_after_done
73
+ end
32
74
  end
33
- else
34
- puts(usage)
35
- exit(1)
36
- end
37
75
 
38
- # 判断目录是否存在
76
+ # @!method 初始化环境:创建目录,拷贝工程文件
77
+ # @param delete_frameworks 是否删除库目录
78
+ def init_context
79
+ unless File.exist?(@fastdev_dir)
80
+ puts "创建#{@fastdev_dir}目录"
81
+ Dir.mkdir(@fastdev_dir)
82
+ end
83
+ Dir.chdir(@fastdev_dir)
39
84
 
40
- unless File.exist?('FastDev')
41
- puts '创建FastDev目录'
42
- Dir.mkdir('FastDev')
43
- end
85
+ if File.exist?('Spec.xcodeproj')
86
+ puts '删除FastDev/Spec.xcodeproj'
87
+ FileUtils.rm_rf('Spec.xcodeproj')
88
+ end
89
+ puts '拷贝Spec.xcodeproj到FastDev'
90
+ FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')
44
91
 
45
- Dir.chdir('FastDev')
92
+ if File.exist?('Spec.xcworkspace')
93
+ puts '删除FastDev/Spec.xcworkspace'
94
+ FileUtils.rm_rf('Spec.xcworkspace')
95
+ end
96
+ puts '拷贝Spec.xcworkspace到FastDev'
97
+ FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')
98
+
99
+ if File.exist?(@vs_framework_dir)
100
+ unless @no_download_libs
101
+ puts "删除FastDev/#{@vs_framework_dir}"
102
+ FileUtils.rm_rf(@vs_framework_dir)
103
+ puts "创建目录FastDev/#{@vs_framework_dir}"
104
+ Dir.mkdir(@vs_framework_dir)
105
+ end
106
+ else
107
+ puts "创建目录FastDev/#{@vs_framework_dir}"
108
+ Dir.mkdir(@vs_framework_dir)
109
+ end
110
+ end
46
111
 
47
- if File.exist?('Spec.xcodeproj')
48
- puts '删除FastDev/Spec.xcodeproj'
49
- FileUtils.rm_rf('Spec.xcodeproj')
50
- end
112
+ def ajust_project
113
+ exclude_framework_names = [] #排除在外的静态库
114
+ @project_kept_names.each do |name|
115
+ exclude_framework_names << name + ".framework"
116
+ end
51
117
 
52
- if File.exist?('Spec.xcworkspace')
53
- puts '删除FastDev/Spec.xcworkspace'
54
- FileUtils.rm_rf('Spec.xcworkspace')
55
- end
118
+ vs_framework_paths = [] #所有静态库路径
119
+ @vs_project_names.each do |name|
120
+ vs_framework_paths << name + ".framework"
121
+ end
122
+ project_path = 'Spec.xcodeproj'
123
+ project = Xcodeproj::Project.open(project_path)
56
124
 
57
- if File.exist?('VSBizFrameworks')
58
- puts '删除FastDev/VSBizFrameworks'
59
- FileUtils.rm_rf('VSBizFrameworks')
60
- end
125
+ puts '更改Spec.xcodeproj的main group的引用路径'
126
+ project.main_group.set_source_tree('SOURCE_ROOT')
127
+ project.main_group.set_path('../Spec')
61
128
 
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
129
 
80
- puts "工作空间包含的VSBiz业务模块:#{biz_framework_name}"
81
- puts '下载业务模块静态库'
82
- Dir.chdir('VSBizFrameworks')
130
+ puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
131
+ # 修改info.plist,pch,entitlements的引用路径
132
+ project.targets.each do |target|
133
+ target.build_configurations.each do |config|
134
+ if config.build_settings.has_key?('INFOPLIST_FILE')
135
+ info_plist_config = config.build_settings['INFOPLIST_FILE']
136
+
137
+ info_plist_config = "../Spec/" + info_plist_config
138
+ config.build_settings['INFOPLIST_FILE'] = info_plist_config
139
+ end
140
+ if config.build_settings.has_key?('GCC_PREFIX_HEADER')
141
+ pch_config = config.build_settings['GCC_PREFIX_HEADER']
142
+ pch_config = "../Spec/" + pch_config
143
+ config.build_settings['GCC_PREFIX_HEADER'] = pch_config
144
+ end
145
+ if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
146
+ entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
147
+ entitlements_config = "../Spec/" + entitlements_config
148
+ config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
149
+ end
150
+ end
151
+ end
152
+
153
+ puts 'FRAMEWORK_SEARCH_PATHS新增路径'
154
+ project.build_configuration_list.build_configurations.each do |config|
155
+ if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
156
+ paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
157
+ if paths.is_a?(String)
158
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths, @vs_framework_dir]
159
+ else
160
+ config.build_settings['FRAMEWORK_SEARCH_PATHS'] << @vs_framework_dir
161
+ end
162
+ end
163
+ end
164
+
165
+ puts '修改静态库库的引用'
166
+ project.files.each do |file_ref|
167
+ if file_ref.last_known_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.name) && !exclude_framework_names.include?(file_ref.name)
168
+ file_ref.set_source_tree("SOURCE_ROOT")
169
+ file_ref.set_path(@vs_framework_dir + "/" + file_ref.name)
170
+ elsif file_ref.explicit_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.path) && !exclude_framework_names.include?(file_ref.path)
171
+ file_ref.set_source_tree("SOURCE_ROOT")
172
+ file_ref.name = file_ref.path
173
+ file_ref.set_path(@vs_framework_dir + "/" + file_ref.path)
174
+ end
175
+ end
176
+
177
+ puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
178
+ project.targets.each do |target|
179
+ target.shell_script_build_phases.each do |phase|
180
+ if phase.name == 'Copy Modular Resources'
181
+ phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
182
+ end
183
+ end
184
+ end
185
+ project.save
186
+
187
+ puts '生成新的workspace'
188
+ workspace_xml = <<XML
189
+ <?xml version="1.0" encoding="UTF-8"?>
190
+ <Workspace
191
+ version = "1.0">
192
+ </Workspace>
193
+ XML
194
+
83
195
 
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
196
+ workspace = Xcodeproj::Workspace.from_s(workspace_xml)
197
+ spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
198
+ workspace << spec_file_ref
199
+
200
+ @project_kept_names.each do |each|
201
+ fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
202
+ workspace << fileRef
203
+ end
204
+
205
+ pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
206
+ workspace << pods_file_ref
207
+
208
+ workspace_path = "Spec.xcworkspace"
209
+ workspace.save_as(workspace_path)
210
+
211
+
212
+ end
213
+
214
+ # 输出静态库版本信息
215
+ def print_version_info
90
216
  begin
91
- f.write(open(url) do |f1| f1.read end)
92
- rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
93
- puts $!
217
+ open('http://192.168.33.79:8000/lib/latest_framework_info?app_id=Spec') do |f|
218
+ puts "静态库版本信息: " + f.read
219
+ end
220
+ rescue StandardError, Timeout::Error, SystemCallError, Errno::ECONNREFUSED
221
+ puts "获取静态库版本信息失败。"
94
222
  end
223
+ end
95
224
 
225
+ def parse_vs_project_names
226
+ # 分析xcworkspace文件,查找VS开头的工程名字
227
+ names = []
228
+ tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
229
+ tmp_workspace.file_references.each do |file_ref|
230
+ match = /VS[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
231
+ if match != nil
232
+ name = match[0]
233
+ names << name
234
+ end
235
+ end
236
+ return names
96
237
  end
97
- end
98
238
 
99
- puts '解压静态库'
239
+ # 下载静态库
240
+ def download_libs
241
+ @vs_project_names.each do |name|
242
+ puts '下载:' + name
243
+ File.open("#{@vs_framework_dir}/#{name}.framework.zip", 'wb') do |f|
244
+ framework_name = "#{name}.framework"
245
+ url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
246
+ begin
247
+ f.write(open(url) do |f1|
248
+ f1.read
249
+ end)
250
+ rescue StandardError, Timeout::Error, SystemCallError, Errno::ECONNREFUSED
251
+ puts $!
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+ #解压静态库
258
+ def unzip_libs
259
+ puts '解压静态库'
260
+ Dir.chdir(@vs_framework_dir)
100
261
  # 调用shell解压更简单,ruby不好写解压
101
- system `
262
+ system `
102
263
  zip_names=$(ls)
103
264
  for name in $zip_names
104
265
  do
@@ -106,111 +267,44 @@ do
106
267
  rm $name
107
268
  done
108
269
  `
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
270
+ Dir.chdir('..')
151
271
  end
152
- end
153
272
 
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
273
+ def say_after_done
274
+ puts 'FastDev完成。关闭旧的Spec.xcworkspace,打开FastDev/Spec.xcworkspace文件开始开发。'
163
275
  end
164
276
  end
165
277
 
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)
278
+ dev_opts = {
279
+ keep:[],
280
+ no_download_lib:false ,
281
+ sync:false,
282
+ help:false
283
+ }
284
+
285
+ option_parser = OptionParser.new do |opts|
286
+ opts.banner = "哈哈哈哈哈"
287
+ opts.on('-k', '--keep [projects]', '需要保留的工程') do |projects|
288
+ if projects
289
+ dev_opts[:keep] = projects.split(" ")
290
+ end
175
291
  end
176
- end
177
292
 
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
293
+ opts.on('-n', '--no-download-lib', '不需要下载库') do
294
+ dev_opts[:no_download_lib] = true
184
295
  end
185
- end
186
- project.save
187
296
 
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)
297
+ opts.on('-h', '--help', '显示帮助文档') do
298
+ puts usage
299
+ exit 1
300
+ end
198
301
 
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")
302
+ opts.on('-s', '--sync', '同步Spec工程改动') do
303
+ dev_opts[:sync] = true
304
+ end
305
+ end.parse!
306
+ puts dev_opts
307
+ vfastdev = VFastDev.new(dev_opts)
203
308
 
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
309
 
213
- workspace_path = "Spec.xcworkspace"
214
- workspace.save_as(workspace_path)
215
310
 
216
- puts'FastDev完成。打开FastDev/Spec.xcworkspace文件开始开发。'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vfastdev
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sen.Mao