cocoapods-bb-PodAssistant 0.3.7.1 → 0.3.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd0ad4c8d3ffd50eeacacccf5b14c1e06d90285e758cbe01582c03bdee76bccc
|
4
|
+
data.tar.gz: c1af2d87d63817d54a848d172126489009be2e43b946688c65a77341ee6f7fcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24724856a947cd524403bcf618286125d18655f01f5f5c219402ed03bd4e5afc0f3518f74be39937a42332cee0fbf4b1f59a8b0588ad66719c01c80828f76216
|
7
|
+
data.tar.gz: 8de6194b110fc57f7cf9c6d96c04ef7c53a0bc4bf78f399ad37e04ca1139243504a5396d5db0fa086c9db6b1d42e6932b32a5300eb9dabf4e5eaa1fd3a830b82
|
data/README.md
CHANGED
@@ -57,4 +57,22 @@ pod stable update [组件名称] --sync
|
|
57
57
|
* Build the component itself with a static framework
|
58
58
|
```
|
59
59
|
pod 'xxx', :linkage => :static
|
60
|
-
```
|
60
|
+
```
|
61
|
+
|
62
|
+
## 可执行文件
|
63
|
+
|
64
|
+
* Tools工具集使用
|
65
|
+
|
66
|
+
```
|
67
|
+
bb_tools --help
|
68
|
+
```
|
69
|
+
|
70
|
+
* pp文件加密
|
71
|
+
```
|
72
|
+
match_encrypt [password] [input_path] [output_path]
|
73
|
+
```
|
74
|
+
|
75
|
+
* pp文件解密
|
76
|
+
```
|
77
|
+
match_decrypt [password] [input_path] [output_path]
|
78
|
+
```
|
data/bin/bb_tools
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
require 'colored2'
|
4
|
+
require 'cocoapods-bb-PodAssistant'
|
5
|
+
|
6
|
+
include GLI::App
|
7
|
+
|
8
|
+
program_desc '内部命令行工具, 为iOS开发者提供的工具集合'
|
9
|
+
version CocoapodsBbPodassistant::VERSION
|
10
|
+
|
11
|
+
def usage
|
12
|
+
puts "USAGE: bb_tools command [args]".yellow
|
13
|
+
run(ARGV)
|
14
|
+
exit(-1)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "解析linkmap"
|
18
|
+
arg 'LinkMap-normal-arm64.txt'
|
19
|
+
command :parse do |c|
|
20
|
+
c.action do |global_options, options, args|
|
21
|
+
if args.size == 0
|
22
|
+
usage
|
23
|
+
elsif args.size == 1
|
24
|
+
BBItools::LinkMap.parser(args[0])
|
25
|
+
else
|
26
|
+
BBItools::LinkMap.parser_by_folder(args)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "在文件夹或文件中查找字符串(或者字符串组)"
|
32
|
+
arg 'xxx.txt'
|
33
|
+
command :search do |c|
|
34
|
+
c.action do |global_options, options, args|
|
35
|
+
BBItools::StringSearcher.search_result(args[0],args[1])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
# 查找工程中没有用到的图片
|
39
|
+
desc "查找无用图片"
|
40
|
+
arg 'xxx.txt'
|
41
|
+
command :find do |c|
|
42
|
+
c.action do |global_options, options, args|
|
43
|
+
BBItools::ImgFinder.find(args[0])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
# 查找Xcode工程中没有用到的类
|
47
|
+
desc "查找无用类"
|
48
|
+
arg 'xxx.txt'
|
49
|
+
command :search_unuse_class do |c|
|
50
|
+
c.action do |global_options, options, args|
|
51
|
+
BBItools::ClassFinder.search_unuse_class(args)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# 计算占用内存大小
|
56
|
+
desc "计算文件或者文件夹占用内存大小"
|
57
|
+
arg 'xxx.txt'
|
58
|
+
command :size_for do |c|
|
59
|
+
c.action do |global_options, options, args|
|
60
|
+
BBItools::Memory.sizeFor(args)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# 查找文件
|
65
|
+
desc "查找文件"
|
66
|
+
arg 'file name'
|
67
|
+
command :search_file do |c|
|
68
|
+
c.action do |global_options, options, args|
|
69
|
+
BBItools::FileSearcher.searchFile(args)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# 统计代码行数
|
74
|
+
desc "统计代码行数"
|
75
|
+
arg 'file name or folder'
|
76
|
+
command :count_code_line do |c|
|
77
|
+
c.action do |global_options, options, args|
|
78
|
+
BBItools::CodeCouner.count_line(args)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#本地commit规范化
|
83
|
+
desc "hook本地commit,然后进行规commit lint范化"
|
84
|
+
arg 'git项目根目录 or 可空'
|
85
|
+
command :lint do |c|
|
86
|
+
c.action do |global_options,options, args|
|
87
|
+
BBItools::GitSets.commit_msg_init(args)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
#podfile.lock库平铺
|
92
|
+
desc "可以将podfile.lock中所有的依赖平铺至Podifle中"
|
93
|
+
arg 'podfile.lock'
|
94
|
+
command :podfile_tiled do |c|
|
95
|
+
c.action do |global_options,options, args|
|
96
|
+
BBItools::PodfileTiled.podfile_tiled(args)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
exit run(ARGV)
|
@@ -64,6 +64,11 @@ def getCaseNumber
|
|
64
64
|
val = BB::PodUtils.getValueFromInfoPlist("CaseNumber")
|
65
65
|
return val
|
66
66
|
end
|
67
|
+
# 产品id
|
68
|
+
def getProductID
|
69
|
+
val = BB::PodUtils.getValueFromInfoPlist("ProductId")
|
70
|
+
return val
|
71
|
+
end
|
67
72
|
|
68
73
|
# 获取工程包名
|
69
74
|
def getProjectBundleIdentifier
|
@@ -81,19 +86,19 @@ end
|
|
81
86
|
# 是否汉字产品
|
82
87
|
def isHanZiApp
|
83
88
|
bundleId = getProjectBundleIdentifier()
|
84
|
-
return bundleId === "com.sinyee.babybus.homeland"
|
89
|
+
return bundleId === "com.sinyee.babybus.homeland" || getProductID() === "3108"
|
85
90
|
end
|
86
91
|
|
87
92
|
# 是否奇妙屋产品
|
88
93
|
def isQMWApp
|
89
94
|
bundleId = getProjectBundleIdentifier()
|
90
|
-
return bundleId === "com.sinyee.babybus.talk2kiki"
|
95
|
+
return bundleId === "com.sinyee.babybus.talk2kiki" || getProductID() === "3132"
|
91
96
|
end
|
92
97
|
|
93
98
|
# 是否拼音产品
|
94
99
|
def isPinyinAppp
|
95
100
|
bundleId = getProjectBundleIdentifier()
|
96
|
-
return bundleId === "com.sinyee.babybus.voicerecognition" || bundleId === "com.sinyee.babybus.read.ios" || bundleId === "com.sinyee.babybus.stroke"
|
101
|
+
return bundleId === "com.sinyee.babybus.voicerecognition" || bundleId === "com.sinyee.babybus.read.ios" || bundleId === "com.sinyee.babybus.stroke" || getProductID() === "3110"
|
97
102
|
end
|
98
103
|
|
99
104
|
# 是否科学产品
|
@@ -8,4 +8,6 @@ require 'cocoapods-bb-PodAssistant/babybus/stable/podfile-linkline'
|
|
8
8
|
require 'cocoapods-bb-PodAssistant/command/linkline'
|
9
9
|
require 'cocoapods-bb-PodAssistant/babybus/linkline/target-linkline'
|
10
10
|
require 'cocoapods-bb-PodAssistant/babybus/linkline/targetdefinition-linkline'
|
11
|
-
require 'cocoapods-bb-PodAssistant/babybus/linkline/targetValidator-linkline'
|
11
|
+
require 'cocoapods-bb-PodAssistant/babybus/linkline/targetValidator-linkline'
|
12
|
+
# tool
|
13
|
+
require 'cocoapods-bb-PodAssistant/tools'
|
@@ -356,8 +356,20 @@ module BB
|
|
356
356
|
stable_specs.push(data)
|
357
357
|
end
|
358
358
|
elsif pod.is_a? String
|
359
|
-
#
|
360
|
-
|
359
|
+
# 这种情况pod 为版本, 需要从podfile_hash 查询额外信息
|
360
|
+
podInfo = podfile_hash.fetch(name, {})
|
361
|
+
linkages = podInfo.fetch(:linkages, "") # 如果 :linkages 不存在,返回空字符串
|
362
|
+
linkage = podInfo.fetch(:linkage, "") # 同上
|
363
|
+
if !linkages.empty?
|
364
|
+
# puts "===git===标签==> { podInfo: [\"#{podInfo}\"], linkages: #{linkages} }".green
|
365
|
+
stable_specs.push({ names: [name], version: pod, method: REMOTE_TAG, linkages: linkages})
|
366
|
+
elsif !linkage.empty?
|
367
|
+
# puts "===git===标签==> { podInfo: [\"#{podInfo}\"], linkage: #{linkage} }".green
|
368
|
+
stable_specs.push({ names: [name], version: pod, method: REMOTE_TAG, linkage: linkage})
|
369
|
+
else
|
370
|
+
# puts "===git===标签==> { podInfo: [\"#{podInfo}\"] }".green
|
371
|
+
stable_specs.push({ names: [name], version: pod, method: REMOTE_TAG })
|
372
|
+
end
|
361
373
|
else
|
362
374
|
puts "unknow type [#{name}] data:#{pod}".red
|
363
375
|
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'find'
|
2
|
+
module BBItools
|
3
|
+
class ClassFinder
|
4
|
+
attr_accessor :search_path, :classes, :search_in_files
|
5
|
+
def initialize(temp_search_path)
|
6
|
+
@search_path = temp_search_path
|
7
|
+
@classes = []
|
8
|
+
@search_in_files = []
|
9
|
+
end
|
10
|
+
def search
|
11
|
+
# 找到所有的.h以及所有要查找的文件
|
12
|
+
Find.find(@search_path) do |path|
|
13
|
+
if File.file?(path)
|
14
|
+
if !get_not_contain_file_ext.include?(File.extname(path))
|
15
|
+
@search_in_files << path
|
16
|
+
end
|
17
|
+
|
18
|
+
if File.extname(path).eql?(".h")
|
19
|
+
ff_result = ClassFindResult.new(File.basename(path,".h"),path)
|
20
|
+
@classes << ff_result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# 删除使用的文件
|
26
|
+
use_idxs = Set.new
|
27
|
+
@search_in_files.each{|s_file|
|
28
|
+
s_containet = ""
|
29
|
+
File.read(s_file).each_line do |line|
|
30
|
+
s_containet << line
|
31
|
+
s_containet << ","
|
32
|
+
end
|
33
|
+
# 查找所有文件在单个文件中是否被引用
|
34
|
+
@classes.each_with_index{|f_result,idx|
|
35
|
+
search_file_no_ext = get_no_ext_path(s_file)
|
36
|
+
check_file_no_ext = get_no_ext_path(f_result.fr_path)
|
37
|
+
# 判断是否是同一个文件或者是通文件的.m/.h,不是同一个文件才查找
|
38
|
+
if !check_file_no_ext.eql?(search_file_no_ext)
|
39
|
+
inheritance_str = ": #{f_result.fr_name}"
|
40
|
+
contain_str = '@"' + f_result.fr_name + '"'
|
41
|
+
reference_str = "#{f_result.fr_name}.h"
|
42
|
+
|
43
|
+
# if s_containet.match(/: #{f_result.fr_name}|@"#{f_result.fr_name}"|#{f_result.fr_name}.h/) != nil
|
44
|
+
if s_containet.include?(inheritance_str) or s_containet.include?(contain_str) or s_containet.include?(reference_str)
|
45
|
+
use_idxs << f_result
|
46
|
+
puts "#{f_result.fr_name}已使用,剩余查找文件数#{@classes.size - use_idxs.size}..."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
}
|
50
|
+
|
51
|
+
}
|
52
|
+
final_result = []
|
53
|
+
|
54
|
+
temp_final_result_str = ''
|
55
|
+
use_idxs.to_a.each {|u_x|
|
56
|
+
temp_final_result_str << u_x.fr_name
|
57
|
+
temp_final_result_str << ","
|
58
|
+
}
|
59
|
+
@classes.delete_if {|find_result| temp_final_result_str.include?(find_result.fr_name) }
|
60
|
+
puts "\033[32m查找结束,共同无用文件#{@classes.size}个,如下:\033[0m"
|
61
|
+
Spreadsheet.client_encoding = 'utf-8'
|
62
|
+
book = Spreadsheet::Workbook.new
|
63
|
+
sheet1 = book.create_worksheet
|
64
|
+
sheet1.row(0)[0] = "序号"
|
65
|
+
sheet1.row(0)[1] = "文件名"
|
66
|
+
sheet1.row(0)[2] = "文件路径"
|
67
|
+
sheet1.row(0)[3] = "文件占用内存大小"
|
68
|
+
total_size = 0
|
69
|
+
@classes.each_with_index{|r_item,f_index|
|
70
|
+
# if !r_item.fr_name.include?("+")
|
71
|
+
total_size = total_size + File.size(r_item.fr_path)
|
72
|
+
# end
|
73
|
+
puts r_item.fr_name
|
74
|
+
sheet1.row(f_index+1)[0] = f_index + 1
|
75
|
+
sheet1.row(f_index+1)[1] = r_item.fr_name
|
76
|
+
sheet1.row(f_index+1)[2] = r_item.fr_path
|
77
|
+
sheet1.row(f_index+1).height = 20
|
78
|
+
}
|
79
|
+
sheet1.column(0).width = 4
|
80
|
+
sheet1.column(1).width = 45
|
81
|
+
sheet1.column(2).width = 100
|
82
|
+
book.write "#{@search_path}/search_unuseclass_result.xls"
|
83
|
+
puts "\033[32m文件已经保存到#{@search_path}/search_unuseclass_result.xls,无用文件#{@classes.size}个,预计可减少内存占用#{handleSize(total_size)}\033[0m"
|
84
|
+
end
|
85
|
+
# 大小格式化
|
86
|
+
def handleSize(size)
|
87
|
+
if size > 1024 * 1024
|
88
|
+
return format("%.2f",(size.to_f/(1024*1024))) + "MB"
|
89
|
+
elsif size > 1024
|
90
|
+
return format("%.2f",(size.to_f/1024)) + "KB"
|
91
|
+
else
|
92
|
+
return size.to_s + "B"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
# 不包含后缀的路径
|
96
|
+
def get_no_ext_path(item)
|
97
|
+
return File.dirname(item) + "/" + File.basename(item,".*")
|
98
|
+
end
|
99
|
+
# 不需要查找的类
|
100
|
+
def get_not_contain_file_ext
|
101
|
+
nc_ext = [".jpg",".png",".md",".xls",".xcworkspace",".DS_Store",""]
|
102
|
+
return nc_ext
|
103
|
+
end
|
104
|
+
# 对外暴露
|
105
|
+
def self.search_unuse_class(args)
|
106
|
+
folder_path = args[0]
|
107
|
+
if folder_path.nil?
|
108
|
+
puts "\033[31m传入的参数不能为空\033[0m"
|
109
|
+
return
|
110
|
+
end
|
111
|
+
if !File::directory?(folder_path)
|
112
|
+
puts "\033[31m参数不是文件夹\033[0m"
|
113
|
+
return
|
114
|
+
end
|
115
|
+
class_finder = ClassFinder.new(folder_path)
|
116
|
+
class_finder.search
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# ------------------------查找结果类------------------------
|
121
|
+
|
122
|
+
class ClassFindResult
|
123
|
+
attr_accessor :fr_name, :fr_path
|
124
|
+
def initialize(temp_name,temp_path)
|
125
|
+
@fr_name = temp_name
|
126
|
+
@fr_path = temp_path
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# 设置默认编码
|
2
|
+
Encoding.default_external = Encoding::UTF_8
|
3
|
+
Encoding.default_internal = Encoding::UTF_8
|
4
|
+
|
5
|
+
require 'find'
|
6
|
+
module BBItools
|
7
|
+
class CodeCouner
|
8
|
+
attr_accessor :file_path, :line_number
|
9
|
+
def initialize(path)
|
10
|
+
@file_path = path
|
11
|
+
@line_number = 0
|
12
|
+
end
|
13
|
+
# 统计行数
|
14
|
+
def calculate_line_number
|
15
|
+
puts "\033[33m正在统计#{@file_path} 代码行数,请稍后...\033[0m"
|
16
|
+
if File.file?(@file_path)
|
17
|
+
File.read(@file_path).each_line do |line|
|
18
|
+
if line.match(/^\/\/|^$/) == nil #去掉单行注释和空行
|
19
|
+
@line_number = @line_number + 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
return
|
24
|
+
end
|
25
|
+
if File::directory?(@file_path)
|
26
|
+
Find.find(@file_path) do |file|
|
27
|
+
if File.file?(file) #判断是否是文件
|
28
|
+
#只统计.h/.m/.mm/.cpp/.swift几个文件
|
29
|
+
# if File.extname(file).match(/^.[hm]m?$|.cpp|.swift/)
|
30
|
+
if File.extname(file).match(/\.(h|hpp|m|mm|cpp|swift)$/)
|
31
|
+
File.read(file).each_line do |line|
|
32
|
+
if line.match(/^\/\/|^$/) == nil #去掉单行注释和空行
|
33
|
+
@line_number = @line_number + 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return
|
40
|
+
end
|
41
|
+
puts "\033[31m找不到指定路径的文件或者文件夹,请重新输入路径\033[0m"
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.count_line(args)
|
45
|
+
file = args[0]
|
46
|
+
if file.nil?
|
47
|
+
puts "\033[31m参数异常,请传入一个参数(项目目录/要统计的文件目录/要统计的文件)\033[0m"
|
48
|
+
return
|
49
|
+
end
|
50
|
+
counter = CodeCouner.new(file)
|
51
|
+
counter.calculate_line_number
|
52
|
+
puts "\033[32m统计#{counter.file_path}结束,共#{counter.line_number}行\033[0m"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'spreadsheet'
|
3
|
+
module BBItools
|
4
|
+
class FileResult
|
5
|
+
attr_accessor :keyword, :file_path, :file_name
|
6
|
+
def initialize(temp_path,temp_name)
|
7
|
+
@file_path = temp_path
|
8
|
+
@file_name = temp_name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
class FileSearcher
|
12
|
+
# path:搜索的路径,files要搜索的文件,支持数组用逗号隔开即可。支持模糊搜索
|
13
|
+
attr_accessor :path ,:files, :search_result
|
14
|
+
def initialize(temp_path,temp_files)
|
15
|
+
@path = temp_path
|
16
|
+
@files = temp_files
|
17
|
+
@search_result = []
|
18
|
+
end
|
19
|
+
def search
|
20
|
+
puts "\033[32m开始查找...\033[0m"
|
21
|
+
if File::directory?(@path)
|
22
|
+
Find.find(@path) do |file|
|
23
|
+
if File.file?(file)
|
24
|
+
file_name = File.basename(file)
|
25
|
+
if file_name.include?(@files)
|
26
|
+
fr = FileResult.new(file,file_name)
|
27
|
+
@search_result << fr
|
28
|
+
end
|
29
|
+
else
|
30
|
+
# puts "查找#{file}..."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
puts "\033[31m文件夹有误,请输入文件夹路径作为第一个参数\033[0m"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
# 对外暴露方法
|
38
|
+
def self.searchFile(args)
|
39
|
+
path = args[0]
|
40
|
+
files = args[1]
|
41
|
+
if path.nil? || files.nil?
|
42
|
+
puts "\033[31m参数异常,请传入两个参数,第一个为路径,第二个为要搜索的文件名\033[0m"
|
43
|
+
return
|
44
|
+
end
|
45
|
+
# temp_files = files.split(",")
|
46
|
+
file_searcher = FileSearcher.new(path,files)
|
47
|
+
file_searcher.search
|
48
|
+
if file_searcher.search_result.size == 0
|
49
|
+
puts "\033[32m没有找到符合条件的文件\033[0m"
|
50
|
+
return
|
51
|
+
end
|
52
|
+
# 输出
|
53
|
+
# 输出搜索的内容
|
54
|
+
|
55
|
+
Spreadsheet.client_encoding = 'utf-8'
|
56
|
+
book = Spreadsheet::Workbook.new
|
57
|
+
sheet1 = book.create_worksheet
|
58
|
+
sheet1.row(0)[0] = "序号"
|
59
|
+
sheet1.row(0)[1] = "文件名"
|
60
|
+
sheet1.row(0)[2] = "文件所在路径"
|
61
|
+
|
62
|
+
|
63
|
+
puts "\033[32m找到共#{file_searcher.search_result.size}个文件结果如下;\033[0m"
|
64
|
+
file_searcher.search_result.each_with_index {|item,i|
|
65
|
+
puts item.file_name
|
66
|
+
sheet1.row(i+1)[0] = i + 1
|
67
|
+
sheet1.row(i+1)[1] = item.file_name
|
68
|
+
sheet1.row(i+1)[2] = item.file_path
|
69
|
+
sheet1.row(i+1).height = 20
|
70
|
+
}
|
71
|
+
sheet1.column(0).width = 4
|
72
|
+
sheet1.column(1).width = 45
|
73
|
+
sheet1.column(2).width = 100
|
74
|
+
book.write "#{File.dirname(path)}/search_#{files}_result.xls"
|
75
|
+
puts "\033[32m查找成功,共#{file_searcher.search_result.size}个文件,内容已经保存到#{File.dirname(path)}/search_#{files}_result.xls,请点击查看\033[0m"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'spreadsheet'
|
3
|
+
module BBItools
|
4
|
+
class FindResult
|
5
|
+
attr_accessor :name , :path
|
6
|
+
def initialize(name,path)
|
7
|
+
@name = name
|
8
|
+
@path = path
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
# --------------------------------------------
|
13
|
+
class ImgFinder
|
14
|
+
#
|
15
|
+
attr_accessor :image_count, :images, :unuse_images,:find_path
|
16
|
+
attr_accessor :search_files
|
17
|
+
def initialize
|
18
|
+
@image_count = 0
|
19
|
+
@images = []
|
20
|
+
@search_files = []
|
21
|
+
end
|
22
|
+
# 得到所有图片名称字符
|
23
|
+
def get_img_name_strs
|
24
|
+
result_arr = []
|
25
|
+
@images.each {|item|
|
26
|
+
item_name = Image.get_image_name(File.basename(item.name, ".*"))
|
27
|
+
result_arr << item_name
|
28
|
+
}
|
29
|
+
return result_arr
|
30
|
+
end
|
31
|
+
def get_image_path(image)
|
32
|
+
@images.each {|item|
|
33
|
+
if item.name.eql?(image)
|
34
|
+
return item.path
|
35
|
+
end
|
36
|
+
}
|
37
|
+
end
|
38
|
+
# 查找
|
39
|
+
def self.find(temp_find_dir)
|
40
|
+
imgFinder = ImgFinder.new
|
41
|
+
imgFinder.find_path = temp_find_dir
|
42
|
+
# 第一步:找到该文件夹下所有的图片文件
|
43
|
+
Find.find(temp_find_dir) do |filename|
|
44
|
+
if File.file?(filename) #如果是文件,则从文件中查找,忽略文件夹
|
45
|
+
if Image.is_image_format(File.extname(filename))
|
46
|
+
# p File.basename(filename)
|
47
|
+
# exit
|
48
|
+
imgFinder.image_count = imgFinder.image_count + 1
|
49
|
+
imageResult = FindResult.new(Image.get_image_name(File.basename(filename,".*")),filename)
|
50
|
+
imgFinder.images << imageResult
|
51
|
+
elsif File.extname(filename).eql?(".m") || File.extname(filename).eql?(".swift")
|
52
|
+
imgFinder.search_files << filename
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
if imgFinder.images.size == 0
|
57
|
+
puts "\033[32m查找成功,未发现图片\033[0m"
|
58
|
+
return
|
59
|
+
else
|
60
|
+
puts "\033[32m查找成功,共发现图片#{imgFinder.images.size}张\033[0m"
|
61
|
+
end
|
62
|
+
# 第二步:找到图片是否使用
|
63
|
+
imags = imgFinder.get_img_name_strs.uniq #要查找的图片名称数组
|
64
|
+
|
65
|
+
puts "\033[32m需要查找的图片有#{imags.size}张\033[0m"
|
66
|
+
# imgFinder.search_files #要查找的文件
|
67
|
+
imgFinder.search_files.each {|file|
|
68
|
+
File.read(file).each_line do |line|
|
69
|
+
haveStr = StringHandle.containsStr(line,imags)
|
70
|
+
if haveStr != -1
|
71
|
+
puts "#{imags[haveStr]}在使用...,剩余查找项#{imags.size-1}个"
|
72
|
+
imags.delete_at(haveStr)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
}
|
76
|
+
puts "\033[32m无用图片#{imags.size}张,图片名称如下:\033[0m"
|
77
|
+
unuse_total_size = 0
|
78
|
+
|
79
|
+
Spreadsheet.client_encoding = 'utf-8'
|
80
|
+
book = Spreadsheet::Workbook.new
|
81
|
+
sheet1 = book.create_worksheet
|
82
|
+
sheet1.row(0)[0] = "文件名"
|
83
|
+
sheet1.row(0)[1] = "文件路径"
|
84
|
+
sheet1.row(0)[2] = "文件大小(B)"
|
85
|
+
imags.each_with_index {|item,idx|
|
86
|
+
sheet1.row(idx+1)[0] = item
|
87
|
+
path = imgFinder.get_image_path(item)
|
88
|
+
sheet1.row(idx+1)[1] = path
|
89
|
+
unuse_total_size = unuse_total_size + File.size(path)
|
90
|
+
sheet1.row(idx+1)[2] = File.size(path)
|
91
|
+
puts item
|
92
|
+
}
|
93
|
+
book.write "#{imgFinder.find_path}/search_result.xls"
|
94
|
+
puts "\033[32m文件已经保存到#{imgFinder.find_path}/search_result.xls,无用图片大小:#{unuse_total_size}B\033[0m"
|
95
|
+
puts "\033[32m内容仅供参考,具体还要自己通过结果查看一下\033[0m"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
# 字符串操作类
|
99
|
+
class StringHandle
|
100
|
+
# originStr中是否包含targetStrs中的内容
|
101
|
+
def self.containsStr(originStr,targetStrs)
|
102
|
+
targetStrs.each_with_index {|item,idx|
|
103
|
+
if originStr.include?(item)
|
104
|
+
return idx
|
105
|
+
end
|
106
|
+
}
|
107
|
+
return -1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# ----------------------------
|
111
|
+
class Image
|
112
|
+
|
113
|
+
# 是否是图片格式,这里只判断了jpg、png和gif
|
114
|
+
def self.is_image_format(temp_ext_name)
|
115
|
+
if ['.jpg','.png','.gif'].include?(temp_ext_name)
|
116
|
+
return true
|
117
|
+
else
|
118
|
+
return false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
def self.get_image_name(file)
|
122
|
+
return file.gsub(/@2x|@3x/,"")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
# class ObjectiveC
|
126
|
+
# def self.is_h_file(temp_ext_name)
|
127
|
+
# if ['.h']
|
128
|
+
|
129
|
+
# end
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
end
|