podfileDep 2.3.6 → 2.4.0
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 +2 -0
- data/lib/cocoapods_plugin.rb +8 -1
- data/lib/podfileDep/check/dep.rb +2 -2
- data/lib/podfileDep/check/import.rb +76 -159
- data/lib/podfileDep/check/module.rb +1 -1
- data/lib/podfileDep/check/podspec.rb +163 -0
- data/lib/podfileDep/check/project.rb +167 -53
- data/lib/podfileDep/check/util.rb +38 -0
- data/lib/podfileDep/{constants.rb → my_constants.rb} +1 -1
- data/lib/podfileDep/podfilelock.rb +2 -2
- data/lib/podfileDep/reference/project.rb +11 -11
- data/lib/podfileDep/reference/unused.rb +3 -3
- data/lib/podfileDep/version.rb +1 -1
- data/lib/podfileDep/yaml/yaml_dep.rb +4 -4
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bf6db57ebcfb8e33ea60332704f396c50385bf2985cbc0756a51306f9875fa0
|
4
|
+
data.tar.gz: 06b8d0f2e4f832833c41ec97e7f767c557aeff2ad7f990f7fe40b5fe3d88fee0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d884c5e32c44f00740e57fbd4fadb0c901b5aede86f3b6f79f4cf739c80ef8550ecbcb8d16877b2047f3aa07e3805c89abc4113c6c4b1ded84b388fe3bec09d
|
7
|
+
data.tar.gz: 2320c89b84cad270a46325a80f8909aba737f6fc477ffc19eadc009847357163dab889cbfbdc4d3d0c49ccfb6b4ebeaa6bbc3d93f2bf88c7d2809a247838550a
|
data/CHANGELOG.md
CHANGED
data/lib/cocoapods_plugin.rb
CHANGED
@@ -2,10 +2,12 @@ require 'cocoapods'
|
|
2
2
|
require_relative 'podfileDep/command/quick'
|
3
3
|
require_relative 'podfileDep/check/project'
|
4
4
|
require_relative 'podfileDep/check/dep'
|
5
|
+
require_relative 'podfileDep/check/podspec'
|
5
6
|
require_relative 'podfileDep/modify/modify_code'
|
6
7
|
require_relative 'podfileDep/reference/project'
|
7
8
|
require_relative 'podfileDep/indirect/indirect'
|
8
9
|
require_relative 'podfileDep/reference/unused'
|
10
|
+
require_relative 'podfileDep/check/import'
|
9
11
|
|
10
12
|
# 注册插件
|
11
13
|
module CocoapodsPlugin
|
@@ -32,7 +34,12 @@ module CocoapodsPlugin
|
|
32
34
|
project = Xcodeproj::XCodeProject.new
|
33
35
|
|
34
36
|
# 检查import
|
35
|
-
project
|
37
|
+
checker1 = Xcodeproj::ImportChecker.new(project)
|
38
|
+
checker1.check_import
|
39
|
+
|
40
|
+
# 检查podspec
|
41
|
+
checker2 = Xcodeproj::PodspecChecker.new(project)
|
42
|
+
checker2.check_podspec
|
36
43
|
|
37
44
|
# 代码文件处理
|
38
45
|
ModifyCode::Modify.modify_fb
|
data/lib/podfileDep/check/dep.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'yaml'
|
3
3
|
require_relative '../podfilelock'
|
4
|
-
require_relative '../
|
4
|
+
require_relative '../my_constants'
|
5
5
|
require_relative 'module'
|
6
6
|
require_relative 'item'
|
7
7
|
require_relative 'xcodeproj'
|
@@ -176,7 +176,7 @@ module Dep
|
|
176
176
|
|
177
177
|
# 系统级的依赖库
|
178
178
|
def self.system_deps
|
179
|
-
return
|
179
|
+
return MyConstants::LIBLIBARYS + MyConstants::FRAMEWORKS
|
180
180
|
end
|
181
181
|
|
182
182
|
end
|
@@ -1,159 +1,76 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
#
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
#
|
64
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
# puts messages
|
78
|
-
# puts "\n"
|
79
|
-
# end
|
80
|
-
#
|
81
|
-
# }
|
82
|
-
#
|
83
|
-
# duration = ((Time.now.to_f * 1000).to_i - start)*0.001
|
84
|
-
# puts "import规范检查完毕! 共检查#{modules.size.to_s}个组件(#{check_count}个文件) 耗时:#{duration.round(2)}秒"
|
85
|
-
# end
|
86
|
-
#
|
87
|
-
# # 获取某个文件内对应类型的import "XXX.h"
|
88
|
-
# def self.update_import_dot_item_map(file_path, module_name, import_item_map)
|
89
|
-
# if File.directory?(file_path)
|
90
|
-
# return
|
91
|
-
# end
|
92
|
-
#
|
93
|
-
# line_array = IO.readlines(file_path)
|
94
|
-
# line_array.each_with_index { |line, index|
|
95
|
-
# line = line.gsub(" ", "")
|
96
|
-
# unless line.start_with?("#import\"")
|
97
|
-
# next
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
# if line.start_with?("@implementation")
|
101
|
-
# break
|
102
|
-
# end
|
103
|
-
#
|
104
|
-
# line_split_array = line.split("\"")
|
105
|
-
# if line_split_array.size <= 1
|
106
|
-
# next
|
107
|
-
# end
|
108
|
-
#
|
109
|
-
# import_name = "#{line_split_array[0]}\"#{line_split_array[1]}\"" # import"XXX.h" 或import"XXX.AAA.h" 防止后边有其他内容
|
110
|
-
#
|
111
|
-
# # 特殊处理
|
112
|
-
# if import_name == "#import\"NBSAppAgent.h\""
|
113
|
-
# next
|
114
|
-
# end
|
115
|
-
#
|
116
|
-
# podfile = import_name
|
117
|
-
# podfile = podfile.gsub("#import\"", "")
|
118
|
-
# podfile = podfile.gsub("\"", "") # 变成 XX.h
|
119
|
-
#
|
120
|
-
# # 已经包含
|
121
|
-
# if import_item_map[podfile]
|
122
|
-
# next
|
123
|
-
# end
|
124
|
-
# pre_index = index-1 < 0 ? 0 : index-1
|
125
|
-
# pre_line = line_array[pre_index]
|
126
|
-
# pre_line = pre_line.gsub(" ", "").gsub("\n", "")
|
127
|
-
# if pre_line.start_with?("#if") or pre_line == "#else"
|
128
|
-
# next
|
129
|
-
# end
|
130
|
-
#
|
131
|
-
# file_name = File.basename(file_path)
|
132
|
-
# line_index = index+1
|
133
|
-
#
|
134
|
-
# import_item_map[podfile] = ImportItem.new(import_name, module_name, file_name, line_index, podfile)
|
135
|
-
#
|
136
|
-
# }
|
137
|
-
# end
|
138
|
-
#
|
139
|
-
# # 根据文件名反查出属于哪个组件
|
140
|
-
# def self.get_module_name(module_headers, file_name)
|
141
|
-
# module_headers.each do |module_name,module_item|
|
142
|
-
# module_item.source_files.each {|source_file|
|
143
|
-
# if source_file.basename.to_s == file_name
|
144
|
-
# return module_name
|
145
|
-
# end
|
146
|
-
# }
|
147
|
-
# end
|
148
|
-
# return nil
|
149
|
-
# end
|
150
|
-
#
|
151
|
-
# # 获取某库是否是系统级的依赖库
|
152
|
-
# def self.check_sys_libary(name)
|
153
|
-
# name = name.gsub(".h", "")
|
154
|
-
# libs = Constants::LIBLIBARYS
|
155
|
-
# return libs.include?(name)
|
156
|
-
# end
|
157
|
-
#
|
158
|
-
# end
|
159
|
-
# end
|
1
|
+
require_relative 'project'
|
2
|
+
|
3
|
+
module Xcodeproj
|
4
|
+
class ImportChecker
|
5
|
+
|
6
|
+
# @return [XCodeProject]
|
7
|
+
attr_accessor :project
|
8
|
+
|
9
|
+
# @param project::[XCodeProject]
|
10
|
+
def initialize(project)
|
11
|
+
@project = project
|
12
|
+
end
|
13
|
+
|
14
|
+
# 检查import规范
|
15
|
+
def check_import
|
16
|
+
puts "import检查中..."
|
17
|
+
start = (Time.now.to_f * 1000).to_i
|
18
|
+
module_count = 0
|
19
|
+
file_count = 0
|
20
|
+
|
21
|
+
project.module_items.each do |module_name, module_item|
|
22
|
+
unless module_item.is_development_module
|
23
|
+
next
|
24
|
+
end
|
25
|
+
module_count += 1
|
26
|
+
|
27
|
+
messages = []
|
28
|
+
|
29
|
+
did_check_imports = {}
|
30
|
+
module_item.init_import_info
|
31
|
+
|
32
|
+
module_item.import_items.each do |import_item|
|
33
|
+
file_count += 1
|
34
|
+
did_check_import = did_check_imports[import_item.import_file_name]
|
35
|
+
if did_check_import
|
36
|
+
next
|
37
|
+
end
|
38
|
+
need_module_item = project.module_items[import_item.module_name]
|
39
|
+
real_path = need_module_item.header_files[import_item.import_file_name]
|
40
|
+
did_check_imports[import_item.import_file_name] = !!(real_path)
|
41
|
+
unless real_path
|
42
|
+
# 去查找所属模块
|
43
|
+
expect_module_name = find_module_with_header_file(import_item.import_file_name)
|
44
|
+
if expect_module_name
|
45
|
+
messages << "#{import_item.file_path.basename} 第#{import_item.line_index}行 #{import_item.import_name} => #import <#{expect_module_name}/#{import_item.import_file_name}>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if messages.size >0
|
51
|
+
puts "组件#{module_item.module_name}存在以下情况, 请检查:".yellow
|
52
|
+
puts messages
|
53
|
+
puts "\n"
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
duration = ((Time.now.to_f * 1000).to_i - start)*0.001
|
59
|
+
puts "import检查完毕! 共检查#{module_count}个组件(#{file_count}个import) 耗时:#{duration.round(2)}秒"
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
# 根据头文件名查找所属组件
|
64
|
+
# @return [String, nil]
|
65
|
+
def find_module_with_header_file(header_file_name)
|
66
|
+
project.module_items.each do |module_name, module_item|
|
67
|
+
file_path = module_item.header_files[header_file_name]
|
68
|
+
if file_path
|
69
|
+
return module_item.module_name
|
70
|
+
end
|
71
|
+
end
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require_relative 'project'
|
2
|
+
require_relative 'util'
|
3
|
+
require_relative '../my_constants'
|
4
|
+
|
5
|
+
module Xcodeproj
|
6
|
+
class PodspecChecker
|
7
|
+
|
8
|
+
# @return [XCodeProject]
|
9
|
+
attr_accessor :project
|
10
|
+
|
11
|
+
# @param project::[XCodeProject]
|
12
|
+
def initialize(project)
|
13
|
+
@project = project
|
14
|
+
end
|
15
|
+
|
16
|
+
# 检查podspec文件
|
17
|
+
def check_podspec
|
18
|
+
puts "podspec文件检查中..."
|
19
|
+
start = (Time.now.to_f * 1000).to_i
|
20
|
+
module_count = 0
|
21
|
+
|
22
|
+
project.module_items.each do |module_name, module_item|
|
23
|
+
unless module_item.is_development_module
|
24
|
+
next
|
25
|
+
end
|
26
|
+
module_count += 1
|
27
|
+
|
28
|
+
module_item.init_absolute_import_info
|
29
|
+
|
30
|
+
# 代码里需要的模块
|
31
|
+
need_modules = get_code_need_modules(module_item)
|
32
|
+
|
33
|
+
# podspec直接依赖
|
34
|
+
podspec_modules = get_podspec_modules(module_item)
|
35
|
+
|
36
|
+
loss = loss_modules(need_modules, podspec_modules)
|
37
|
+
unused = unused_modules(need_modules, podspec_modules)
|
38
|
+
|
39
|
+
if loss.size >0
|
40
|
+
puts "组件#{module_item.module_name}可能缺少以下依赖, 请检查:".yellow
|
41
|
+
loss.each do |name|
|
42
|
+
puts " s.dependency '#{name}'"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if unused.size >0
|
47
|
+
puts "组件#{module_item.module_name}可能未使用以下依赖, 请检查:".yellow
|
48
|
+
puts unused
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
duration = ((Time.now.to_f * 1000).to_i - start)*0.001
|
54
|
+
puts "podspec检查完毕! 共检查#{module_count}个组件 耗时:#{duration.round(2)}秒"
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# 获取缺失的模块
|
60
|
+
# @param need_modules::[String]
|
61
|
+
# @param podspec_modules::[Hash{String => [String]}]
|
62
|
+
def loss_modules(need_modules, podspec_modules)
|
63
|
+
# 展开
|
64
|
+
temp_array = []
|
65
|
+
podspec_modules.each do |podspec_module|
|
66
|
+
podspec_modules.values.each do |array|
|
67
|
+
temp_array = temp_array | array
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
res = []
|
72
|
+
need_modules.each do |name|
|
73
|
+
unless temp_array.include?(name)
|
74
|
+
res << name
|
75
|
+
end
|
76
|
+
end
|
77
|
+
res
|
78
|
+
end
|
79
|
+
|
80
|
+
# 获取多余的模块
|
81
|
+
# @param need_modules::[String]
|
82
|
+
# @param podspec_modules::[Hash{String => [String]}]
|
83
|
+
def unused_modules(need_modules, podspec_modules)
|
84
|
+
res = []
|
85
|
+
podspec_modules.each do |dep_name, array|
|
86
|
+
contain = false
|
87
|
+
array.each do |vendor|
|
88
|
+
if need_modules.include?(vendor)
|
89
|
+
contain = true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
unless contain
|
94
|
+
res << dep_name
|
95
|
+
end
|
96
|
+
end
|
97
|
+
res
|
98
|
+
end
|
99
|
+
|
100
|
+
# @note 获取代码里需要的模块
|
101
|
+
def get_code_need_modules(module_item)
|
102
|
+
import_items = module_item.absolute_import_items
|
103
|
+
result_dic = {}
|
104
|
+
import_items.each do |import_item|
|
105
|
+
# 过滤系统库
|
106
|
+
if system_modules.include?(import_item.belong_module)
|
107
|
+
next
|
108
|
+
end
|
109
|
+
|
110
|
+
# 过滤当前库
|
111
|
+
if module_item.module_name == import_item.belong_module
|
112
|
+
next
|
113
|
+
end
|
114
|
+
|
115
|
+
result_dic[import_item.belong_module] = import_item
|
116
|
+
end
|
117
|
+
result_dic.keys
|
118
|
+
end
|
119
|
+
|
120
|
+
# 获取podspec文件里写的模块 直接依赖
|
121
|
+
# @return [Hash{String => [String]}]
|
122
|
+
def get_podspec_modules(module_item)
|
123
|
+
|
124
|
+
podspec_content = Util.get_podspec_content(module_item.podspec_path)
|
125
|
+
|
126
|
+
podspec_dependencies = podspec_content["dependencies"] ? podspec_content["dependencies"].keys : []
|
127
|
+
|
128
|
+
# 子模块
|
129
|
+
subspecs = podspec_content["subspecs"]
|
130
|
+
if subspecs and subspecs.class == Array
|
131
|
+
subspecs.each do |subspec|
|
132
|
+
subspec_deps = subspec["dependencies"] ? subspec["dependencies"].keys : []
|
133
|
+
podspec_dependencies = podspec_dependencies + subspec_deps
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# 转成map
|
138
|
+
result = {}
|
139
|
+
podspec_dependencies.each do |podspec_dependency|
|
140
|
+
podspec_dependency = podspec_dependency.split("/")[0] #如果podspec里写的依赖是带/的,取/前第一个, 例如:s.dependency 'UMCShare/Social/ReducedQQ'
|
141
|
+
dependency_item = project.module_items[podspec_dependency]
|
142
|
+
if dependency_item
|
143
|
+
result[podspec_dependency] = dependency_item.frameworks
|
144
|
+
else #如果/都处理了,还是取不到,那就整个默认值,自身
|
145
|
+
frameworks = [podspec_dependency]
|
146
|
+
if podspec_dependency.include?("/") #处理依赖 s.dependency 'UMCShare/Social/ReducedQQ'
|
147
|
+
frameworks << podspec_dependency.split("/")[0]
|
148
|
+
end
|
149
|
+
result[podspec_dependency] = frameworks
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
result
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
# 系统级的依赖库
|
158
|
+
# @return [String]
|
159
|
+
def system_modules
|
160
|
+
MyConstants::LIBLIBARYS + MyConstants::FRAMEWORKS
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'colored2'
|
3
|
+
require_relative 'util'
|
3
4
|
|
4
5
|
module Xcodeproj
|
5
6
|
|
@@ -9,12 +10,14 @@ module Xcodeproj
|
|
9
10
|
attr_accessor :file_path
|
10
11
|
attr_accessor :import_file_name
|
11
12
|
attr_accessor :line_index
|
13
|
+
attr_accessor :belong_module
|
12
14
|
def initialize
|
13
15
|
@import_name = nil
|
14
16
|
@module_name = nil
|
15
17
|
@file_path = nil
|
16
18
|
@import_file_name = nil
|
17
19
|
@line_index = nil
|
20
|
+
@belong_module = nil
|
18
21
|
end
|
19
22
|
|
20
23
|
end
|
@@ -38,11 +41,17 @@ module Xcodeproj
|
|
38
41
|
attr_accessor :source_files
|
39
42
|
|
40
43
|
# 是否是开发模块
|
41
|
-
|
44
|
+
attr_accessor :is_development_module
|
42
45
|
|
43
|
-
# [
|
46
|
+
# [ImportItem]
|
44
47
|
attr_accessor :import_items
|
45
48
|
|
49
|
+
# [ImportItem]
|
50
|
+
attr_accessor :absolute_import_items
|
51
|
+
|
52
|
+
# [String]
|
53
|
+
attr_accessor :frameworks
|
54
|
+
|
46
55
|
def initialize(module_name)
|
47
56
|
@module_name = module_name
|
48
57
|
@module_path = nil
|
@@ -50,12 +59,47 @@ module Xcodeproj
|
|
50
59
|
@header_files = {}
|
51
60
|
@source_files = {}
|
52
61
|
@import_items = []
|
62
|
+
@absolute_import_items = []
|
63
|
+
@is_development_module = false
|
64
|
+
@frameworks = []
|
53
65
|
end
|
54
66
|
|
55
|
-
#
|
56
|
-
#
|
57
|
-
def
|
58
|
-
|
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
|
59
103
|
end
|
60
104
|
|
61
105
|
# 生成 import "XXX.h"的信息
|
@@ -133,7 +177,31 @@ module Xcodeproj
|
|
133
177
|
end
|
134
178
|
|
135
179
|
|
136
|
-
def other_module_import(line)
|
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
|
137
205
|
|
138
206
|
end
|
139
207
|
end
|
@@ -151,6 +219,8 @@ module Xcodeproj
|
|
151
219
|
# @return [Hash{String => ModuleItem}]
|
152
220
|
attr_accessor :module_items
|
153
221
|
|
222
|
+
# @return [Hash]
|
223
|
+
attr_accessor :lock_content
|
154
224
|
|
155
225
|
def initialize
|
156
226
|
@shell_project = nil
|
@@ -158,9 +228,12 @@ module Xcodeproj
|
|
158
228
|
@module_items = {}
|
159
229
|
init_shell_project
|
160
230
|
init_pod_project
|
231
|
+
init_lockfile
|
161
232
|
expand_module
|
233
|
+
init_vendor_frameworks
|
162
234
|
end
|
163
235
|
|
236
|
+
@private
|
164
237
|
def init_shell_project
|
165
238
|
xcodeproj_file = nil
|
166
239
|
Dir.foreach(Dir.pwd) do |file|
|
@@ -187,6 +260,16 @@ module Xcodeproj
|
|
187
260
|
@pod_project = Xcodeproj::Project.open(xcodeproj_path)
|
188
261
|
end
|
189
262
|
|
263
|
+
def init_lockfile
|
264
|
+
lockfile_path = MyConstants::PODFILE_LOCK
|
265
|
+
|
266
|
+
unless File.exist?(lockfile_path)
|
267
|
+
return
|
268
|
+
end
|
269
|
+
|
270
|
+
@lock_content = YAML.load_file(lockfile_path)
|
271
|
+
end
|
272
|
+
|
190
273
|
# 展开模块
|
191
274
|
def expand_module
|
192
275
|
self.expand_with_module(pod_project.main_group, nil)
|
@@ -208,6 +291,7 @@ module Xcodeproj
|
|
208
291
|
source_file_item = @module_items[module_name]
|
209
292
|
if module_name and not source_file_item
|
210
293
|
source_file_item = ModuleItem.new(module_name)
|
294
|
+
source_file_item.podspec_path = get_podspec_path(module_name)
|
211
295
|
@module_items[module_name] = source_file_item
|
212
296
|
end
|
213
297
|
|
@@ -251,6 +335,7 @@ module Xcodeproj
|
|
251
335
|
extend_name = child.real_path.basename.extname
|
252
336
|
if extend_name == ".podspec" or extend_name == ".podspec.json"
|
253
337
|
source_file_item.podspec_path = child.real_path
|
338
|
+
source_file_item.is_development_module = true
|
254
339
|
elsif source_file_extension.include?(extend_name)
|
255
340
|
source_file_item.source_files[child.real_path.basename.to_s] = child.real_path
|
256
341
|
if header_file_extension.include?(extend_name)
|
@@ -267,65 +352,94 @@ module Xcodeproj
|
|
267
352
|
|
268
353
|
end
|
269
354
|
|
270
|
-
#
|
271
|
-
def
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
355
|
+
# 读取某个模块的podspec路径
|
356
|
+
def get_podspec_path(module_name)
|
357
|
+
lock_content = @lock_content
|
358
|
+
local_spec = lock_content["EXTERNAL SOURCES"]
|
359
|
+
if local_spec and local_spec[module_name]
|
360
|
+
path = local_spec[module_name][:path]
|
361
|
+
return Pathname(path).expand_path
|
362
|
+
end
|
276
363
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
364
|
+
remote_dependencies = lock_content["DEPENDENCIES"]
|
365
|
+
version_map = {}
|
366
|
+
remote_dependencies.each do |dependency|
|
367
|
+
temp = dependency.split("(")
|
368
|
+
name = temp[0].split("/")[0] # UMCShare/Social/ReducedWeChat
|
369
|
+
name = name.gsub(" ", "").gsub(")", "")
|
370
|
+
version = temp[1].gsub("= ", "").gsub(")", "")
|
371
|
+
version_map[name] = version
|
372
|
+
end
|
373
|
+
version = version_map[module_name]
|
374
|
+
|
375
|
+
remote_spec = lock_content["SPEC CHECKSUMS"]
|
376
|
+
md5_to5 = ""
|
377
|
+
if remote_spec and remote_spec[module_name]
|
378
|
+
md5 = remote_spec[module_name]
|
379
|
+
md5_to5 = md5.slice(0,5)
|
380
|
+
end
|
381
|
+
# 4.0.1-24ee2.podspec.json
|
382
|
+
podspec_json_name = "#{version}-#{md5_to5}.podspec.json"
|
383
|
+
path = "~/Library/Caches/CocoaPods/Pods/Specs/Release/#{module_name}/#{podspec_json_name}"
|
384
|
+
Pathname(path).expand_path
|
385
|
+
end
|
282
386
|
|
283
|
-
messages = []
|
284
387
|
|
285
|
-
|
286
|
-
|
388
|
+
# 初始化模块的vendor_frameworks
|
389
|
+
def init_vendor_frameworks
|
390
|
+
@module_items.each_value do |module_item|
|
391
|
+
module_item.frameworks << module_item.module_name
|
392
|
+
podspec_content = Util.get_podspec_content(module_item.podspec_path)
|
287
393
|
|
288
|
-
|
289
|
-
|
290
|
-
did_check_import = did_check_imports[import_item.import_file_name]
|
291
|
-
if did_check_import
|
292
|
-
next
|
293
|
-
end
|
294
|
-
need_module_item = module_items[import_item.module_name]
|
295
|
-
real_path = need_module_item.header_files[import_item.import_file_name]
|
296
|
-
did_check_imports[import_item.import_file_name] = !!(real_path)
|
297
|
-
unless real_path
|
298
|
-
# 去查找所属模块
|
299
|
-
expect_module_name = find_module_with_header_file(import_item.import_file_name)
|
300
|
-
if expect_module_name
|
301
|
-
messages << "#{import_item.file_path.basename} 第#{import_item.line_index}行 #{import_item.import_name} => #import <#{expect_module_name}/#{import_item.import_file_name}>"
|
302
|
-
end
|
303
|
-
end
|
394
|
+
unless podspec_content
|
395
|
+
next
|
304
396
|
end
|
305
397
|
|
306
|
-
|
307
|
-
puts "组件#{module_item.module_name}存在以下情况, 请检查:".yellow
|
308
|
-
puts messages
|
309
|
-
puts "\n"
|
310
|
-
end
|
398
|
+
update_dep_frameworks(module_item.frameworks, podspec_content)
|
311
399
|
|
400
|
+
subspec_content = podspec_content["subspecs"]
|
401
|
+
if subspec_content and subspec_content.class == Array
|
402
|
+
subspec_content.each { |json_content|
|
403
|
+
update_dep_frameworks(module_item.frameworks, json_content)
|
404
|
+
}
|
405
|
+
end
|
312
406
|
end
|
313
407
|
|
314
|
-
duration = ((Time.now.to_f * 1000).to_i - start)*0.001
|
315
|
-
puts "import检查完毕! 共检查#{module_count}个组件(#{file_count}个import) 耗时:#{duration.round(2)}秒"
|
316
408
|
end
|
317
409
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
if file_path
|
325
|
-
return module_item.module_name
|
410
|
+
def update_dep_frameworks(item_frameworks, json_content)
|
411
|
+
vendor_frameworks = json_content["vendored_frameworks"]
|
412
|
+
unless vendor_frameworks
|
413
|
+
ios = json_content["ios"]
|
414
|
+
if ios and ios.class == Hash
|
415
|
+
vendor_frameworks = ios["vendored_frameworks"]
|
326
416
|
end
|
327
417
|
end
|
328
|
-
|
418
|
+
|
419
|
+
if vendor_frameworks
|
420
|
+
if vendor_frameworks.class == Array
|
421
|
+
vendor_frameworks.each do |framework|
|
422
|
+
frameworks = deal_frameworks(vendor_frameworks)
|
423
|
+
if frameworks != "*"
|
424
|
+
item_frameworks << frameworks
|
425
|
+
end
|
426
|
+
end
|
427
|
+
elsif vendor_frameworks.class == String
|
428
|
+
frameworks = deal_frameworks(vendor_frameworks)
|
429
|
+
if frameworks != "*"
|
430
|
+
item_frameworks << frameworks
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
def deal_frameworks(frameworks)
|
437
|
+
# "frameworks/WCDB/WCDB.framework",
|
438
|
+
# "openssl.xcframework"
|
439
|
+
temp_array = frameworks.split("/")
|
440
|
+
result = temp_array.last
|
441
|
+
result = result.gsub(".xcframework","")
|
442
|
+
result.gsub(".framework", "")
|
329
443
|
end
|
330
444
|
|
331
445
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Xcodeproj
|
2
|
+
class Util
|
3
|
+
#读取podspec内容
|
4
|
+
# @return [Hash]
|
5
|
+
# @param podspec_path::[Pathname]
|
6
|
+
def self.get_podspec_content(podspec_path)
|
7
|
+
|
8
|
+
podspec_json_path = podspec_path.to_s.end_with?(".podspec.json") ? podspec_path : nil
|
9
|
+
|
10
|
+
podspec_content = nil
|
11
|
+
if podspec_json_path and File.exist?(podspec_json_path)
|
12
|
+
json = File.read(podspec_json_path)
|
13
|
+
podspec_content = JSON.parse(json)
|
14
|
+
elsif podspec_path and File.exist?(podspec_path)
|
15
|
+
json = get_podspec_file_content(podspec_path)
|
16
|
+
podspec_content = JSON.parse(json)
|
17
|
+
end
|
18
|
+
podspec_content
|
19
|
+
end
|
20
|
+
|
21
|
+
@private
|
22
|
+
# 根据podspec路径把podspec转为json
|
23
|
+
def self.get_podspec_file_content(podspec_path)
|
24
|
+
|
25
|
+
spec_contents = File.open(podspec_path, 'r:utf-8', &:read)
|
26
|
+
|
27
|
+
if spec_contents.respond_to?(:encoding) && spec_contents.encoding.name != 'UTF-8'
|
28
|
+
spec_contents.encode!('UTF-8')
|
29
|
+
end
|
30
|
+
|
31
|
+
path = Pathname.new(podspec_path)
|
32
|
+
|
33
|
+
spec = ::Pod._eval_podspec(spec_contents, path)
|
34
|
+
|
35
|
+
spec.to_json
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'my_constants'
|
2
2
|
require 'yaml'
|
3
3
|
|
4
4
|
module PodfileLock
|
5
5
|
class PodfileLockManager
|
6
6
|
# 读取podfile.lock
|
7
7
|
def self.podfile_lock_content
|
8
|
-
podfile_lock =
|
8
|
+
podfile_lock = MyConstants::PODFILE_LOCK
|
9
9
|
|
10
10
|
unless File.exist?(podfile_lock)
|
11
11
|
return {}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative '../check/xcodeproj'
|
2
|
-
require_relative '../
|
2
|
+
require_relative '../my_constants'
|
3
3
|
|
4
4
|
module Project
|
5
5
|
class ProjectManager
|
@@ -27,16 +27,16 @@ module Project
|
|
27
27
|
content += line
|
28
28
|
next_line = index<line_array.size ? line_array[index+1] : ""
|
29
29
|
if line.include?("if [[ \"$CONFIGURATION\"") and next_line.include?("install_resource")
|
30
|
-
if File.exist?(
|
31
|
-
content += " install_resource \"${SRCROOT}/#{
|
30
|
+
if File.exist?(MyConstants::PODFILE_LOCAL_YAML)
|
31
|
+
content += " install_resource \"${SRCROOT}/#{MyConstants::PODFILE_LOCAL_YAML}\"\n"
|
32
32
|
end
|
33
33
|
|
34
|
-
if File.exist?(
|
35
|
-
content += " install_resource \"${SRCROOT}/#{
|
34
|
+
if File.exist?(MyConstants::PODFILE_MODULE_YAML)
|
35
|
+
content += " install_resource \"${SRCROOT}/#{MyConstants::PODFILE_MODULE_YAML}\"\n"
|
36
36
|
end
|
37
37
|
|
38
|
-
if File.exist?(
|
39
|
-
content += " install_resource \"${SRCROOT}/#{
|
38
|
+
if File.exist?(MyConstants::PODFILE_THIRD_PARTY_YAML)
|
39
|
+
content += " install_resource \"${SRCROOT}/#{MyConstants::PODFILE_THIRD_PARTY_YAML}\"\n"
|
40
40
|
end
|
41
41
|
end
|
42
42
|
}
|
@@ -57,9 +57,9 @@ module Project
|
|
57
57
|
|
58
58
|
def self.add_yaml
|
59
59
|
|
60
|
-
podfile_local_yaml =
|
61
|
-
podfile_module_yaml =
|
62
|
-
podfile_third_party_yaml =
|
60
|
+
podfile_local_yaml = MyConstants::PODFILE_LOCAL_YAML
|
61
|
+
podfile_module_yaml = MyConstants::PODFILE_MODULE_YAML
|
62
|
+
podfile_third_party_yaml = MyConstants::PODFILE_THIRD_PARTY_YAML
|
63
63
|
|
64
64
|
project_manager = XCProject::XcodeprojManager.share_manager
|
65
65
|
pods_project = project_manager.get_pods_project
|
@@ -93,7 +93,7 @@ module Project
|
|
93
93
|
def self.add_local_yaml_ignore
|
94
94
|
|
95
95
|
gitignore = ".gitignore"
|
96
|
-
podfile_local_yaml =
|
96
|
+
podfile_local_yaml = MyConstants::PODFILE_LOCAL_YAML
|
97
97
|
|
98
98
|
contain = false
|
99
99
|
gitignore_path= "#{Dir.pwd}/#{gitignore}"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'colored2'
|
2
|
-
require_relative '../
|
2
|
+
require_relative '../my_constants'
|
3
3
|
require_relative '../yaml/yaml_dep'
|
4
4
|
|
5
5
|
module Unused
|
@@ -12,11 +12,11 @@ module Unused
|
|
12
12
|
|
13
13
|
if yaml_dep.quick_build
|
14
14
|
msg = "🔰已开启编译优化选项,请关注上方日志 '下载依赖...'部分内容"
|
15
|
-
msg += "\n #{
|
15
|
+
msg += "\n #{MyConstants::PODFILE_LOCAL_YAML}文件内的依赖库,将不会被优化忽略掉"
|
16
16
|
puts msg.green
|
17
17
|
else
|
18
18
|
msg = "检测到你未开启编译优化选项,如你处于开发模式,可开启此功能,移除不被引用的依赖库来加速编译,有2种方式任选其一"
|
19
|
-
msg += "\n1. 在#{
|
19
|
+
msg += "\n1. 在#{MyConstants::PODFILE_LOCAL_YAML}中 最外层 QUICK_BUILD字段设置为true,然后重新pod install"
|
20
20
|
msg += "\n2. 执行 pod install quick 可单次开启"
|
21
21
|
puts msg.yellow
|
22
22
|
end
|
data/lib/podfileDep/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'yaml_pod'
|
2
2
|
require_relative '../version'
|
3
|
-
require_relative '../
|
3
|
+
require_relative '../my_constants'
|
4
4
|
require_relative '../check/xcodeproj'
|
5
5
|
require_relative '../variable'
|
6
6
|
require 'colored2'
|
@@ -34,9 +34,9 @@ module Pod
|
|
34
34
|
@yaml_deps = {}
|
35
35
|
@all_deps = {}
|
36
36
|
@targets_dependencies = {}
|
37
|
-
@podfile_local_yaml =
|
38
|
-
@podfile_module_yaml =
|
39
|
-
@podfile_third_party_yaml =
|
37
|
+
@podfile_local_yaml = MyConstants::PODFILE_LOCAL_YAML
|
38
|
+
@podfile_module_yaml = MyConstants::PODFILE_MODULE_YAML
|
39
|
+
@podfile_third_party_yaml = MyConstants::PODFILE_THIRD_PARTY_YAML
|
40
40
|
end
|
41
41
|
|
42
42
|
def install_yaml_dep(podfile)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: podfileDep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 王帅朋
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocoapods
|
@@ -69,12 +69,14 @@ files:
|
|
69
69
|
- lib/podfileDep/check/import.rb
|
70
70
|
- lib/podfileDep/check/item.rb
|
71
71
|
- lib/podfileDep/check/module.rb
|
72
|
+
- lib/podfileDep/check/podspec.rb
|
72
73
|
- lib/podfileDep/check/project.rb
|
74
|
+
- lib/podfileDep/check/util.rb
|
73
75
|
- lib/podfileDep/check/xcodeproj.rb
|
74
76
|
- lib/podfileDep/command/quick.rb
|
75
|
-
- lib/podfileDep/constants.rb
|
76
77
|
- lib/podfileDep/indirect/indirect.rb
|
77
78
|
- lib/podfileDep/modify/modify_code.rb
|
79
|
+
- lib/podfileDep/my_constants.rb
|
78
80
|
- lib/podfileDep/podfilelock.rb
|
79
81
|
- lib/podfileDep/reference/project.rb
|
80
82
|
- lib/podfileDep/reference/unused.rb
|