cocoapods-bb-PodAssistant 0.3.7.1 → 0.3.9.2
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/README.md +19 -1
- data/bin/bb_tools +99 -0
- data/lib/cocoapods-bb-PodAssistant/babybus/helpers/babybus_info_plist_helper.rb +8 -3
- data/lib/cocoapods-bb-PodAssistant/command.rb +3 -1
- data/lib/cocoapods-bb-PodAssistant/gem_version.rb +1 -1
- data/lib/cocoapods-bb-PodAssistant/helpers/pod_module_helper.rb +14 -2
- data/lib/cocoapods-bb-PodAssistant/tools/class_unuse_finder.rb +129 -0
- data/lib/cocoapods-bb-PodAssistant/tools/count_code_line.rb +55 -0
- data/lib/cocoapods-bb-PodAssistant/tools/file_handle.rb +78 -0
- data/lib/cocoapods-bb-PodAssistant/tools/find_unuse_img.rb +132 -0
- data/lib/cocoapods-bb-PodAssistant/tools/get_size.rb +94 -0
- data/lib/cocoapods-bb-PodAssistant/tools/git_sets.rb +42 -0
- data/lib/cocoapods-bb-PodAssistant/tools/link_map.rb +381 -0
- data/lib/cocoapods-bb-PodAssistant/tools/podfile_tiled.rb +98 -0
- data/lib/cocoapods-bb-PodAssistant/tools/string_searcher.rb +129 -0
- data/lib/cocoapods-bb-PodAssistant/tools/temple-commit-msg.dat +141 -0
- data/lib/cocoapods-bb-PodAssistant/tools.rb +10 -0
- data/lib/cocoapods-bb-PodAssistant.rb +2 -0
- metadata +60 -10
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'find'
|
2
|
+
module BBItools
|
3
|
+
class Memory
|
4
|
+
attr_accessor :pro
|
5
|
+
# 分发吹
|
6
|
+
def hand_cal_size(file,prop)
|
7
|
+
if prop.nil?
|
8
|
+
@pro = 1024
|
9
|
+
elsif prop == 0
|
10
|
+
@pro = 1024
|
11
|
+
else
|
12
|
+
@pro = prop
|
13
|
+
end
|
14
|
+
handle_method = ''
|
15
|
+
if File.file?(file)
|
16
|
+
puts "\033[32m开始计算文件的大小...\033[0m"
|
17
|
+
handle_method = 'cal_file'
|
18
|
+
elsif File::directory?(file)
|
19
|
+
handle_method = 'cal_folder'
|
20
|
+
puts "\033[32m开始计算文件夹的大小...\033[0m"
|
21
|
+
else
|
22
|
+
puts "\033[31m参数异常,请确保传入的第一个参数是文件路径或者文件夹路径\033[0m"
|
23
|
+
return
|
24
|
+
end
|
25
|
+
self.send(handle_method,file)
|
26
|
+
end
|
27
|
+
# 计算单个文件
|
28
|
+
def cal_file(file)
|
29
|
+
puts "\033[32m文件的大小为:#{get_show_size(File.size(file))}.\033[0m"
|
30
|
+
end
|
31
|
+
# 计算整个文件夹
|
32
|
+
def cal_folder(folder)
|
33
|
+
print "\033[32m请输入要查找文件后缀\033[0m(例如想文件夹中图片大小则输入:{png,jpg,gif},不输入则默认计算文件夹下所有文件大小之和):"
|
34
|
+
file_exts_string = STDIN.gets
|
35
|
+
file_exts_string.chomp! #过滤换行符
|
36
|
+
if file_exts_string.size == 0
|
37
|
+
file_exts = []
|
38
|
+
else
|
39
|
+
file_exts = file_exts_string.split(",")
|
40
|
+
end
|
41
|
+
sum = 0
|
42
|
+
file_count = 0
|
43
|
+
total_count = 0
|
44
|
+
total_size = 0
|
45
|
+
file_size = 0
|
46
|
+
Find.find(folder) do |filename|
|
47
|
+
if File.file?(filename)
|
48
|
+
total_count = total_count + 1
|
49
|
+
total_size = total_size + File.size(filename)
|
50
|
+
if file_exts.size == 0 #说明计算所有文件
|
51
|
+
sum = sum + File.size(filename)
|
52
|
+
file_count = file_count + 1
|
53
|
+
elsif file_exts.include?(File.extname(filename).delete(".")) #查找指定后缀的文件
|
54
|
+
sum = sum + File.size(filename)
|
55
|
+
file_count = file_count + 1
|
56
|
+
file_size = file_size + File.size(filename)
|
57
|
+
else
|
58
|
+
#不做任何处理
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
if file_exts.size == 0
|
63
|
+
puts "\033[32m文件夹中共#{total_count}个文件,共#{get_show_size(total_size)}(#{total_size})\033[0m"
|
64
|
+
else
|
65
|
+
puts "\033[32m文件夹中共#{total_count}个文件,共#{get_show_size(total_size)}(#{total_size});找到后缀为(#{file_exts_string})的文件#{file_count}个,共#{get_show_size(file_size)}(#{file_size}).\033[0m"
|
66
|
+
end
|
67
|
+
|
68
|
+
# puts `du -b #{folder} | awk '{print $1}'`.to_i
|
69
|
+
end
|
70
|
+
# get_show_size
|
71
|
+
def get_show_size(size)
|
72
|
+
if size > @pro * @pro * @pro
|
73
|
+
return format("%.2f",(size.to_f/(@pro*@pro*@pro))) + "GB"
|
74
|
+
elsif size > @pro * @pro
|
75
|
+
return format("%.2f",(size.to_f/(@pro*@pro))) + "MB"
|
76
|
+
elsif size > @pro
|
77
|
+
return format("%.2f",(size.to_f/@pro)) + "KB"
|
78
|
+
else
|
79
|
+
return size.to_s + "B"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
# 对外暴露方法
|
83
|
+
def self.sizeFor(proport)
|
84
|
+
file = proport[0]
|
85
|
+
pro = proport[1].to_i
|
86
|
+
if file.nil?
|
87
|
+
puts "\033[31m参数异常,请传入一个参数\033[0m"
|
88
|
+
return
|
89
|
+
end
|
90
|
+
memory = Memory.new
|
91
|
+
memory.hand_cal_size(file,pro)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'colored2'
|
2
|
+
|
3
|
+
module BBItools
|
4
|
+
class GitSets
|
5
|
+
def self.commit_msg_init(args)
|
6
|
+
# folder_path = args[0]
|
7
|
+
# if folder_path.nil?
|
8
|
+
# puts "传入的参数不能为空".red
|
9
|
+
# return
|
10
|
+
# end
|
11
|
+
# if !File::directory?(folder_path)
|
12
|
+
# puts "参数不是文件夹".red
|
13
|
+
# return
|
14
|
+
# end
|
15
|
+
puts "开始配置CommitLint,用于校验commit message的工具...".yellow
|
16
|
+
system('touch ./.git/commit_msg')
|
17
|
+
system('git config commit.template "`pwd`/.git/commit_msg"')
|
18
|
+
a = <<-EOF
|
19
|
+
#!/bin/sh
|
20
|
+
echo "$(git symbolic-ref --short HEAD) subject" > `pwd`/.git/commit_msg
|
21
|
+
echo "" >> `pwd`/.git/commit_msg
|
22
|
+
echo "Cause:" >> `pwd`/.git/commit_msg
|
23
|
+
echo "Solution:" >> `pwd`/.git/commit_msg
|
24
|
+
echo "Releated Doc Address:" >> `pwd`/.git/commit_msg
|
25
|
+
echo '''\n#TYPE类型\n#新功能 feature/feat\n#bug修复 bugfix/fixbug/fix\n#性能优化 perf\n#代码重构 refactor/review\n#线上修复 hotfix\n#发布版本 release\n#文档变更 docs\n#更新 update\n#新增 add\n#标签 tag\n#代码回退 revert\n#更新lock lock''' >> `pwd`/.git/commit_msg
|
26
|
+
EOF
|
27
|
+
File.open('.git/hooks/pre-commit', 'w') do |f|
|
28
|
+
f.puts a
|
29
|
+
end
|
30
|
+
puts "写入CommitLint规则"
|
31
|
+
logo_path = File.join( File.dirname(__FILE__), 'temple-commit-msg.dat' )
|
32
|
+
content = File.read( logo_path )
|
33
|
+
File.open('.git/hooks/commit-msg', 'w') do |f|
|
34
|
+
f.puts content
|
35
|
+
end
|
36
|
+
puts "更新权限"
|
37
|
+
system('chmod a+x .git/hooks/pre-commit')
|
38
|
+
system('chmod a+x .git/hooks/commit-msg')
|
39
|
+
puts "配置成功,后续请直接使用git commit ,不要加 -m".green
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,381 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'find'
|
4
|
+
require 'spreadsheet'
|
5
|
+
module BBItools
|
6
|
+
# ---------------------------------ObjectFile class---------------------------------
|
7
|
+
class ObjectFile
|
8
|
+
# file_size:单个文件的大小
|
9
|
+
# o_name:某个文件的名字
|
10
|
+
# o_size: 某个o文件的大小
|
11
|
+
attr_accessor :serial_number, :file_path, :file_name, :file_size, :o_name, :o_size
|
12
|
+
def initialize()
|
13
|
+
@serial_number = []
|
14
|
+
@file_size = 0
|
15
|
+
@o_size = 0
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
# ---------------------------------Sections class---------------------------------
|
20
|
+
class Sections
|
21
|
+
attr_accessor :address, :size, :segment, :section
|
22
|
+
|
23
|
+
end
|
24
|
+
# ---------------------------------Symbols class---------------------------------
|
25
|
+
class Symbols
|
26
|
+
attr_accessor :s_address, :s_size, :s_file_serial_number, :s_name
|
27
|
+
def initialize
|
28
|
+
@s_file_serial_number = -1 #防止为0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# ---------------------------------DSSymbols class---------------------------------
|
33
|
+
class DSSymbols
|
34
|
+
attr_accessor :size, :file, :name
|
35
|
+
end
|
36
|
+
|
37
|
+
# ---------------------------------LinkMap class---------------------------------
|
38
|
+
class LinkMap
|
39
|
+
# 包含的属性
|
40
|
+
attr_accessor :l_name, :l_path, :l_arch, :l_obj_files, :l_sections, :l_symbols, :l_dead_stripped_symbols, :l_sym_map
|
41
|
+
# 初始化方法
|
42
|
+
def initialize(fName)
|
43
|
+
@l_name = fName
|
44
|
+
@l_obj_files = []
|
45
|
+
@l_symbols = []
|
46
|
+
@l_sections = []
|
47
|
+
@l_dead_stripped_symbols = []
|
48
|
+
end
|
49
|
+
# 得到path
|
50
|
+
def get_path(str)
|
51
|
+
splitparam = str.split(" ")
|
52
|
+
@l_path = splitparam.last
|
53
|
+
end
|
54
|
+
# 处理object文件
|
55
|
+
def handle_ojbect_files(str)
|
56
|
+
tempSplit = str.split("]")
|
57
|
+
if tempSplit.size > 1
|
58
|
+
obj_file = ObjectFile.new
|
59
|
+
obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
|
60
|
+
obj_file.file_path = tempSplit[1].strip
|
61
|
+
obj_file.file_name = tempSplit[1].split("/").last.chomp
|
62
|
+
obj_file.o_name = get_o_name(tempSplit[1].split("/").last.chomp)
|
63
|
+
l_obj_files << obj_file
|
64
|
+
end
|
65
|
+
end
|
66
|
+
# 得到o_ame 有待优化,可以使用正则表达式处理TODO
|
67
|
+
def get_o_name(str)
|
68
|
+
temp_arr = str.split("(")
|
69
|
+
if temp_arr.size > 1
|
70
|
+
temp_arr[1].split(".o)")[0]
|
71
|
+
else
|
72
|
+
return temp_arr[0].split(".o")[0]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
# 处理sections
|
76
|
+
def handle_sections(str)
|
77
|
+
sectionSplit = str.split(" ")
|
78
|
+
if sectionSplit.size == 4
|
79
|
+
section = Sections.new
|
80
|
+
section.address = sectionSplit[0]
|
81
|
+
section.size = sectionSplit[1]
|
82
|
+
section.segment = sectionSplit[2]
|
83
|
+
section.section = sectionSplit[3]
|
84
|
+
l_sections << section
|
85
|
+
end
|
86
|
+
end
|
87
|
+
# get arch
|
88
|
+
def get_arch(str)
|
89
|
+
splitparam = str.split(" ")
|
90
|
+
@l_arch = splitparam.last
|
91
|
+
end
|
92
|
+
# 处理Symbols
|
93
|
+
def handle_symbols(str)
|
94
|
+
# 字符编码产生的异常处理
|
95
|
+
begin
|
96
|
+
symbolsSplit = str.split("\t")
|
97
|
+
rescue => exception
|
98
|
+
return
|
99
|
+
end
|
100
|
+
if symbolsSplit.size > 2
|
101
|
+
symbol = Symbols.new
|
102
|
+
symbol.s_address = symbolsSplit[0]
|
103
|
+
symbol.s_size = symbolsSplit[1]
|
104
|
+
# 获取编号和名字
|
105
|
+
serial_name_str = symbolsSplit[2]
|
106
|
+
file_and_name_split = serial_name_str.split("]")
|
107
|
+
if file_and_name_split.size > 1
|
108
|
+
symbol.s_file_serial_number = file_and_name_split[0].delete("[").strip.to_i #设置文件编号
|
109
|
+
symbol.s_name = file_and_name_split[1]
|
110
|
+
end
|
111
|
+
|
112
|
+
l_symbols << symbol
|
113
|
+
else
|
114
|
+
end
|
115
|
+
end
|
116
|
+
# 处理symbols的数组,把symbols转换成hashmap
|
117
|
+
def handle_l_sym_map
|
118
|
+
@l_sym_map = @l_symbols.group_by(&:s_file_serial_number)
|
119
|
+
if @l_sym_map.include?(-1)
|
120
|
+
puts "移除无用元素"
|
121
|
+
@l_sym_map.delete(-1)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
# 处理link map file
|
125
|
+
def handle_map
|
126
|
+
handle_method_name = ""
|
127
|
+
File.read(@l_name).each_line do |line|
|
128
|
+
if line[0] == "#"
|
129
|
+
if line.include?("Path:")
|
130
|
+
handle_method_name = "get_path"
|
131
|
+
puts "处理path..."
|
132
|
+
elsif line.include?("Arch:")
|
133
|
+
handle_method_name = "get_arch"
|
134
|
+
puts "处理Arch..."
|
135
|
+
elsif line.include?("Object files")
|
136
|
+
handle_method_name = "handle_ojbect_files"
|
137
|
+
puts "处理Object files..."
|
138
|
+
elsif line.include?("Sections")
|
139
|
+
handle_method_name = "handle_sections"
|
140
|
+
puts "处理Sections..."
|
141
|
+
elsif line.include?("Symbols:") #symbols:和Dead Stripped Symbols处理一样
|
142
|
+
# 这里不处理Dead Stripped Symbols
|
143
|
+
if line.delete('#').strip.include?("Dead Stripped Symbols")
|
144
|
+
puts "不处理处理#{line.delete('#').strip}..."
|
145
|
+
break
|
146
|
+
end
|
147
|
+
puts "处理#{line.delete('#').strip}..."
|
148
|
+
handle_method_name = "handle_symbols"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
self.send(handle_method_name, line)
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
155
|
+
# 对linkmap进行解析,然后输出结果
|
156
|
+
def self.parser(path_para)
|
157
|
+
start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
|
158
|
+
# 获取link map file's name
|
159
|
+
link_map_file_name = path_para
|
160
|
+
puts "获取的文件路径为:#{link_map_file_name}"
|
161
|
+
if link_map_file_name.nil?
|
162
|
+
puts "请按照如下命令执行该脚本:"
|
163
|
+
puts "\033[31mItools parse **.txt \033[0m"
|
164
|
+
puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-arm64.txt,parse后面为绝对路径"
|
165
|
+
return
|
166
|
+
end
|
167
|
+
if File.exist?(link_map_file_name)
|
168
|
+
puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
|
169
|
+
else
|
170
|
+
puts "\033[31m#{link_map_file_name}文件不存在,请重新输入文件 \033[0m"
|
171
|
+
return
|
172
|
+
end
|
173
|
+
|
174
|
+
link_map = LinkMap.new(link_map_file_name)
|
175
|
+
link_map.handle_map #处理文件为对象,然后继续后续操作
|
176
|
+
link_map.handle_l_sym_map #处理symbols为hashmap
|
177
|
+
sizeResultArr = []
|
178
|
+
|
179
|
+
link_map.l_obj_files.each do |obj|
|
180
|
+
temp_file_name = obj.file_name.split("(")[0]
|
181
|
+
|
182
|
+
last_file = sizeResultArr.last
|
183
|
+
|
184
|
+
if last_file && temp_file_name.eql?(last_file.file_name)
|
185
|
+
last_file.file_serial_numers << obj.serial_number
|
186
|
+
else
|
187
|
+
sz_obj = SizeResult.new
|
188
|
+
sz_obj.file_name = temp_file_name
|
189
|
+
sz_obj.file_serial_numers << obj.serial_number
|
190
|
+
sizeResultArr << sz_obj
|
191
|
+
end
|
192
|
+
end
|
193
|
+
data_analyze_time = Time.now.to_i
|
194
|
+
puts "\033[32m数据分析完成,耗时#{data_analyze_time - start_time}秒。开始计算结果\033[0m"
|
195
|
+
|
196
|
+
# 计算赋值size,此处耗时较长
|
197
|
+
total_size = 0
|
198
|
+
sizeResultArr.each do |obj|
|
199
|
+
# 处理方法2
|
200
|
+
obj.file_serial_numers.each do |s_number|
|
201
|
+
begin
|
202
|
+
link_map.l_sym_map[s_number].each do |symb|
|
203
|
+
obj.size = obj.size + symb.s_size.hex
|
204
|
+
total_size = total_size +symb.s_size.hex #统计总大小
|
205
|
+
end
|
206
|
+
rescue => exception
|
207
|
+
end
|
208
|
+
end
|
209
|
+
# 处理方法1 太过耗时
|
210
|
+
# link_map.l_symbols.each do |symb|
|
211
|
+
# if obj.file_serial_numers.include?(symb.s_file_serial_number)
|
212
|
+
# obj.size = obj.size + symb.s_size.hex
|
213
|
+
# end
|
214
|
+
# end
|
215
|
+
# puts "正在计算#{obj.file_name}的大小..."
|
216
|
+
end
|
217
|
+
data_handle_time = Time.now.to_i #处理数据时间
|
218
|
+
puts "\033[32m数据处理完成,耗时#{data_handle_time - data_analyze_time}秒。开始对结果进行大小排序(从大到小)...\033[0m"
|
219
|
+
# 按照从大到小排序
|
220
|
+
sizeResultArr.sort_by!{|obj|[-obj.size]}
|
221
|
+
sort_handle_time = Time.now.to_i #排序耗时
|
222
|
+
puts "\033[32m数据排序完成,耗时#{sort_handle_time - data_handle_time}秒。开始输出结果:\033[0m"
|
223
|
+
puts "\033[32m--------------------------------\033[0m"
|
224
|
+
|
225
|
+
# 判断文件是否存在
|
226
|
+
save_file_path = SizeResult.getSaveFileName(path_para)
|
227
|
+
if File.exist?(save_file_path)
|
228
|
+
File.delete(save_file_path)
|
229
|
+
end
|
230
|
+
|
231
|
+
# 创建要保存数据的文件
|
232
|
+
Spreadsheet.client_encoding = 'utf-8'
|
233
|
+
book = Spreadsheet::Workbook.new
|
234
|
+
sheet1 = book.create_worksheet
|
235
|
+
sheet1.row(0)[0] = "文件名"
|
236
|
+
sheet1.row(0)[1] = "文件大小(B)"
|
237
|
+
sheet1.row(0)[2] = "文件大小"
|
238
|
+
sizeResultArr.each_with_index{|item, idx|
|
239
|
+
sheet1.row(idx+1)[0] = item.file_name
|
240
|
+
sheet1.row(idx+1)[1] = item.size
|
241
|
+
sheet1.row(idx+1)[2] = SizeResult.handleSize(item.size)
|
242
|
+
puts "#{item.file_name} " + SizeResult.handleSize(item.size)
|
243
|
+
}
|
244
|
+
book.write "#{save_file_path}"
|
245
|
+
# save_file = File.new(save_file_path,"w+")
|
246
|
+
# # 打印结果
|
247
|
+
# sizeResultArr.each do |obj|
|
248
|
+
# puts "#{obj.file_name} " + SizeResult.handleSize(obj.size)
|
249
|
+
# save_file.puts("#{obj.file_name} #{SizeResult.handleSize(obj.size)}(#{obj.size})")
|
250
|
+
# end
|
251
|
+
# save_file.puts("总大小为:#{SizeResult.handleSize(total_size)}")
|
252
|
+
# save_file.close
|
253
|
+
puts "总大小为(仅供参考):#{SizeResult.handleSize(total_size)}"
|
254
|
+
puts "\033[32m--------------------------------\033[0m"
|
255
|
+
end_time = Time.now.to_i #程序执行结束时间
|
256
|
+
puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
|
257
|
+
puts " "
|
258
|
+
puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
|
259
|
+
end
|
260
|
+
|
261
|
+
# 根据linkmap && folder计算占用
|
262
|
+
# 第一个参数为linkmap路径,第二个参数为要分析的项目文件夹
|
263
|
+
def self.parser_by_folder(args)
|
264
|
+
link_map_file_name = args[0] #linkmap文件路径
|
265
|
+
project_folder = args[1] #项目文件夹
|
266
|
+
# 对参数进行校验
|
267
|
+
if File::directory?(project_folder)
|
268
|
+
puts "获取的项目目录路径为:#{project_folder}"
|
269
|
+
else
|
270
|
+
puts "\033[31m#{project_folder}文件夹不存在,请重新输入 \033[0m"
|
271
|
+
return
|
272
|
+
end
|
273
|
+
if File.exist?(link_map_file_name)
|
274
|
+
puts "获取的linkmap文件路径为:#{link_map_file_name}"
|
275
|
+
puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
|
276
|
+
else
|
277
|
+
puts "\033[31m#{link_map_file_name}文件不存在,请重新输入 \033[0m"
|
278
|
+
return
|
279
|
+
end
|
280
|
+
# 开始处理数据
|
281
|
+
link_map = LinkMap.new(link_map_file_name)
|
282
|
+
link_map.handle_map #处理文件为对象,然后继续后续操作
|
283
|
+
link_map.handle_l_sym_map #处理symbols为hashmap
|
284
|
+
|
285
|
+
# 所有的文件
|
286
|
+
link_map.l_obj_files
|
287
|
+
# 所有的symbols
|
288
|
+
link_map.l_symbols
|
289
|
+
|
290
|
+
# 处理得到每个obj_file的大小
|
291
|
+
link_map.l_obj_files.each do |obj|
|
292
|
+
if link_map.l_sym_map[obj.serial_number]
|
293
|
+
link_map.l_sym_map[obj.serial_number].each do |symb|
|
294
|
+
obj.o_size = obj.o_size + symb.s_size.hex
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
# key为文件名,value为ojbect
|
299
|
+
sort_by_obj_files_map = link_map.l_obj_files.group_by(&:o_name)
|
300
|
+
# save_file_path = SizeResult.getSaveFileName(project_folder)
|
301
|
+
# save_file = File.new(save_file_path,"w+")
|
302
|
+
# sort_by_obj_files_map.keys.each do |sss|
|
303
|
+
|
304
|
+
# save_file.puts("#{sort_by_obj_files_map[sss][0].o_name} #{sort_by_obj_files_map[sss][0].o_size}")
|
305
|
+
# end
|
306
|
+
# save_file.close
|
307
|
+
# exit
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
size_results = [] #盛放计算结果
|
312
|
+
size_files = []
|
313
|
+
space_index = 0
|
314
|
+
puts "计算开始"
|
315
|
+
traverse_dir(sort_by_obj_files_map,project_folder,size_results,size_files,space_index)
|
316
|
+
size_results.reverse!
|
317
|
+
# 存储为文件
|
318
|
+
save_file_path = SizeResult.getSaveFileName(project_folder)
|
319
|
+
if File.exist?(save_file_path)
|
320
|
+
File.delete(save_file_path)
|
321
|
+
end
|
322
|
+
save_file = File.new(save_file_path,"w+")
|
323
|
+
o_index = 2
|
324
|
+
size_results.each do |o|
|
325
|
+
result_str = "#{' ' * o.space_count}├── #{o.folder_name.split('/').last} #{SizeResult.handleSize(o.size)}(#{o.size})"
|
326
|
+
save_file.puts(result_str)
|
327
|
+
end
|
328
|
+
save_file.close
|
329
|
+
puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
|
330
|
+
end
|
331
|
+
def self.traverse_dir(sort_by_obj_files_map,file_path,results,size_files,space_index)
|
332
|
+
s_result = SizeResult.new
|
333
|
+
s_result.folder_name = file_path
|
334
|
+
space_index = space_index + 2
|
335
|
+
file_name_arr = [] #盛放计算过的类
|
336
|
+
Find.find(file_path) do |file|
|
337
|
+
# 不包含图片
|
338
|
+
if File.file?(file) && !(File.extname(file) =~ /(png|gif|jpg|bmp|jpeg)/)
|
339
|
+
file_name = File.basename(file,".*")
|
340
|
+
if !file_name_arr.include?(file_name) && sort_by_obj_files_map[file_name] #没有已经计算过
|
341
|
+
s_result.size = s_result.size + sort_by_obj_files_map[file_name][0].o_size
|
342
|
+
file_name_arr << file_name
|
343
|
+
end
|
344
|
+
elsif File::directory?(file) && file != file_path
|
345
|
+
traverse_dir(sort_by_obj_files_map,file,results,size_files,space_index)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
if s_result.size > 0 && !size_files.include?(s_result.folder_name)
|
349
|
+
s_result.space_count = space_index
|
350
|
+
results << s_result
|
351
|
+
size_files << s_result.folder_name
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
class SizeResult
|
356
|
+
attr_accessor :file_name, :file_serial_numers, :size,:folder_name, :space_count
|
357
|
+
def initialize
|
358
|
+
@file_serial_numers = []
|
359
|
+
@size = 0
|
360
|
+
end
|
361
|
+
# size字符化
|
362
|
+
def self.handleSize(size)
|
363
|
+
if size > 1024 * 1024
|
364
|
+
return format("%.2f",(size.to_f/(1024*1024))) + "MB"
|
365
|
+
elsif size > 1024
|
366
|
+
return format("%.2f",(size.to_f/1024)) + "KB"
|
367
|
+
else
|
368
|
+
return size.to_s + "B"
|
369
|
+
end
|
370
|
+
end
|
371
|
+
# 获取结果文件保存到目录
|
372
|
+
def self.getSaveFileName(path_para)
|
373
|
+
path = Pathname.new(path_para)
|
374
|
+
# 要保存的地址
|
375
|
+
save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result(#{Time.new.strftime("%Y%m%d%H%M%S")}).xls"
|
376
|
+
return save_file_path
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
# --------------------------------- Size utils class ---------------------------------
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module BBItools
|
2
|
+
class PodInfo
|
3
|
+
attr_accessor :pod_name, :pod_version
|
4
|
+
def initialize(name, version)
|
5
|
+
@pod_name = name
|
6
|
+
@pod_version = version
|
7
|
+
end
|
8
|
+
end
|
9
|
+
class PodfileTiled
|
10
|
+
def self.podfile_tiled(args)
|
11
|
+
all_pods = [] #所有依赖的pod
|
12
|
+
exist_pods = [] #当前podfile已经存在的pod
|
13
|
+
need_add_pods = [] #当前需要添加到podfile中的pod
|
14
|
+
pod_tag = 1
|
15
|
+
|
16
|
+
fileInfo = File.open(args[0])
|
17
|
+
|
18
|
+
total_index = 0
|
19
|
+
fileInfo.each_line do |line|
|
20
|
+
line_string = line.delete("\n")
|
21
|
+
if line_string == 'PODS:'
|
22
|
+
# 配置成功,后续请直接使用git commit ,不要加 -m\033[0m
|
23
|
+
puts "\033[32m开始分析依赖\033[0m"
|
24
|
+
pod_tag = 1
|
25
|
+
next
|
26
|
+
elsif line_string == 'DEPENDENCIES:'
|
27
|
+
puts "\033[32m开始分析当前Podfile中已添加的依赖项\033[0m"
|
28
|
+
pod_tag = 2
|
29
|
+
next
|
30
|
+
elsif line_string == 'SPEC REPOS:'
|
31
|
+
pod_tag = 0
|
32
|
+
puts "\033[32mpodfile.lock分析结束\033[0m"
|
33
|
+
end
|
34
|
+
|
35
|
+
if pod_tag == 1 #分析所有pod
|
36
|
+
if line_string[0, 3] == ' -' && !line_string.include?('/')
|
37
|
+
# puts line_string
|
38
|
+
pod_version = line_string[/\((.*?)\)/, 1]
|
39
|
+
pod_name =
|
40
|
+
line_string.gsub(pod_version, '').delete('(').delete(')').delete(
|
41
|
+
':'
|
42
|
+
).delete('-').strip
|
43
|
+
temp_pod = PodInfo.new(pod_name, pod_version)
|
44
|
+
all_pods << temp_pod
|
45
|
+
puts "查找到pod库:#{pod_name}, 版本号为:'#{pod_version}' #{all_pods.length}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if pod_tag == 2 #分析当前podfile已经有的pod
|
50
|
+
pod_name
|
51
|
+
pod_version = line_string[/\((.*?)\)/, 1]
|
52
|
+
if pod_version
|
53
|
+
pod_name =
|
54
|
+
line_string.gsub(pod_version, '').delete('(').delete(')').delete(
|
55
|
+
':'
|
56
|
+
).delete('-').strip
|
57
|
+
else
|
58
|
+
pod_name = line_string.delete('-').lstrip.rstrip
|
59
|
+
end
|
60
|
+
# if pod_name.length == 0 || pod_name.include?('/')
|
61
|
+
# next
|
62
|
+
# end
|
63
|
+
temp_pod = PodInfo.new(pod_name, pod_version)
|
64
|
+
if pod_version
|
65
|
+
temp_pod.pod_version = pod_version.delete('=').strip
|
66
|
+
end
|
67
|
+
|
68
|
+
exist_pods << temp_pod
|
69
|
+
puts "Podfile中已包含 #{pod_name}, 版本号为:'#{pod_version}'"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
temp_exist_pods = []
|
73
|
+
all_pods.each do |all_pod|
|
74
|
+
exist_pods.each do |exist_pod|
|
75
|
+
exist_pod_name = exist_pod.pod_name
|
76
|
+
if exist_pod_name.include?('/')
|
77
|
+
exist_pod_name = exist_pod_name.split('/')[0]
|
78
|
+
end
|
79
|
+
if all_pod.pod_name == exist_pod_name
|
80
|
+
temp_exist_pods << all_pod
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
need_add_pods = all_pods - temp_exist_pods
|
86
|
+
if need_add_pods.length == 0
|
87
|
+
puts "\033[32m恭喜!!!无需平铺,当前已全部平铺\033[0m"
|
88
|
+
else
|
89
|
+
puts "\033[32m以下为要平铺的库,直接复制粘贴至Podfile中即可:\033[0m"
|
90
|
+
need_add_pods.each do |to_add|
|
91
|
+
puts "pod '#{to_add.pod_name}', '#{to_add.pod_version}'"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|