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.
- checksums.yaml +4 -4
- data/bin/vfastdev +233 -166
- data/lib/vfastdev.rb +256 -162
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6490015cfc3cdeb16f4e23027b9f545964e01fd
|
4
|
+
data.tar.gz: aa8676c4068503cd1ebe5a41ec85d38f1fb7136e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 "[
|
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
|
35
|
-
4.VSBaseModule/VSPublic
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
58
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
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 '
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
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 "
|
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
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
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
|
-
|
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
|
-
|
186
|
-
|
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
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
210
|
-
|
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
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
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
|
18
|
+
\033[1mvfastdev\033[0m 会在工程根目录生成FastDev目录,按照保留指定的模块作为工程引入,剩余模块将会通过下载develop最新的静态库快照引入Spec工程。
|
15
19
|
通过这样可以在一定程度上提高编译速度。目前只支持x86_64的静态库,意味着只在64位模拟器上面生效。
|
16
20
|
|
17
|
-
\033[
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
58
|
-
|
59
|
-
|
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
|
81
|
-
|
82
|
-
|
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
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
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
|
-
|
155
|
-
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
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
|
-
|
179
|
-
|
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
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
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
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
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文件开始开发。'
|