vfastdev 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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