podfileDep 2.0.1 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31ed880f0e6108b180135bac80ed10c8ebeb2fc1957c1cfb63427de66fd5cab5
4
- data.tar.gz: deec07c419b895a77ce4a0a40a81cb9c7abc9baa2270d8dc1cd453a1f9f5e8cc
3
+ metadata.gz: d685c50ac91b5bc9100a895fe300df13c8d1f4ca29eec6cfd0d36c1e74edaf08
4
+ data.tar.gz: 60365a5983ce3810316f3b72b061e38717dfbd1f4ae34838f395a90659c4f755
5
5
  SHA512:
6
- metadata.gz: c0855321340787feefabfc1a3308d2a249d7f558038b966ee0fb8f8529f79c01efbb89066680a55c4de941c886dd9d164e4064f7eede9aa2266140ed2361607d
7
- data.tar.gz: b423ce91ec6fa2f982b7b993478453cba175b0932a0fecb98fd32c6f1dbf39f0dada8ee2152c044cb1c7c9650c1347248c46a2acb50ad52828c9c9c3f28ddcb2
6
+ metadata.gz: a3dc46f47e0a2f3fdff945c663396ae3f1727dd2a62f5c6e2c939be6d528f2045469c9bb73d75d6b27be317ec9aee34a1e6e7fe9509875d868df603579a9327d
7
+ data.tar.gz: b0bcbd47cf7ecad5c0f19a597fb531708b2b31f4da06b2bdc885985901dac4b0276bb4f3ca85f5810f404feb7ff786ec2bdd2ac402f850ee48221e14b0aae1f1
data/CHANGELOG.md CHANGED
@@ -32,4 +32,12 @@
32
32
 
33
33
  ## [2.0.1] - 2023-6-19
34
34
 
35
- - 打印间接依赖
35
+ - 打印间接依赖
36
+
37
+ ## [2.1.0] - 2023-6-19
38
+
39
+ - QUICKBUILD字段支持移除不被引用的依赖
40
+ -
41
+ ## [2.1.1] - 2023-6-19
42
+
43
+ - 移除不被引用的依赖在pod install时加速
@@ -35,7 +35,11 @@ module CocoapodsPlugin
35
35
  Unused::UnusedManager.check_unused
36
36
 
37
37
  # 添加yaml到引用和忽略
38
- Project::ProjectManager.yaml_deal
38
+ Project::ProjectManager.yaml_reference
39
+
40
+ # 添加yaml到资源文件
41
+ Project::ProjectManager.yaml_resource
42
+
39
43
  end
40
44
 
41
45
  # Pod::HooksManager.register('podfileDep', :post_integrate) do |context|
@@ -75,7 +75,18 @@ module XCProject
75
75
 
76
76
  end
77
77
 
78
- #获取主APP target列表
78
+ #获取主APP target列表 包含扩展
79
+ def get_shell_targets
80
+ results = []
81
+ project = self.get_shell_project
82
+ targets = project.root_object.targets
83
+ targets.each do |target|
84
+ results << target.name
85
+ end
86
+ results
87
+ end
88
+
89
+ #获取主APP target列表 不包含扩展
79
90
  def get_app_targets
80
91
  results = []
81
92
  project = self.get_shell_project
@@ -1,10 +1,56 @@
1
1
  require_relative '../check/xcodeproj'
2
2
  require_relative '../constants'
3
+
3
4
  module Project
4
5
  class ProjectManager
6
+ def self.yaml_resource
7
+ puts "yaml资源文件添加"
8
+ project_manager = XCProject::XcodeprojManager.share_manager
9
+ targets = project_manager.get_app_targets
10
+ targets.each do |target_name|
11
+ target_supporting = "Pods-#{target_name}"
12
+ resource_shell = "Pods-#{target_name}-resources.sh"
13
+ resource_shell_path = "#{Dir.pwd}/Pods/Target Support Files/#{target_supporting}/#{resource_shell}"
14
+ self.yaml_resource_file(resource_shell_path)
15
+ end
16
+ end
17
+
18
+ def self.yaml_resource_file(file_path)
19
+ unless File.exist?(file_path)
20
+ return
21
+ end
22
+
23
+ # 读内容
24
+ content = ""
25
+ line_array = IO.readlines(file_path)
26
+ line_array.each_with_index { |line, index|
27
+ content += line
28
+ next_line = index<line_array.size ? line_array[index+1] : ""
29
+ if line.include?("if [[ \"$CONFIGURATION\"") and next_line.include?("install_resource")
30
+ if File.exist?(Constants::PODFILE_LOCAL_YAML)
31
+ content += " install_resource \"${SRCROOT}/#{Constants::PODFILE_LOCAL_YAML}\"\n"
32
+ end
33
+
34
+ if File.exist?(Constants::PODFILE_MODULE_YAML)
35
+ content += " install_resource \"${SRCROOT}/#{Constants::PODFILE_MODULE_YAML}\"\n"
36
+ end
37
+
38
+ if File.exist?(Constants::PODFILE_THIRD_PARTY_YAML)
39
+ content += " install_resource \"${SRCROOT}/#{Constants::PODFILE_THIRD_PARTY_YAML}\"\n"
40
+ end
41
+ end
42
+ }
43
+
44
+ # 写文件
45
+ File.open(file_path, 'w') { |file|
46
+ file.write(content)
47
+ }
48
+ end
49
+
5
50
 
6
- def self.yaml_deal
7
- puts "yaml文件处理"
51
+ # 将yaml文件加入引用
52
+ def self.yaml_reference
53
+ puts "yaml文件引用添加"
8
54
  self.add_yaml
9
55
  self.add_local_yaml_ignore
10
56
  end
@@ -0,0 +1,129 @@
1
+ require_relative '../check/xcodeproj'
2
+ module Pod
3
+ # 移除未使用的组件
4
+ class Uninstall
5
+
6
+ def uninstall(uninstall_list)
7
+ project_manager = XCProject::XcodeprojManager.share_manager
8
+
9
+ # 删除引用
10
+ pods_project = project_manager.get_pods_project
11
+ uninstall_from_project(uninstall_list, pods_project)
12
+ pods_project.save
13
+
14
+ # 删除资源文件等
15
+ uninstall_from_frameworks(uninstall_list, project_manager)
16
+
17
+ end
18
+
19
+ def uninstall_from_frameworks(module_list, project_manager)
20
+ targets = project_manager.get_shell_targets
21
+ targets.each do |target_name|
22
+
23
+ target_supporting = "Pods-#{target_name}"
24
+ resource_shell = "Pods-#{target_name}-resources.sh"
25
+ resource_shell_path = "#{Dir.pwd}/Pods/Target Support Files/#{target_supporting}/#{resource_shell}"
26
+ uninstall_from_file(resource_shell_path, module_list, "install_resource")
27
+
28
+ # 删除frameworks
29
+ frameworks_shell = "Pods-#{target_name}-frameworks.sh"
30
+ frameworks_shell_path = "#{Dir.pwd}/Pods/Target Support Files/#{target_supporting}/#{frameworks_shell}"
31
+ uninstall_from_file(frameworks_shell_path, module_list, "install_framework")
32
+
33
+ # 删除配置
34
+ # 根据通配符找到真实路径
35
+ config_patton = "Pods-#{target_name}.*.xcconfig"
36
+ config_patton_path = "#{Dir.pwd}/Pods/Target Support Files/#{target_supporting}/#{config_patton}"
37
+ Dir[config_patton_path].select{|config_real_path|
38
+ uninstall_for_config(config_real_path, module_list)
39
+ }
40
+ end
41
+
42
+ end
43
+ def uninstall_for_config(file_path, module_list)
44
+ find_array = []
45
+ module_list.each do |module_name|
46
+ module_name = module_name.gsub("+", "_")
47
+ module_name = module_name.gsub("-", "_")
48
+
49
+ find_array << " -framework \"#{module_name}\""
50
+ find_array << " \"${PODS_CONFIGURATION_BUILD_DIR}/#{module_name}/#{module_name}.framework/Headers\""
51
+ find_array << " \"${PODS_CONFIGURATION_BUILD_DIR}/#{module_name}\""
52
+ find_array << " \"${PODS_ROOT}/#{module_name}\""
53
+ find_array << " \"${PODS_XCFRAMEWORKS_BUILD_DIR}/#{module_name}\""
54
+
55
+ end
56
+
57
+ replace = ""
58
+ replace_str(file_path, find_array, replace)
59
+ end
60
+ def uninstall_from_file(file_path, module_list , keyword)
61
+ unless File.exist?(file_path)
62
+ return
63
+ end
64
+
65
+ # 读内容
66
+ content = ""
67
+ line_array = IO.readlines(file_path)
68
+ line_array.each_with_index { |line, index|
69
+ if line.include?(keyword)
70
+ contain = false
71
+ module_list.each{|module_name|
72
+ if line.include?("/#{module_name}/")
73
+ contain = true
74
+ end
75
+ }
76
+
77
+ if contain
78
+ content += " echo ''\n"
79
+ next
80
+ end
81
+
82
+ end
83
+ content += line
84
+ }
85
+
86
+ # 写文件
87
+ File.open(file_path, 'w') { |file|
88
+ file.write(content)
89
+ }
90
+ end
91
+
92
+ def uninstall_from_project(module_list, pods_project)
93
+ pods_project.main_group.children.each {|child|
94
+ if child.display_name != "Pods" and child.display_name != "Development Pods"
95
+ next
96
+ end
97
+ child.children.reject! {|sun|
98
+ module_list.include?(sun.display_name)
99
+ }
100
+ }
101
+
102
+ pods_project.main_group.children.reject! do |child|
103
+ (child.class == Array and child.children.size == 0)
104
+ end
105
+
106
+ pods_project.targets.reject! do |child|
107
+ module_list.include?(child.display_name)
108
+ end
109
+ end
110
+
111
+ # 替换文件内的字符串
112
+ def replace_str(file_path, find_array, replace)
113
+ unless File.exist?(file_path)
114
+ return
115
+ end
116
+ FileUtils.chmod("+w", file_path)
117
+ content = File.read(file_path)
118
+
119
+ find_array.each do |find|
120
+ content = content.gsub(find, replace)
121
+ end
122
+
123
+ File.open(file_path, "w") do |file|
124
+ file.puts content
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -1,5 +1,7 @@
1
1
  require_relative '../check/xcodeproj'
2
2
  require_relative '../podfilelock'
3
+ require_relative 'uninstall'
4
+ require_relative '../yaml/yaml_dep'
3
5
 
4
6
  module Unused
5
7
  class UnusedManager
@@ -24,8 +26,14 @@ module Unused
24
26
  return
25
27
  end
26
28
 
29
+ # 是否需要快速编译
30
+ quick_build = Pod::YamlManager.share_manager.quick_build
31
+
32
+ uninstaller = Pod::Uninstall.new
33
+
27
34
  # 未使用的列表
28
35
  unused_list = []
36
+ uninstall_list = []
29
37
  installed_modules.each do |module_item|
30
38
 
31
39
  module_name = module_item.keys[0]
@@ -38,17 +46,28 @@ module Unused
38
46
  end
39
47
 
40
48
  if not used and not unused_list.include?(real_module_name)
41
- unused_list << real_module_name
49
+ local_contain = Pod::YamlManager.share_manager.local_yaml_contain(real_module_name)
50
+ if quick_build and not local_contain
51
+ uninstall_list << real_module_name
52
+ else
53
+ unused_list << real_module_name
54
+ end
42
55
  end
43
56
  end
44
57
 
45
58
  if unused_list.size >0
46
- puts unused_list
47
- puts "以上组件未被任何地方引用"
59
+ # puts unused_list
60
+ puts "未被任何地方引用的组件:#{unused_list}"
61
+ end
62
+
63
+ if uninstall_list.size > 0
64
+ # puts uninstall_list
65
+ puts "被移除组件:#{uninstall_list}"
66
+ uninstaller.uninstall(uninstall_list)
48
67
  end
49
68
 
50
69
  duration = ((Time.now.to_f * 1000).to_i - start)*0.001
51
- puts "未被引用的组件检查完毕! 共检查#{installed_modules.size.to_s}个组件 耗时:#{duration.round(2)}秒"
70
+ puts "未被引用的组件处理完毕! 共检查#{installed_modules.size.to_s}个组件 耗时:#{duration.round(2)}秒"
52
71
  end
53
72
 
54
73
  # 获取某个库是否在壳工程内被使用
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PodfileDep
4
- VERSION = "2.0.1"
4
+ VERSION = "2.1.1"
5
5
  end
@@ -42,9 +42,27 @@ module Pod
42
42
  end
43
43
 
44
44
  end
45
- class YamlRelies
45
+ class YamlManager
46
46
 
47
- def self.analysis_yaml(podfile, old)
47
+ # 缓存某个的依赖库
48
+ # {{"module_nameA":["module_nameA", module_nameB]},}
49
+ attr_accessor :local_yaml_dependencies
50
+
51
+ def initialize
52
+ @local_yaml_dependencies = {}
53
+ end
54
+
55
+ # 单例方法
56
+ @@instance = YamlManager.new
57
+
58
+ # 获取单例
59
+ def self.share_manager
60
+ @@instance
61
+ end
62
+
63
+ private_class_method :new
64
+
65
+ def analysis_yaml(podfile, old)
48
66
 
49
67
  # 获取targets列表
50
68
  project_manager = XCProject::XcodeprojManager.share_manager
@@ -56,25 +74,26 @@ module Pod
56
74
  podfile_third_party_yaml = Constants::PODFILE_THIRD_PARTY_YAML
57
75
 
58
76
  # 检查参数
59
- self.check_param(targets)
77
+ check_param(targets)
60
78
 
61
79
  # 生成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, "# 第三方维护组件")
80
+ generate_local_yaml(podfile_local_yaml)
81
+ generate_module_yaml(podfile_module_yaml, "# 企业内部组件")
82
+ generate_module_yaml(podfile_third_party_yaml, "# 第三方维护组件")
65
83
 
66
84
  # 读取yaml依赖
67
85
  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)
86
+ read_yaml_dependencies(podfile_third_party_yaml,false ,yaml_dependencies)
87
+ local_yaml_dependencies = yaml_dependencies #这里记录下
88
+ read_yaml_dependencies(podfile_module_yaml,false ,yaml_dependencies)
89
+ read_yaml_dependencies(podfile_local_yaml,true ,yaml_dependencies)
71
90
 
72
91
  # 打印依赖
73
- self.print_dependencies(yaml_dependencies)
92
+ print_dependencies(yaml_dependencies)
74
93
 
75
94
  # 为所有target生成依赖
76
95
  targets_dependencies = {}
77
- self.update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
96
+ update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
78
97
 
79
98
  # 兼容老方式
80
99
  if old
@@ -82,11 +101,11 @@ module Pod
82
101
  end
83
102
 
84
103
  # 存储所有依赖
85
- self.store_dependencies(targets_dependencies, podfile)
104
+ store_dependencies(targets_dependencies, podfile)
86
105
 
87
106
  end
88
107
 
89
- def self.store_dependencies(targets, podfile)
108
+ def store_dependencies(targets, podfile)
90
109
  # 存储所有的依赖
91
110
  targets.each { |name, dependencies|
92
111
  podfile.target name do
@@ -104,7 +123,7 @@ module Pod
104
123
  end
105
124
 
106
125
  # 检查方法调用的参数
107
- def self.check_param(targets)
126
+ def check_param(targets)
108
127
  msg = "❌ 参数需要填写target名字, 参数类型是字符串格式的数组。例如[\"test1\", \"test2\"]"
109
128
  unless targets.class == Array
110
129
  puts msg
@@ -120,7 +139,7 @@ module Pod
120
139
  end
121
140
 
122
141
  # 校验yaml文件写法是否正确
123
- def self.yaml_content(yaml_name)
142
+ def yaml_content(yaml_name)
124
143
  unless File.exist?(yaml_name)
125
144
  puts "文件不存在:"+yaml_name
126
145
  return nil
@@ -166,10 +185,10 @@ module Pod
166
185
  end
167
186
 
168
187
  # 读取yaml依赖
169
- def self.read_yaml_dependencies(yaml_name, can_cover, yaml_dependencies)
188
+ def read_yaml_dependencies(yaml_name, can_cover, yaml_dependencies)
170
189
 
171
190
  # 检查写法
172
- yaml_content = self.yaml_content(yaml_name)
191
+ yaml_content = yaml_content(yaml_name)
173
192
 
174
193
  unless yaml_content
175
194
  return
@@ -202,7 +221,7 @@ module Pod
202
221
  dependency.each_key { |key|
203
222
  unless available_keys.include?(key)
204
223
  gem_name = "yaml_relies"
205
- puts "❌ #{yaml_name}: 当前#{gem_name}版本(#{Yaml_relies::VERSION})不支持字段#{key}"
224
+ puts "❌ #{yaml_name}: 当前#{gem_name}版本(#{PodfileDep::VERSION})不支持字段#{key}"
206
225
  puts "请检查对应字段或尝试执行如下命令升级"
207
226
  puts "gem uninstall #{gem_name} && gem install #{gem_name}"
208
227
  exit!
@@ -297,7 +316,7 @@ module Pod
297
316
  end
298
317
 
299
318
  # 生成传进来的target的依赖库列表
300
- def self.update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
319
+ def update_target_dependencies(targets, yaml_dependencies, targets_dependencies)
301
320
  temp_array = []
302
321
  yaml_dependencies.each_value { |value|
303
322
  temp_array << value
@@ -308,7 +327,7 @@ module Pod
308
327
  }
309
328
  end
310
329
 
311
- def self.print_dependencies(yaml_dependencies)
330
+ def print_dependencies(yaml_dependencies)
312
331
  puts "➡️ 解析依赖总数共计:#{yaml_dependencies.size}个\n\n"
313
332
  puts '⬇️ 打印依赖'
314
333
  yaml_dependencies.each_value { |dependency|
@@ -347,8 +366,12 @@ module Pod
347
366
  puts "⬆️ 打印完毕"
348
367
  end
349
368
 
369
+ def local_yaml_contain(module_name)
370
+ return local_yaml_dependencies.keys.include?(module_name)
371
+ end
372
+
350
373
  # 是否需要快速编译
351
- def self.quick_build
374
+ def quick_build
352
375
 
353
376
  podfile_local_yaml = Constants::PODFILE_LOCAL_YAML
354
377
 
@@ -364,11 +387,11 @@ module Pod
364
387
  return false
365
388
  end
366
389
 
367
- yaml_content["QUICK"] == true ? true : false
390
+ yaml_content["QUICKBUILD"] == true ? true : false
368
391
  end
369
392
 
370
393
  # 生成local文件
371
- def self.generate_local_yaml(podfile_local_yaml)
394
+ def generate_local_yaml(podfile_local_yaml)
372
395
  if File.exist?(podfile_local_yaml)
373
396
  return
374
397
  end
@@ -379,8 +402,8 @@ module Pod
379
402
  content = content + "# 2、PODS下边的配置是数组形式, 如果有多个就写多个\n"
380
403
  content = content + "# 3、本文件加入到忽略文件中\n\n"
381
404
 
382
- # content = content + "# QUICK字段如果为true, 则表示会自动解析所有组件的依赖, 并删除不被使用的依赖库, 以达到开发时快速编译的目的\n"
383
- # content = content + "QUICK: false\n\n"
405
+ # content = content + "# QUICKBUILD字段如果为true, 则表示会自动解析所有组件的依赖, 并删除不被使用的依赖库, 以达到开发时快速编译的目的\n"
406
+ # content = content + "QUICKBUILD: false\n\n"
384
407
 
385
408
  content = content + "PODS:\n"
386
409
 
@@ -404,7 +427,7 @@ module Pod
404
427
  end
405
428
 
406
429
  # 生成其他的yaml文件
407
- def self.generate_module_yaml(yaml_name, prefix)
430
+ def generate_module_yaml(yaml_name, prefix)
408
431
  if File.exist?(yaml_name)
409
432
  return
410
433
  end
data/lib/podfileDep.rb CHANGED
@@ -9,7 +9,7 @@ module Pod
9
9
  plugin("podfileDep")
10
10
 
11
11
  # 解析依赖
12
- Pod::YamlRelies.analysis_yaml(self, false)
12
+ Pod::YamlManager.share_manager.analysis_yaml(self, false)
13
13
 
14
14
  end
15
15
  end
@@ -18,7 +18,7 @@ end
18
18
  # 兼容旧的方式
19
19
  module PodfileDep
20
20
  def PodfileDep.setup(targets)
21
- res = Pod::YamlRelies.analysis_yaml(nil, true)
21
+ res = Pod::YamlManager.share_manager.analysis_yaml(nil, true)
22
22
  warn "\n⚠️ [PodfileDep.setup方法已过期],请使用新的方式, 参考:https://gitee.com/sourceiOS/podfileDepDemo/blob/master/Podfile\n"
23
23
  res
24
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: podfileDep
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 王帅朋
@@ -63,6 +63,7 @@ files:
63
63
  - lib/podfileDep/modify/modify_code.rb
64
64
  - lib/podfileDep/podfilelock.rb
65
65
  - lib/podfileDep/reference/project.rb
66
+ - lib/podfileDep/reference/uninstall.rb
66
67
  - lib/podfileDep/reference/unused.rb
67
68
  - lib/podfileDep/version.rb
68
69
  - lib/podfileDep/yaml/yaml_dep.rb