podfileDep 2.4.0 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bf6db57ebcfb8e33ea60332704f396c50385bf2985cbc0756a51306f9875fa0
4
- data.tar.gz: 06b8d0f2e4f832833c41ec97e7f767c557aeff2ad7f990f7fe40b5fe3d88fee0
3
+ metadata.gz: 90b91a2988e18202add645f9dfb02623d018854b09ed5b3e1c7cfe52ca463fba
4
+ data.tar.gz: 1a7f61c0e7d35282204b055e3580bf4d78894fc6525a3b1f5d59bfea7d4f95d4
5
5
  SHA512:
6
- metadata.gz: 2d884c5e32c44f00740e57fbd4fadb0c901b5aede86f3b6f79f4cf739c80ef8550ecbcb8d16877b2047f3aa07e3805c89abc4113c6c4b1ded84b388fe3bec09d
7
- data.tar.gz: 2320c89b84cad270a46325a80f8909aba737f6fc477ffc19eadc009847357163dab889cbfbdc4d3d0c49ccfb6b4ebeaa6bbc3d93f2bf88c7d2809a247838550a
6
+ metadata.gz: b6d370629f905be0397b4e76f2c2198b800a8e7868882d1436ed3a8a9aa19c57d3ed0a775ce1947e9e8f345cc6f2a018fc9d30c4264d966b87da80bca97f5bed
7
+ data.tar.gz: dccea04f95d9d9d06db5a22424ebf02f360a465b18f2e4a07aa05af32e3bbc2423dc34b429b360acdab81c5abdd1a878ba2578ee3b32f1c867f52dbdae9969d8
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
1
  ## [Released]
2
+
3
+ ### [2.4.1] - 2023-7-29
4
+ - 依赖库关系检查特殊问题修复
5
+
2
6
  ### [2.4.0] - 2023-7-29
3
7
  - 依赖库关系检查
4
8
 
@@ -1,7 +1,6 @@
1
1
  require 'cocoapods'
2
2
  require_relative 'podfileDep/command/quick'
3
3
  require_relative 'podfileDep/check/project'
4
- require_relative 'podfileDep/check/dep'
5
4
  require_relative 'podfileDep/check/podspec'
6
5
  require_relative 'podfileDep/modify/modify_code'
7
6
  require_relative 'podfileDep/reference/project'
@@ -28,8 +27,6 @@ module CocoapodsPlugin
28
27
  # end
29
28
 
30
29
  Pod::HooksManager.register('podfileDep', :post_install) do |context|
31
- # 检查依赖库
32
- # Dep::DepChecker.dep_check
33
30
 
34
31
  project = Xcodeproj::XCodeProject.new
35
32
 
@@ -1,11 +1,204 @@
1
1
 
2
- class ImportItem
3
- attr_reader :import_name, :module_item, :file_name, :line_index, :pod
4
- def initialize(import_name, module_item, file_name, line_index, pod)
5
- @import_name = import_name
6
- @module_item = module_item
7
- @file_name = file_name
8
- @line_index = line_index
9
- @pod = pod
2
+ module Xcodeproj
3
+ class ImportItem
4
+ attr_accessor :import_name
5
+ attr_accessor :module_name
6
+ attr_accessor :file_path
7
+ attr_accessor :import_file_name
8
+ attr_accessor :line_index
9
+ attr_accessor :belong_module
10
+ def initialize
11
+ @import_name = nil
12
+ @module_name = nil
13
+ @file_path = nil
14
+ @import_file_name = nil
15
+ @line_index = nil
16
+ @belong_module = nil
17
+ end
18
+
19
+ end
20
+
21
+ class ModuleItem
22
+
23
+ public
24
+ # 组名名
25
+ attr_accessor :module_name
26
+
27
+ # 组件路径
28
+ attr_accessor :module_path
29
+
30
+ # podspec路径
31
+ attr_accessor :podspec_path
32
+
33
+ # 组件目录的所有被引用的文件数组
34
+ attr_accessor :header_files
35
+
36
+ # 组件目录的所有被引用的文件数组
37
+ attr_accessor :source_files
38
+
39
+ # 是否是开发模块
40
+ attr_accessor :is_development_module
41
+
42
+ # [ImportItem]
43
+ attr_accessor :import_items
44
+
45
+ # [ImportItem]
46
+ attr_accessor :absolute_import_items
47
+
48
+ # [String]
49
+ attr_accessor :frameworks
50
+
51
+ def initialize(module_name)
52
+ @module_name = module_name
53
+ @module_path = nil
54
+ @podspec_path = nil
55
+ @header_files = {}
56
+ @source_files = {}
57
+ @import_items = []
58
+ @absolute_import_items = []
59
+ @is_development_module = false
60
+ @frameworks = []
61
+ end
62
+
63
+ # 生成 import <XX/YY.h>的信息
64
+ # 生成 include <XX/YY.h>的信息
65
+ def init_absolute_import_info
66
+ source_files.each_value do |source_file_path|
67
+ if File.directory?(source_file_path)
68
+ next
69
+ end
70
+
71
+ line_array = IO.readlines(source_file_path)
72
+ line_array.each_with_index { |line, line_index|
73
+ line = line.gsub(" ", "")
74
+
75
+ # 处理特殊情况
76
+ if line.start_with?("#import\"NBSAppAgent.h\"")
77
+ line = "#import<tingyunApp/NBSAppAgent.h>"
78
+ end
79
+
80
+ if not line.start_with?("#import<") and not line.start_with?("#include<")
81
+ next
82
+ end
83
+
84
+ if line.start_with?("@implementation")
85
+ break
86
+ end
87
+
88
+ # 前一行的内容 这里不是检测,则不需要
89
+ pre_line = ""
90
+
91
+ import_item = other_module_import(line, source_file_path, line_index, @module_name, pre_line)
92
+ if import_item
93
+ absolute_import_items << import_item
94
+ end
95
+ }
96
+ end
97
+
98
+ absolute_import_items
99
+ end
100
+
101
+ # 生成 import "XXX.h"的信息
102
+ def init_import_info
103
+ source_files.each_value do |source_file_path|
104
+ if File.directory?(source_file_path)
105
+ next
106
+ end
107
+
108
+ line_array = IO.readlines(source_file_path)
109
+ line_array.each_with_index { |line, line_index|
110
+ line = line.gsub(" ", "")
111
+
112
+ unless line.start_with?("#import")
113
+ next
114
+ end
115
+
116
+ if line.start_with?("@implementation")
117
+ break
118
+ end
119
+
120
+ # 前一行的内容
121
+ pre_index = line_index-1 < 0 ? 0 : line_index-1
122
+ pre_line = line_array[pre_index]
123
+
124
+ if line.start_with?("#import\"") #本组件
125
+ import_item = own_module_import(line, source_file_path, line_index, @module_name, pre_line)
126
+ if import_item
127
+ import_items << import_item
128
+ end
129
+ elsif line.start_with?("#import<") #其他组件
130
+
131
+ end
132
+
133
+ }
134
+ end
135
+
136
+ import_items
137
+ end
138
+
139
+ private
140
+ # 生成自己模块的import item
141
+ # @param line 以 import" 开头
142
+ def own_module_import(line, file_path, line_index, module_name, pre_line)
143
+ line_split_array = line.split("\"")
144
+ if line_split_array.size <= 1
145
+ return nil
146
+ end
147
+
148
+ import_content = "#{line_split_array[0]}\"#{line_split_array[1]}\"" # import"XXX.h" 或import"XXX.AAA.h" 防止后边有其他内容
149
+
150
+ # 特殊处理
151
+ if import_content == "#import\"NBSAppAgent.h\""
152
+ return nil
153
+ end
154
+
155
+ pre_line = pre_line.gsub(" ", "").gsub("\n", "")
156
+ if pre_line.start_with?("#if") or pre_line == "#else"
157
+ return nil
158
+ end
159
+
160
+ import_file_name = import_content
161
+ import_file_name = import_file_name.gsub("#import\"", "")
162
+ import_file_name = import_file_name.gsub("\"", "") # 变成 XX.h
163
+
164
+
165
+ import_item = ImportItem.new # (import_name, module_name, file_name, line_index, podfile)
166
+ import_item.import_name = import_content.gsub("#import\"", "#import \"")
167
+ import_item.module_name = module_name
168
+ import_item.file_path = file_path
169
+ import_item.import_file_name = import_file_name
170
+ import_item.line_index = line_index + 1
171
+
172
+ import_item
173
+ end
174
+
175
+
176
+ def other_module_import(line, file_path, line_index, module_name, pre_line)
177
+ line = line.gsub("\n","")
178
+ line_split_array = line.split("/") #import<XX/YY.h> 或 #import<XX/YY/ZZ.h>
179
+ if line_split_array.size <= 1
180
+ return nil
181
+ end
182
+
183
+ pre_line = pre_line.gsub(" ", "").gsub("\n", "")
184
+ if pre_line.start_with?("#if") or pre_line == "#else"
185
+ return nil
186
+ end
187
+
188
+ import_file_name = line_split_array[line_split_array.size-1].gsub(">", "")
189
+ belong_module = line_split_array[0].gsub("#import<", "").gsub("#include<", "")
190
+ import_name = line.gsub("#import<", "#import <").gsub("#include<", "#include <")
191
+
192
+ import_item = ImportItem.new # (import_name, module_name, file_name, line_index, podfile)
193
+ import_item.import_name = import_name
194
+ import_item.module_name = module_name
195
+ import_item.file_path = file_path
196
+ import_item.import_file_name = import_file_name
197
+ import_item.line_index = line_index + 1
198
+ import_item.belong_module = belong_module
199
+
200
+ import_item
201
+
202
+ end
10
203
  end
11
204
  end
@@ -112,6 +112,11 @@ module Xcodeproj
112
112
  next
113
113
  end
114
114
 
115
+ # 过滤未被安装的依赖库
116
+ unless module_is_installed(import_item.belong_module)
117
+ next
118
+ end
119
+
115
120
  result_dic[import_item.belong_module] = import_item
116
121
  end
117
122
  result_dic.keys
@@ -153,7 +158,14 @@ module Xcodeproj
153
158
  result
154
159
  end
155
160
 
156
-
161
+ # 判断某个库是否被安装
162
+ def module_is_installed(module_name)
163
+ all = project.lock_content["SPEC CHECKSUMS"]
164
+ unless all
165
+ return false
166
+ end
167
+ !!all[module_name]
168
+ end
157
169
  # 系统级的依赖库
158
170
  # @return [String]
159
171
  def system_modules
@@ -1,211 +1,10 @@
1
1
  require 'pathname'
2
2
  require 'colored2'
3
3
  require_relative 'util'
4
+ require_relative 'item'
4
5
 
5
6
  module Xcodeproj
6
7
 
7
- class ImportItem
8
- attr_accessor :import_name
9
- attr_accessor :module_name
10
- attr_accessor :file_path
11
- attr_accessor :import_file_name
12
- attr_accessor :line_index
13
- attr_accessor :belong_module
14
- def initialize
15
- @import_name = nil
16
- @module_name = nil
17
- @file_path = nil
18
- @import_file_name = nil
19
- @line_index = nil
20
- @belong_module = nil
21
- end
22
-
23
- end
24
-
25
- class ModuleItem
26
-
27
- public
28
- # 组名名
29
- attr_accessor :module_name
30
-
31
- # 组件路径
32
- attr_accessor :module_path
33
-
34
- # podspec路径
35
- attr_accessor :podspec_path
36
-
37
- # 组件目录的所有被引用的文件数组
38
- attr_accessor :header_files
39
-
40
- # 组件目录的所有被引用的文件数组
41
- attr_accessor :source_files
42
-
43
- # 是否是开发模块
44
- attr_accessor :is_development_module
45
-
46
- # [ImportItem]
47
- attr_accessor :import_items
48
-
49
- # [ImportItem]
50
- attr_accessor :absolute_import_items
51
-
52
- # [String]
53
- attr_accessor :frameworks
54
-
55
- def initialize(module_name)
56
- @module_name = module_name
57
- @module_path = nil
58
- @podspec_path = nil
59
- @header_files = {}
60
- @source_files = {}
61
- @import_items = []
62
- @absolute_import_items = []
63
- @is_development_module = false
64
- @frameworks = []
65
- end
66
-
67
- # 生成 import <XX/YY.h>的信息
68
- # 生成 include <XX/YY.h>的信息
69
- def init_absolute_import_info
70
- source_files.each_value do |source_file_path|
71
- if File.directory?(source_file_path)
72
- next
73
- end
74
-
75
- line_array = IO.readlines(source_file_path)
76
- line_array.each_with_index { |line, line_index|
77
- line = line.gsub(" ", "")
78
-
79
- # 处理特殊情况
80
- if line.start_with?("#import\"NBSAppAgent.h\"")
81
- line = "#import<tingyunApp/NBSAppAgent.h>"
82
- end
83
-
84
- if not line.start_with?("#import<") and not line.start_with?("#include<")
85
- next
86
- end
87
-
88
- if line.start_with?("@implementation")
89
- break
90
- end
91
-
92
- # 前一行的内容 这里不是检测,则不需要
93
- pre_line = ""
94
-
95
- import_item = other_module_import(line, source_file_path, line_index, @module_name, pre_line)
96
- if import_item
97
- absolute_import_items << import_item
98
- end
99
- }
100
- end
101
-
102
- absolute_import_items
103
- end
104
-
105
- # 生成 import "XXX.h"的信息
106
- def init_import_info
107
- source_files.each_value do |source_file_path|
108
- if File.directory?(source_file_path)
109
- next
110
- end
111
-
112
- line_array = IO.readlines(source_file_path)
113
- line_array.each_with_index { |line, line_index|
114
- line = line.gsub(" ", "")
115
-
116
- unless line.start_with?("#import")
117
- next
118
- end
119
-
120
- if line.start_with?("@implementation")
121
- break
122
- end
123
-
124
- # 前一行的内容
125
- pre_index = line_index-1 < 0 ? 0 : line_index-1
126
- pre_line = line_array[pre_index]
127
-
128
- if line.start_with?("#import\"") #本组件
129
- import_item = own_module_import(line, source_file_path, line_index, @module_name, pre_line)
130
- if import_item
131
- import_items << import_item
132
- end
133
- elsif line.start_with?("#import<") #其他组件
134
-
135
- end
136
-
137
- }
138
- end
139
-
140
- import_items
141
- end
142
-
143
- private
144
- # 生成自己模块的import item
145
- # @param line 以 import" 开头
146
- def own_module_import(line, file_path, line_index, module_name, pre_line)
147
- line_split_array = line.split("\"")
148
- if line_split_array.size <= 1
149
- return nil
150
- end
151
-
152
- import_content = "#{line_split_array[0]}\"#{line_split_array[1]}\"" # import"XXX.h" 或import"XXX.AAA.h" 防止后边有其他内容
153
-
154
- # 特殊处理
155
- if import_content == "#import\"NBSAppAgent.h\""
156
- return nil
157
- end
158
-
159
- pre_line = pre_line.gsub(" ", "").gsub("\n", "")
160
- if pre_line.start_with?("#if") or pre_line == "#else"
161
- return nil
162
- end
163
-
164
- import_file_name = import_content
165
- import_file_name = import_file_name.gsub("#import\"", "")
166
- import_file_name = import_file_name.gsub("\"", "") # 变成 XX.h
167
-
168
-
169
- import_item = ImportItem.new # (import_name, module_name, file_name, line_index, podfile)
170
- import_item.import_name = import_content.gsub("#import\"", "#import \"")
171
- import_item.module_name = module_name
172
- import_item.file_path = file_path
173
- import_item.import_file_name = import_file_name
174
- import_item.line_index = line_index + 1
175
-
176
- import_item
177
- end
178
-
179
-
180
- def other_module_import(line, file_path, line_index, module_name, pre_line)
181
- line = line.gsub("\n","")
182
- line_split_array = line.split("/") #import<XX/YY.h> 或 #import<XX/YY/ZZ.h>
183
- if line_split_array.size <= 1
184
- return nil
185
- end
186
-
187
- pre_line = pre_line.gsub(" ", "").gsub("\n", "")
188
- if pre_line.start_with?("#if") or pre_line == "#else"
189
- return nil
190
- end
191
-
192
- import_file_name = line_split_array[line_split_array.size-1].gsub(">", "")
193
- belong_module = line_split_array[0].gsub("#import<", "").gsub("#include<", "")
194
- import_name = line.gsub("#import<", "#import <").gsub("#include<", "#include <")
195
-
196
- import_item = ImportItem.new # (import_name, module_name, file_name, line_index, podfile)
197
- import_item.import_name = import_name
198
- import_item.module_name = module_name
199
- import_item.file_path = file_path
200
- import_item.import_file_name = import_file_name
201
- import_item.line_index = line_index + 1
202
- import_item.belong_module = belong_module
203
-
204
- import_item
205
-
206
- end
207
- end
208
-
209
8
  class XCodeProject
210
9
 
211
10
  # 壳工程xcodeproj对象
@@ -2,38 +2,6 @@ require 'xcodeproj'
2
2
  require 'pathname'
3
3
 
4
4
  module XCProject
5
- class ModuleItem
6
-
7
-
8
- def initialize(module_name, module_path)
9
- @module_name = module_name
10
- @module_path = module_path
11
- @podspec_path = nil
12
- @source_files = []
13
- end
14
-
15
- # 组件名
16
- attr_reader :module_name
17
-
18
- # 组件路径
19
- attr_reader :module_path
20
-
21
- # 组件目录的所有被引用的文件数组
22
- attr_reader :source_files
23
-
24
- # podspec路径
25
- attr_reader :podspec_path
26
-
27
- # 添加一个文件路径进去
28
- def add_source_file(source_file)
29
- self.source_files << source_file
30
- end
31
-
32
- def update_podspec_path(podspec_path)
33
- @podspec_path = podspec_path
34
- end
35
-
36
- end
37
5
 
38
6
  class XcodeprojManager
39
7
 
@@ -99,57 +67,6 @@ module XCProject
99
67
  results
100
68
  end
101
69
 
102
- # 获取壳工程的引用的文件列表
103
- # @return Hash
104
- def get_shell_module
105
- project = self.get_shell_project
106
-
107
- result_map = {}
108
- self.reference_shell_code_file(project.root_object.main_group, result_map)
109
- result_map
110
- end
111
-
112
- # 根据一个group获取其对应的引用代码文件和路径- 仅限壳工程
113
- @private
114
- def reference_shell_code_file(group, result_map)
115
- # 文件引用
116
- file_reference = Xcodeproj::Project::Object::PBXFileReference
117
-
118
- group.children.each {|child|
119
-
120
- if child.class != file_reference
121
- self.reference_shell_code_file(child, result_map)
122
- next
123
- end
124
-
125
- file_name = child.real_path.basename
126
- extend_name = file_name.extname
127
- if not extend_name == ".h" and
128
- not extend_name == ".m" and
129
- not extend_name == ".mm" and
130
- not extend_name == ".pch" and
131
- not extend_name == ".c" and
132
- not extend_name == ".cc" and
133
- not extend_name == ".hpp" and
134
- not extend_name == ".cpp"
135
- next
136
- end
137
-
138
- # 引用关系路径
139
- hierarchy_path_array = child.hierarchy_path.split("/")
140
- if hierarchy_path_array.size < 2
141
- next
142
- end
143
-
144
- module_name = hierarchy_path_array[1]
145
- module_item = result_map[module_name] ? result_map[module_name] : ModuleItem.new(module_name, child.real_path)
146
- module_item.add_source_file(child.real_path)
147
-
148
- result_map[module_name] = module_item
149
- }
150
- end
151
-
152
-
153
70
  # 获取Pods下project对象
154
71
  def get_pods_project
155
72
 
@@ -162,160 +79,5 @@ module XCProject
162
79
 
163
80
  end
164
81
 
165
- # 根据一个组件名获取其内部所有的framework名字 如果没有则返回自己
166
- def frameworks_with_module_name(module_name)
167
- if self.module_frameworks[module_name]
168
- return self.module_frameworks[module_name]
169
- end
170
-
171
- module_path = self.real_path_with_module_name(module_name)
172
- frameworks = [module_name]
173
- self.get_framework(module_path, frameworks)
174
- self.module_frameworks[module_name] = frameworks
175
- frameworks
176
- end
177
-
178
- # 递归查找路径下的framework名字
179
- @private
180
- def get_framework(path, frameworks)
181
-
182
- if File.directory?(path)
183
- Dir.foreach(path) { |fileName|
184
- child_path = "#{path}/#{fileName}"
185
- if File.directory?(child_path) and not fileName.start_with?(".")
186
- if fileName.end_with?(".framework") or fileName.end_with?(".xcframework")
187
- framework_name = fileName.gsub(".xcframework","").gsub(".framework","")
188
- unless frameworks.include?(framework_name)
189
- frameworks << framework_name
190
- end
191
- else
192
- self.get_framework(child_path, frameworks)
193
- end
194
- end
195
- }
196
- end
197
- frameworks
198
- end
199
-
200
- # 根据一个组件的名字,获取其绝对路径
201
- def real_path_with_module_name(module_name)
202
- project = self.get_pods_project
203
- project.main_group.children.each {|child|
204
- if child.name != "Development Pods" and child.name != "Pods"
205
- next
206
- end
207
-
208
- child.children.each {|sun|
209
- if sun.name == module_name
210
- real_path = sun.real_path
211
- return real_path
212
- end
213
- }
214
- }
215
- nil
216
- end
217
-
218
- # 获取本地依赖库
219
- # @return 数组 [ModuleItem]
220
- def get_development_module
221
- project = self.get_pods_project
222
- result_map = {}
223
- self.reference_file(project.main_group, result_map)
224
- result_map
225
- end
226
-
227
- # 根据一个group获取 其对应的引用文件和路径
228
- @private
229
- def reference_file(group, result_map)
230
- # 文件引用
231
- file_reference = Xcodeproj::Project::Object::PBXFileReference
232
-
233
- group.children.each {|child|
234
- if child.class == file_reference and child.name != "Podfile"
235
-
236
- # 引用关系路径
237
- hierarchy_path_array = child.hierarchy_path.split("/")
238
- if hierarchy_path_array.size >= 3
239
- module_name = hierarchy_path_array[2]
240
-
241
- module_item = result_map[module_name] ? result_map[module_name] : ModuleItem.new(module_name, child.real_path)
242
-
243
- file_name = child.real_path.basename
244
- extend_name = file_name.extname
245
- if extend_name == ".podspec" or extend_name == ".podspec.json"
246
- module_item.update_podspec_path(child.real_path)
247
- elsif extend_name == ".h" or extend_name == ".m" or
248
- extend_name == ".mm" or extend_name == ".pch" or
249
- extend_name == ".c" or extend_name == ".cc" or
250
- extend_name == ".cpp" or extend_name == ".hpp"
251
- module_item.add_source_file(child.real_path)
252
- end
253
-
254
- result_map[module_name] = module_item
255
- end
256
- # 无论加或着不加 都跳过
257
- next
258
- end
259
-
260
- if child.name == "Podfile" or
261
- child.name == "Frameworks" or
262
- child.name == "Pods" or
263
- child.name == "Products" or
264
- child.name == "Targets Support Files" or
265
- child.name == "Support Files"
266
- next
267
- end
268
-
269
- self.reference_file(child, result_map)
270
- }
271
- end
272
-
273
- # 获取已引用的所有库,仅包含头文件
274
- def get_installed_headers_module
275
- project = self.get_pods_project
276
-
277
- result_map = {}
278
- self.reference_header_file(project.main_group, result_map)
279
- result_map
280
- end
281
-
282
- # 获取引用的头文件
283
- @private
284
- def reference_header_file(group, result_map)
285
- # 文件引用
286
- file_reference = Xcodeproj::Project::Object::PBXFileReference
287
-
288
- group.children.each {|child|
289
- if child.class == file_reference
290
-
291
- # 引用关系路径
292
- hierarchy_path_array = child.hierarchy_path.split("/")
293
- if hierarchy_path_array.size >= 3
294
- module_name = hierarchy_path_array[2]
295
-
296
- module_item = result_map[module_name] ? result_map[module_name] : ModuleItem.new(module_name, child.real_path)
297
-
298
- file_name = child.real_path.basename
299
- if file_name.to_s.end_with?(".h") or file_name.to_s.end_with?(".hpp") or file_name.to_s.end_with?(".pch")
300
- module_item.add_source_file(child.real_path)
301
- end
302
- result_map[module_name] = module_item
303
- end
304
- # 无论加或着不加 都跳过
305
- next
306
- end
307
-
308
- if child.name == "Podfile" or
309
- child.name == "Frameworks" or
310
- child.name == "Products" or
311
- child.name == "Targets Support Files" or
312
- child.name == "Support Files"
313
- next
314
- end
315
-
316
- self.reference_header_file(child, result_map)
317
- }
318
- end
319
-
320
82
  end
321
83
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PodfileDep
4
- VERSION = "2.4.0"
4
+ VERSION = "2.4.1"
5
5
  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.4.0
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 王帅朋
@@ -65,10 +65,8 @@ files:
65
65
  - Rakefile
66
66
  - lib/cocoapods_plugin.rb
67
67
  - lib/podfileDep.rb
68
- - lib/podfileDep/check/dep.rb
69
68
  - lib/podfileDep/check/import.rb
70
69
  - lib/podfileDep/check/item.rb
71
- - lib/podfileDep/check/module.rb
72
70
  - lib/podfileDep/check/podspec.rb
73
71
  - lib/podfileDep/check/project.rb
74
72
  - lib/podfileDep/check/util.rb
@@ -1,183 +0,0 @@
1
- require 'pathname'
2
- require 'yaml'
3
- require_relative '../podfilelock'
4
- require_relative '../my_constants'
5
- require_relative 'module'
6
- require_relative 'item'
7
- require_relative 'xcodeproj'
8
-
9
- module Dep
10
- class DepChecker
11
-
12
- # 检查缺少的或着多的依赖
13
- def self.dep_check
14
- puts "\n依赖库关系检查中..."
15
- start = (Time.now.to_f * 1000).to_i
16
-
17
- podfile_lock_manager = PodfileLock::PodfileLockManager
18
- module_manager = ModuleModule::ModuleManager.share_instance
19
- project_manager = XCProject::XcodeprojManager.share_manager
20
-
21
- # podfile.lock的内容
22
- lock_content = podfile_lock_manager.podfile_lock_content
23
-
24
- # 获取需要检查的模块名和路径
25
- modules = project_manager.get_development_module
26
-
27
- # 获取所有已安装的依赖库
28
- installed_deps = module_manager.get_installed_deps(lock_content)
29
-
30
- # 计数
31
- check_count = 0
32
-
33
- # 遍历需要被检查的模块
34
- modules.each { |module_name, module_item|
35
-
36
- #组件的的真实依赖包括间接依赖 依据podfile.lock递归读取
37
- real_dependencies = module_manager.real_dependencies(module_name, lock_content)
38
-
39
- substart = (Time.now.to_f * 1000).to_i
40
- real_frameworks = self.module_frameworks(real_dependencies)
41
- puts "#{module_name}打点0:#{((Time.now.to_f * 1000).to_i - substart).to_s}毫秒\n"
42
- substart = (Time.now.to_f * 1000).to_i
43
-
44
- #podspec写的直接依赖
45
- podspec_dependencies = module_manager.podspec_dependencies(module_item.podspec_path)
46
-
47
- # 某个模块从代码文件里读取的真实需要的依赖库 #import <XX/XX.h>
48
- import_item_map = {}
49
- module_item.source_files.each { |source_file|
50
- self.update_import_item_map(source_file, module_name, import_item_map)
51
- check_count += 1
52
- }
53
-
54
- if import_item_map.size == 0 and real_dependencies.size == 0
55
- next
56
- end
57
-
58
- # real_dependencies指的是根据组件podspec的写法 解析出来的依赖库
59
- # import_item_map指的是根据代码文件解析出来的依赖库
60
- loss = []
61
- import_item_map.each_key {|key|
62
- if key != module_name
63
- did_loss = true
64
-
65
- real_frameworks.each { |dep, frameworks|
66
- frameworks.each {|framework|
67
- if key == framework
68
- did_loss = false
69
- break
70
- end
71
- }
72
- }
73
-
74
- if did_loss
75
- loss << "#{key}"
76
- end
77
-
78
- end
79
- }
80
-
81
- puts "#{module_name}打点1:#{((Time.now.to_f * 1000).to_i - substart).to_s}毫秒\n"
82
- substart = (Time.now.to_f * 1000).to_i
83
-
84
- unused = []
85
- real_frameworks.each { |dep, frameworks|
86
- use = false
87
- frameworks.each{|framework|
88
- if import_item_map.keys.include?(framework)
89
- use = true
90
- break
91
- end
92
- }
93
- if not use and podspec_dependencies.include?(dep)
94
- unused << "# s.dependency '#{dep}'"
95
- end
96
- }
97
-
98
- if loss.size >0
99
- puts "⚠️ [#{module_name}] 请到#{module_name}.podspec文件中添加缺少的依赖库, 如下:"
100
- puts loss
101
- puts "\n"
102
- end
103
-
104
- if unused.size >0
105
- puts "⚠️ [#{module_name}] 请到#{module_name}.podspec文件中移除未被引用的依赖库, 如下:"
106
- puts unused
107
- puts "\n"
108
- end
109
-
110
- puts "#{module_name}打点2:#{((Time.now.to_f * 1000).to_i - substart).to_s}毫秒\n"
111
- }
112
-
113
- duration = ((Time.now.to_f * 1000).to_i - start)*0.001
114
- puts "依赖库关系检查完毕! 共检查#{modules.size.to_s}个组件(#{check_count}个文件) 耗时:#{duration.round(2)}秒"
115
- end
116
-
117
- # 将某个库的所有依赖转化为其对应的frameworks
118
- def self.module_frameworks(dependencies)
119
- project_manager = XCProject::XcodeprojManager.share_manager
120
- result_map = {}
121
- dependencies.each do |dependency|
122
- frameworks = project_manager.frameworks_with_module_name(dependency)
123
- result_map[dependency] = frameworks
124
- end
125
- result_map
126
- end
127
-
128
- # 获取某个文件内对应类型的import <XX/XX>
129
- def self.update_import_item_map(file_path, module_name, import_item_map)
130
- if File.directory?(file_path)
131
- return
132
- end
133
-
134
- line_array = IO.readlines(file_path)
135
- line_array.each_with_index { |line, index|
136
- line = line.gsub(" ", "")
137
- if not line.start_with?("#import<") and not line.start_with?("#include<")
138
- next
139
- end
140
-
141
- line_split_array = line.split(">")
142
- if line_split_array.size == 0
143
- next
144
- end
145
-
146
- import_name = line_split_array[0]+">" # #import <XX/XX.h> 或者 #import <XX.h> 防止后边有其他的内容
147
- if not import_name.include?(".h") and not import_name.include?(".H")
148
- next
149
- end
150
- import_array = import_name.split("/")
151
- if line_split_array.size == 0
152
- next
153
- end
154
-
155
- pod = import_array[0].gsub("#import<", "").gsub("#include<", "")
156
- pod = pod.gsub(".h>", "")
157
- pod = pod.gsub(".H>", "")
158
-
159
- # 已经包含
160
- if import_item_map[pod]
161
- next
162
- end
163
-
164
- # 系统级依赖库
165
- if self.system_deps.include?(pod)
166
- next
167
- end
168
-
169
- file_name = File.basename(file_path)
170
- line_index = index+1
171
-
172
- import_item_map[pod] = ImportItem.new(import_name, module_name, file_name, line_index, pod)
173
-
174
- }
175
- end
176
-
177
- # 系统级的依赖库
178
- def self.system_deps
179
- return MyConstants::LIBLIBARYS + MyConstants::FRAMEWORKS
180
- end
181
-
182
- end
183
- end
@@ -1,178 +0,0 @@
1
- require 'pathname'
2
- require 'yaml'
3
- require 'cocoapods'
4
- require 'xcodeproj'
5
- require_relative '../my_constants'
6
-
7
- module ModuleModule
8
-
9
- class ModuleDepObject
10
- def initialize(module_name)
11
- @module_name = module_name
12
- @dependencies = []
13
- @dependencies_expanded = false
14
- end
15
-
16
- # 组件名
17
- attr_reader :module_name
18
-
19
- # 组件所引用的依赖库
20
- attr_reader :dependencies
21
-
22
- # 组件的依赖是否被全部展开
23
- attr_reader :dependencies_expanded
24
-
25
-
26
- # 添加一个依赖库
27
- def add_dependency(dependency)
28
- self.dependencies << dependency
29
- end
30
-
31
- def did_expanded
32
- @dependencies_expanded = true
33
- end
34
-
35
- end
36
-
37
- class ModuleManager
38
-
39
- # 缓存某个的依赖库
40
- # {{"module_nameA":ModuleDepObject,{"module_nameB":ModuleDepObject}
41
- attr_reader :all_module_dependencies
42
-
43
- def initialize
44
- @all_module_dependencies = {}
45
- end
46
- # 单例方法
47
- @@instance = ModuleManager.new
48
-
49
- # 获取单例
50
- def self.share_instance
51
- @@instance
52
- end
53
-
54
- private_class_method :new
55
-
56
- def real_dependencies(module_name, lock_content)
57
-
58
- lock_dependencies = lock_content["PODS"]
59
-
60
- module_dep = ModuleDepObject.new(module_name)
61
-
62
- # 可能是取的缓存 所以必须赋值
63
- module_dep = self.get_module_dep(lock_dependencies, module_dep)
64
-
65
- module_dep.dependencies
66
-
67
- end
68
-
69
- # 根据podfile.lock里内容递归获取某个库的依赖库
70
- @private
71
- def get_module_dep(lock_dependencies, module_dep)
72
-
73
- module_dep_cache = self.all_module_dependencies[module_dep.module_name]
74
- if module_dep_cache&.dependencies_expanded
75
- return module_dep_cache
76
- end
77
-
78
- # 找出当前组件的依赖
79
- lock_dependencies.each { |item|
80
-
81
- item_name= item
82
- if item.class == Hash
83
- item_name = item.keys[0]
84
- end
85
-
86
- item_name = item_name.split(" (")[0]
87
- item_name = item_name.split("/")[0] #解决子仓库的问题
88
-
89
- # 非当前组件
90
- if item_name != module_dep.module_name
91
- next
92
- end
93
-
94
- # 当前组件无其他依赖
95
- if item.class == String
96
- break
97
- end
98
-
99
- # 当前组件有其他依赖
100
- # item:{"A (99999)"=>["Masonry", "MJExtension"]
101
- item.each {|name, child_names|
102
- child_names.each { |child_name|
103
- child_name = child_name.split(" (")[0]
104
- child_name = child_name.split("/")[0] #解决子仓库的问题
105
-
106
- if item_name == child_name #解决item_name = AFNetworking child_name=AFNetworking/NSURLSession
107
- next
108
- end
109
-
110
- # 当前库的依赖加进去
111
- unless module_dep.dependencies.include?(child_name)
112
- module_dep.dependencies << child_name
113
- end
114
-
115
- # 当前库的依赖的子依赖
116
- child = ModuleDepObject.new(child_name)
117
- child_dep = self.get_module_dep(lock_dependencies, child)
118
-
119
- child_dep.did_expanded
120
- self.all_module_dependencies[child_dep.module_name] = child_dep
121
-
122
- child_dep.dependencies.each { |sun_name|
123
- # 孙子依赖加进去
124
- unless module_dep.dependencies.include?(sun_name)
125
- module_dep.dependencies << sun_name
126
- end
127
- }
128
- }
129
- }
130
- }
131
-
132
- module_dep.did_expanded
133
- self.all_module_dependencies[module_dep.module_name] = module_dep
134
- module_dep
135
- end
136
-
137
- # 获取某个库的podspec的直接依赖
138
- def podspec_dependencies(podspec_path)
139
-
140
- podspec_json_path = podspec_path.to_s.end_with?(".podspec.json") ? podspec_path : nil
141
-
142
- podspec_content = nil
143
- if podspec_json_path and File.exist?(podspec_json_path)
144
- json = File.read(podspec_json_path)
145
- podspec_content = JSON.parse(json)
146
- elsif podspec_path and File.exist?(podspec_path)
147
- json = self.get_podspec_content(podspec_path)
148
- podspec_content = JSON.parse(json)
149
- end
150
-
151
- podspec_content["dependencies"] ? podspec_content["dependencies"].keys : []
152
-
153
- end
154
-
155
- # 获取已安装的依赖库
156
- def get_installed_deps(lock_dependencies)
157
- lock_dependencies["SPEC CHECKSUMS"] ? lock_dependencies["SPEC CHECKSUMS"].keys : {}
158
- end
159
-
160
- # 根据podspec路径把podspec转为json
161
- @private
162
- def get_podspec_content(podspec_path)
163
-
164
- spec_contents = File.open(podspec_path, 'r:utf-8', &:read)
165
-
166
- if spec_contents.respond_to?(:encoding) && spec_contents.encoding.name != 'UTF-8'
167
- spec_contents.encode!('UTF-8')
168
- end
169
-
170
- path = Pathname.new(podspec_path)
171
-
172
- spec = ::Pod._eval_podspec(spec_contents, path)
173
-
174
- spec.to_json
175
- end
176
-
177
- end
178
- end