podfileDep 1.1.4 → 2.0.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/CHANGELOG.md +11 -1
- data/lib/cocoapods_plugin.rb +44 -0
- data/lib/old/podfileDep.rb +1408 -0
- data/lib/podfileDep/check/dep.rb +183 -0
- data/lib/podfileDep/check/import.rb +159 -0
- data/lib/podfileDep/check/item.rb +11 -0
- data/lib/podfileDep/check/module.rb +178 -0
- data/lib/podfileDep/check/xcodeproj.rb +310 -0
- data/lib/podfileDep/constants.rb +13 -0
- data/lib/podfileDep/indirect/indirect.rb +37 -0
- data/lib/podfileDep/modify/modify_code.rb +52 -0
- data/lib/podfileDep/podfilelock.rb +17 -0
- data/lib/podfileDep/reference/project.rb +72 -0
- data/lib/podfileDep/reference/unused.rb +141 -0
- data/lib/podfileDep/version.rb +1 -1
- data/lib/podfileDep/yaml/yaml_dep.rb +449 -0
- data/lib/podfileDep.rb +14 -816
- data/podfileDep.gemspec +6 -5
- metadata +50 -10
- data/Gemfile.lock +0 -19
- data/sig/podfileDep.rbs +0 -4
@@ -0,0 +1,449 @@
|
|
1
|
+
require_relative '../version'
|
2
|
+
require_relative '../constants'
|
3
|
+
require_relative '../check/xcodeproj'
|
4
|
+
|
5
|
+
module Pod
|
6
|
+
|
7
|
+
class YamlRely
|
8
|
+
attr_reader :pod, :subspecs, :version, :git, :tag, :branch, :podspec, :configurations, :path, :inhibit_warnings, :source, :binary
|
9
|
+
def initialize(module_name, pod, subspecs, path, podspec, version, git, tag, branch, configurations, inhibit_warnings, source, binary)
|
10
|
+
@module_name = module_name
|
11
|
+
@pod = pod
|
12
|
+
@subspecs = subspecs
|
13
|
+
@path = path
|
14
|
+
@podspec = podspec
|
15
|
+
@version = version
|
16
|
+
@git = git
|
17
|
+
@tag = tag
|
18
|
+
@branch = branch
|
19
|
+
@configurations = configurations
|
20
|
+
@inhibit_warnings = inhibit_warnings
|
21
|
+
@source = source
|
22
|
+
@binary = binary
|
23
|
+
end
|
24
|
+
|
25
|
+
def option
|
26
|
+
result = {:configurations => self.configurations, :inhibit_warnings => self.inhibit_warnings, :subspecs => self.subspecs}
|
27
|
+
if self.path #路径依赖
|
28
|
+
result[:path] = self.path
|
29
|
+
elsif self.podspec #podspec引用
|
30
|
+
result[:podspec] = self.podspec
|
31
|
+
elsif self.version #版本号依赖
|
32
|
+
result[:source] = self.source
|
33
|
+
elsif self.git #git仓库引用
|
34
|
+
result[:git] = self.git
|
35
|
+
if self.tag #tag引用
|
36
|
+
result[:tag] = self.tag
|
37
|
+
else #分支引用 或着未指定分支 也按分支引用
|
38
|
+
result[:branch] = self.branch
|
39
|
+
end
|
40
|
+
end
|
41
|
+
result
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
class YamlRelies
|
46
|
+
|
47
|
+
def self.analysis_yaml(podfile, old)
|
48
|
+
|
49
|
+
# 获取targets列表
|
50
|
+
project_manager = XCProject::XcodeprojManager.share_manager
|
51
|
+
|
52
|
+
targets = project_manager.get_app_targets
|
53
|
+
|
54
|
+
podfile_local_yaml = Constants::PODFILE_LOCAL_YAML
|
55
|
+
podfile_module_yaml = Constants::PODFILE_MODULE_YAML
|
56
|
+
podfile_third_party_yaml = Constants::PODFILE_THIRD_PARTY_YAML
|
57
|
+
|
58
|
+
# 检查参数
|
59
|
+
self.check_param(targets)
|
60
|
+
|
61
|
+
# 生成YAML文件
|
62
|
+
self.generate_local_yaml(podfile_local_yaml)
|
63
|
+
self.generate_module_yaml(podfile_module_yaml, "# 企业内部组件")
|
64
|
+
self.generate_module_yaml(podfile_third_party_yaml, "# 第三方维护组件")
|
65
|
+
|
66
|
+
# 读取yaml依赖
|
67
|
+
yaml_dependencies = {}
|
68
|
+
self.read_yaml_dependencies(podfile_third_party_yaml,false ,yaml_dependencies)
|
69
|
+
self.read_yaml_dependencies(podfile_module_yaml,false ,yaml_dependencies)
|
70
|
+
self.read_yaml_dependencies(podfile_local_yaml,true ,yaml_dependencies)
|
71
|
+
|
72
|
+
# 打印依赖
|
73
|
+
self.print_dependencies(yaml_dependencies)
|
74
|
+
|
75
|
+
# 为所有target生成依赖
|
76
|
+
targets_dependencies = {}
|
77
|
+
self.update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
|
78
|
+
|
79
|
+
# 兼容老方式
|
80
|
+
if old
|
81
|
+
return targets_dependencies
|
82
|
+
end
|
83
|
+
|
84
|
+
# 存储所有依赖
|
85
|
+
self.store_dependencies(targets_dependencies, podfile)
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.store_dependencies(targets, podfile)
|
90
|
+
# 存储所有的依赖
|
91
|
+
targets.each { |name, dependencies|
|
92
|
+
podfile.target name do
|
93
|
+
podfile.use_frameworks!
|
94
|
+
dependencies.each { |dependency|
|
95
|
+
if dependency.version
|
96
|
+
podfile.pod dependency.pod, dependency.version, dependency.option
|
97
|
+
else
|
98
|
+
podfile.pod dependency.pod, dependency.option
|
99
|
+
end
|
100
|
+
}
|
101
|
+
end
|
102
|
+
}
|
103
|
+
targets
|
104
|
+
end
|
105
|
+
|
106
|
+
# 检查方法调用的参数
|
107
|
+
def self.check_param(targets)
|
108
|
+
msg = "❌ 参数需要填写target名字, 参数类型是字符串格式的数组。例如[\"test1\", \"test2\"]"
|
109
|
+
unless targets.class == Array
|
110
|
+
puts msg
|
111
|
+
exit!
|
112
|
+
end
|
113
|
+
|
114
|
+
targets.each { |target|
|
115
|
+
unless target.class == String
|
116
|
+
puts msg
|
117
|
+
exit!
|
118
|
+
end
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
# 校验yaml文件写法是否正确
|
123
|
+
def self.yaml_content(yaml_name)
|
124
|
+
unless File.exist?(yaml_name)
|
125
|
+
puts "文件不存在:"+yaml_name
|
126
|
+
return nil
|
127
|
+
end
|
128
|
+
|
129
|
+
begin
|
130
|
+
yaml_content = YAML.load_file(yaml_name)
|
131
|
+
rescue Exception => e
|
132
|
+
puts e
|
133
|
+
puts yaml_name+'文件解析异常, 请检查 ⬆️'
|
134
|
+
exit!
|
135
|
+
end
|
136
|
+
|
137
|
+
prefix_message = "解析:"+yaml_name + "=> "
|
138
|
+
unless yaml_content.class == Hash
|
139
|
+
puts "#{prefix_message}共0个依赖(文件不是keyValue形式)"
|
140
|
+
return nil
|
141
|
+
end
|
142
|
+
|
143
|
+
unless yaml_content.key?('PODS')
|
144
|
+
puts "#{prefix_message}共0个依赖(文件内的key[PODS]不存在)"
|
145
|
+
return nil
|
146
|
+
end
|
147
|
+
|
148
|
+
unless yaml_content['PODS'].class == Array
|
149
|
+
puts "#{prefix_message}共0个依赖(文件配置的依赖PODS下边不是数组或数组为空)"
|
150
|
+
return nil
|
151
|
+
end
|
152
|
+
|
153
|
+
podfile_local_yaml = Constants::PODFILE_LOCAL_YAML
|
154
|
+
if yaml_name != podfile_local_yaml and (not yaml_content['SOURCE'] or yaml_content['SOURCE'].class != String)
|
155
|
+
puts "#{yaml_name}的SOURCE字段必须是字符串且不为空"
|
156
|
+
exit!
|
157
|
+
end
|
158
|
+
|
159
|
+
if yaml_name != podfile_local_yaml and (not yaml_content['BINARY_SOURCE'] or yaml_content['BINARY_SOURCE'].class != String)
|
160
|
+
puts "#{yaml_name}的BINARY_SOURCE字段必须是字符串且不为空"
|
161
|
+
exit!
|
162
|
+
end
|
163
|
+
|
164
|
+
return yaml_content
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
# 读取yaml依赖
|
169
|
+
def self.read_yaml_dependencies(yaml_name, can_cover, yaml_dependencies)
|
170
|
+
|
171
|
+
# 检查写法
|
172
|
+
yaml_content = self.yaml_content(yaml_name)
|
173
|
+
|
174
|
+
unless yaml_content
|
175
|
+
return
|
176
|
+
end
|
177
|
+
|
178
|
+
# 读取默认源码source
|
179
|
+
default_source_source = nil
|
180
|
+
if yaml_content.key?('SOURCE') and yaml_content['SOURCE'].class == String
|
181
|
+
default_source_source = yaml_content['SOURCE']
|
182
|
+
end
|
183
|
+
|
184
|
+
# 读取默认二进制source
|
185
|
+
default_binary_source = nil
|
186
|
+
if yaml_content.key?('BINARY_SOURCE') and yaml_content['BINARY_SOURCE'].class == String
|
187
|
+
default_binary_source = yaml_content['BINARY_SOURCE']
|
188
|
+
end
|
189
|
+
|
190
|
+
# 依赖列表
|
191
|
+
dependencies_pods = yaml_content['PODS']
|
192
|
+
puts "解析:#{yaml_name} => 共#{dependencies_pods.size.to_s}个依赖"
|
193
|
+
|
194
|
+
# 当前yaml文件的组件名字 用来校验本文件内是否重复
|
195
|
+
dependencies_name = []
|
196
|
+
|
197
|
+
# 遍历依赖库列表
|
198
|
+
dependencies_pods.each { |dependency|
|
199
|
+
|
200
|
+
# 不支持提醒
|
201
|
+
available_keys = %w[module pod subspecs path podspec version git tag branch configurations inhibit_warnings source binary]
|
202
|
+
dependency.each_key { |key|
|
203
|
+
unless available_keys.include?(key)
|
204
|
+
gem_name = "yaml_relies"
|
205
|
+
puts "❌ #{yaml_name}: 当前#{gem_name}版本(#{Yaml_relies::VERSION})不支持字段#{key}"
|
206
|
+
puts "请检查对应字段或尝试执行如下命令升级"
|
207
|
+
puts "gem uninstall #{gem_name} && gem install #{gem_name}"
|
208
|
+
exit!
|
209
|
+
end
|
210
|
+
}
|
211
|
+
|
212
|
+
# 校验字段
|
213
|
+
unless dependency['pod']
|
214
|
+
puts "#{yaml_name}: pod 字段(组件名字)必须存在,请检查:"
|
215
|
+
exit!
|
216
|
+
end
|
217
|
+
|
218
|
+
unless dependency['path'] or dependency['podspec'] or dependency['version'] or dependency['git'] or dependency['tag'] or dependency['branch']
|
219
|
+
puts "#{yaml_name} - #{dependency['pod']}: path/podspec/version/git/tag/branch 字段需至少有一个存在,请检查"
|
220
|
+
exit!
|
221
|
+
end
|
222
|
+
|
223
|
+
if dependency['tag'] and dependency['branch'] and not dependency['git']
|
224
|
+
puts "#{yaml_name} - #{dependency['pod']}: 请为此组件配置git字段"
|
225
|
+
exit!
|
226
|
+
end
|
227
|
+
|
228
|
+
# 检查数据类型
|
229
|
+
if dependency['configurations'] and dependency['configurations'].class != Array
|
230
|
+
puts "#{yaml_name} - #{dependency['pod']} - #{dependency['configurations']}: configurations字段必须是数组,例如:['Debug','Release']"
|
231
|
+
exit!
|
232
|
+
end
|
233
|
+
|
234
|
+
if dependency['subspecs'] and dependency['subspecs'].class != Array
|
235
|
+
puts "#{yaml_name} - #{dependency['pod']} - #{dependency['subspecs']}: subspecs字段必须是数组,例如:['A','B','C']"
|
236
|
+
exit!
|
237
|
+
end
|
238
|
+
|
239
|
+
# 校验自身文件重复
|
240
|
+
if dependencies_name.include?(dependency['pod'])
|
241
|
+
puts "❌ 发现#{yaml_name}内重复组件:#{dependency['pod']},请检查并删除重复依赖:"
|
242
|
+
exit!
|
243
|
+
else
|
244
|
+
dependencies_name << dependency['pod']
|
245
|
+
end
|
246
|
+
# 校验和总的依赖的重复
|
247
|
+
repeats = []
|
248
|
+
if yaml_dependencies.key?(dependency['pod']) and not can_cover
|
249
|
+
repeats << dependency['pod']
|
250
|
+
end
|
251
|
+
if repeats.size > 0
|
252
|
+
puts "❌ 发现重复组件如下,请检查并删除重复依赖:"
|
253
|
+
puts repeats
|
254
|
+
exit!
|
255
|
+
end
|
256
|
+
|
257
|
+
# 警告
|
258
|
+
podfile_local_yaml = Constants::PODFILE_LOCAL_YAML
|
259
|
+
if dependency['path'] and not can_cover
|
260
|
+
puts "⚠️ 组件#{dependency['pod']}使用path依赖方式应该写在#{podfile_local_yaml}"
|
261
|
+
end
|
262
|
+
if dependency['podspec'] and not can_cover
|
263
|
+
puts "⚠️ 组件#{dependency['pod']}使用podspec依赖方式应该写在#{podfile_local_yaml}"
|
264
|
+
end
|
265
|
+
|
266
|
+
# 记录覆盖
|
267
|
+
if yaml_dependencies.key?(dependency['pod']) and can_cover
|
268
|
+
puts "✅ #{dependency['pod']}被#{yaml_name}覆盖"
|
269
|
+
end
|
270
|
+
|
271
|
+
# 默认值
|
272
|
+
source = dependency['source']
|
273
|
+
unless source
|
274
|
+
source = dependency['binary'] ? default_binary_source : default_source_source
|
275
|
+
end
|
276
|
+
inhibit_warnings = dependency['inhibit_warnings'] ? !!dependency['inhibit_warnings'] : false
|
277
|
+
binary = dependency['binary'] ? !!dependency['binary'] : true
|
278
|
+
version = (dependency['path'] or dependency['podspec']) ? nil :dependency['version']
|
279
|
+
|
280
|
+
# 生成依赖对象
|
281
|
+
dependency = YamlRely.new(module_name = dependency['module'],
|
282
|
+
pod = dependency['pod'],
|
283
|
+
subspecs = dependency['subspecs'],
|
284
|
+
path = dependency['path'],
|
285
|
+
podspec = dependency['podspec'],
|
286
|
+
version = version,
|
287
|
+
git = dependency['git'],
|
288
|
+
tag = dependency['tag'],
|
289
|
+
branch = dependency['branch'],
|
290
|
+
configurations = dependency['configurations'],
|
291
|
+
inhibit_warnings = inhibit_warnings,
|
292
|
+
source = source,
|
293
|
+
binary = binary)
|
294
|
+
yaml_dependencies[dependency.pod] = dependency
|
295
|
+
}
|
296
|
+
|
297
|
+
end
|
298
|
+
|
299
|
+
# 生成传进来的target的依赖库列表
|
300
|
+
def self.update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
|
301
|
+
temp_array = []
|
302
|
+
yaml_dependencies.each_value { |value|
|
303
|
+
temp_array << value
|
304
|
+
}
|
305
|
+
|
306
|
+
targets.each { |target|
|
307
|
+
targets_dependencies[target] = temp_array
|
308
|
+
}
|
309
|
+
end
|
310
|
+
|
311
|
+
def self.print_dependencies(yaml_dependencies)
|
312
|
+
puts "➡️ 解析依赖总数共计:#{yaml_dependencies.size}个\n\n"
|
313
|
+
puts '⬇️ 打印依赖'
|
314
|
+
yaml_dependencies.each_value { |dependency|
|
315
|
+
puts_result = "pod '#{dependency.pod}'"
|
316
|
+
|
317
|
+
if dependency.path #路径引用
|
318
|
+
puts_result += ", :path => '#{dependency.path}'"
|
319
|
+
elsif dependency.podspec #podspec引用
|
320
|
+
puts_result += ", :podspec => '#{dependency.podspec}'"
|
321
|
+
elsif dependency.version #版本号引用
|
322
|
+
puts_result += ", '#{dependency.version.to_s}'"
|
323
|
+
elsif dependency.git #git仓库引用
|
324
|
+
puts_result += ", :git => '#{dependency.git}'"
|
325
|
+
if dependency.tag
|
326
|
+
puts_result += ", :tag => '#{dependency.tag}'"
|
327
|
+
elsif dependency.branch
|
328
|
+
puts_result += ", :branch => '#{dependency.branch}'"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
if dependency.configurations
|
333
|
+
puts_result += ", :configurations => ['#{dependency.configurations.join("','")}']"
|
334
|
+
end
|
335
|
+
if dependency.subspecs
|
336
|
+
puts_result += ", :subspecs => ['#{dependency.subspecs.join("','")}']"
|
337
|
+
end
|
338
|
+
if dependency.inhibit_warnings
|
339
|
+
puts_result += ", :inhibit_warnings => true"
|
340
|
+
end
|
341
|
+
if dependency.version and dependency.source
|
342
|
+
puts_result += ", :source => '#{dependency.source}'"
|
343
|
+
end
|
344
|
+
|
345
|
+
puts puts_result
|
346
|
+
}
|
347
|
+
puts "⬆️ 打印完毕"
|
348
|
+
end
|
349
|
+
|
350
|
+
# 是否需要快速编译
|
351
|
+
def self.quick_build
|
352
|
+
|
353
|
+
podfile_local_yaml = Constants::PODFILE_LOCAL_YAML
|
354
|
+
|
355
|
+
unless File.exist?(podfile_local_yaml)
|
356
|
+
puts "文件不存在:"+podfile_local_yaml
|
357
|
+
return false
|
358
|
+
end
|
359
|
+
|
360
|
+
begin
|
361
|
+
yaml_content = YAML.load_file(podfile_local_yaml)
|
362
|
+
rescue Exception => e
|
363
|
+
puts e
|
364
|
+
return false
|
365
|
+
end
|
366
|
+
|
367
|
+
yaml_content["QUICK"] == true ? true : false
|
368
|
+
end
|
369
|
+
|
370
|
+
# 生成local文件
|
371
|
+
def self.generate_local_yaml(podfile_local_yaml)
|
372
|
+
if File.exist?(podfile_local_yaml)
|
373
|
+
return
|
374
|
+
end
|
375
|
+
puts "生成#{podfile_local_yaml}文件"
|
376
|
+
|
377
|
+
content = ""
|
378
|
+
content = content + "# 1、本依赖配置文件优先级最高, 用来覆盖其他两个依赖的yaml文件中的组件。 尝试打开以下注释, 修改对应字段, 然后执行pod install\n"
|
379
|
+
content = content + "# 2、PODS下边的配置是数组形式, 如果有多个就写多个\n"
|
380
|
+
content = content + "# 3、本文件加入到忽略文件中\n\n"
|
381
|
+
|
382
|
+
# content = content + "# QUICK字段如果为true, 则表示会自动解析所有组件的依赖, 并删除不被使用的依赖库, 以达到开发时快速编译的目的\n"
|
383
|
+
# content = content + "QUICK: false\n\n"
|
384
|
+
|
385
|
+
content = content + "PODS:\n"
|
386
|
+
|
387
|
+
content = content + "\n"
|
388
|
+
|
389
|
+
content = content + "# - module: Masonry\n"
|
390
|
+
content = content + "# pod: Masonry\n"
|
391
|
+
content = content + "# subspecs: null\n"
|
392
|
+
content = content + "# path: ~/MasonryCodePath\n"
|
393
|
+
|
394
|
+
content = content + "\n"
|
395
|
+
|
396
|
+
content = content + "# - module: MJExtension\n"
|
397
|
+
content = content + "# pod: MJExtension\n"
|
398
|
+
content = content + "# subspecs: null\n"
|
399
|
+
content = content + "# path: ~/MJExtensionCodePath\n"
|
400
|
+
|
401
|
+
File.open(podfile_local_yaml, 'w') { |file|
|
402
|
+
file.write(content)
|
403
|
+
}
|
404
|
+
end
|
405
|
+
|
406
|
+
# 生成其他的yaml文件
|
407
|
+
def self.generate_module_yaml(yaml_name, prefix)
|
408
|
+
if File.exist?(yaml_name)
|
409
|
+
return
|
410
|
+
end
|
411
|
+
puts "生成#{yaml_name}文件"
|
412
|
+
|
413
|
+
content = ""
|
414
|
+
content = content + prefix
|
415
|
+
content = content + "\n"
|
416
|
+
content = content + "# 1、优先级:path > podspec > version > tag > branch)\n"
|
417
|
+
content = content + "# 2、path字段就是直接从对应的路径读取依赖\n"
|
418
|
+
content = content + "# 3、podspec字段就是直接从对应的路径读取podspec文件加载依赖\n"
|
419
|
+
content = content + "# 4、当version不为空时,会取source字段的repo获取组件,如果source字段为空,那么就取文件顶部配置的默认SOURCE\n"
|
420
|
+
content = content + "# 5、当tag字段或branch字段不为空时,会取git字段的地址获取代码\n"
|
421
|
+
content = content + "\n"
|
422
|
+
content = content + "# 如果 source = null && binary = false 则source默认使用这个\n"
|
423
|
+
content = content + "SOURCE: 这里替换成源码的source\n"
|
424
|
+
content = content + "\n"
|
425
|
+
content = content + "# 如果 source = null && binary = true 则source默认使用这个\n"
|
426
|
+
content = content + "BINARY_SOURCE: 这里替换成二进制的source\n"
|
427
|
+
content = content + "\n"
|
428
|
+
content = content + "PODS:\n"
|
429
|
+
content = content + "\n"
|
430
|
+
content = content + "# - module: XXX\n"
|
431
|
+
content = content + "# pod: XXX\n"
|
432
|
+
content = content + "# subspecs: null\n"
|
433
|
+
content = content + "# podspec: null\n"
|
434
|
+
content = content + "# version: 1.0.0\n"
|
435
|
+
content = content + "# git: null\n"
|
436
|
+
content = content + "# tag: null\n"
|
437
|
+
content = content + "# branch: null\n"
|
438
|
+
content = content + "# configurations: null\n"
|
439
|
+
content = content + "# inhibit_warnings: true\n"
|
440
|
+
content = content + "# source: null\n"
|
441
|
+
content = content + "# binary: true\n"
|
442
|
+
|
443
|
+
File.open(yaml_name, 'w') { |file|
|
444
|
+
file.write(content)
|
445
|
+
}
|
446
|
+
end
|
447
|
+
|
448
|
+
end
|
449
|
+
end
|