cocoapods-jxedt 0.0.9 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cocoapods-jxedt/binary/config.rb +5 -0
- data/lib/cocoapods-jxedt/binary/helper/prebuild_sandbox.rb +112 -2
- data/lib/cocoapods-jxedt/binary/hooks/pre_install.rb +6 -2
- data/lib/cocoapods-jxedt/binary/targets/pod_target.rb +50 -0
- data/lib/cocoapods-jxedt/command/header/header.rb +38 -7
- data/lib/cocoapods-jxedt/command/jxedt.rb +1 -0
- data/lib/cocoapods-jxedt/command/statistics/statistics.rb +98 -0
- data/lib/cocoapods-jxedt/gem_version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad01cd6bd2da4418b03764271caab2236a186ea81f3c9f77a885910d12263d78
|
4
|
+
data.tar.gz: aa9f410bbbea81420a9d04f01c379428aece86e8449c9ec10a461a79d03825fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0a5d962b702c2fde4f3ac10a81e027ba555f72310b31fee0530e94587eb7e56019ddf0d5e64951dd8f3c0e50626afbf286aa3c15b31a678bbb99413dcc5e8d1
|
7
|
+
data.tar.gz: 60e70a3f5be60178cf721b4d69b113d065275eb415f70655feb718279b9b2ad9de3bfb8a9ce0a01050b2972a7c2346ef7bbcd723849054d40bf79dc7b84db124
|
@@ -11,6 +11,7 @@ module Jxedt
|
|
11
11
|
:binary_dir => "framework的保存路径,相对于'Pods/Pods.xcodeproj'的相对路径。默认为'../_Prebuild'",
|
12
12
|
:binary_switch => "二进制开关,关闭则不hook pre_install过程。默认为true",
|
13
13
|
:prebuild_job => "开启编译任务,设置为false则不触发编译。默认为true",
|
14
|
+
:keep_source_project => "保留源码的pods工程,默认保留,方便查看源码",
|
14
15
|
:dev_pods_enabled => "Development Pods是否支持binary。默认为false",
|
15
16
|
:excluded_pods => "排除binary的pods",
|
16
17
|
:xcconfig_configuration_alias => "xcconfig文件中configuration的别名,configurations设置为多个值的时候会用到,用于搜索替换。一般不需要设置,有默认值为'cocoapods-jxedt-binary'",
|
@@ -59,6 +60,10 @@ module Jxedt
|
|
59
60
|
@dsl_config[:prebuild_job] || @dsl_config[:prebuild_job].nil?
|
60
61
|
end
|
61
62
|
|
63
|
+
def keep_source_project?
|
64
|
+
@dsl_config[:keep_source_project] || false
|
65
|
+
end
|
66
|
+
|
62
67
|
def dev_pods_enabled?
|
63
68
|
@dsl_config[:dev_pods_enabled] || false
|
64
69
|
end
|
@@ -1,4 +1,46 @@
|
|
1
1
|
module Pod
|
2
|
+
# The sandbox provides support for the directory that CocoaPods uses for an
|
3
|
+
# installation. In this directory the Pods projects, the support files and
|
4
|
+
# the sources of the Pods are stored.
|
5
|
+
#
|
6
|
+
# CocoaPods assumes to have control of the sandbox.
|
7
|
+
#
|
8
|
+
# Once completed the sandbox will have the following file structure:
|
9
|
+
#
|
10
|
+
# Pods
|
11
|
+
# |
|
12
|
+
# +-- Headers
|
13
|
+
# | +-- Private
|
14
|
+
# | | +-- [Pod Name]
|
15
|
+
# | +-- Public
|
16
|
+
# | +-- [Pod Name]
|
17
|
+
# |
|
18
|
+
# +-- Local Podspecs
|
19
|
+
# | +-- External Sources
|
20
|
+
# | +-- Normal Sources
|
21
|
+
# |
|
22
|
+
# +-- Target Support Files
|
23
|
+
# | +-- [Target Name]
|
24
|
+
# | +-- Pods-acknowledgements.markdown
|
25
|
+
# | +-- Pods-acknowledgements.plist
|
26
|
+
# | +-- Pods-dummy.m
|
27
|
+
# | +-- Pods-prefix.pch
|
28
|
+
# | +-- Pods.xcconfig
|
29
|
+
# |
|
30
|
+
# +-- [Pod Name]
|
31
|
+
# |
|
32
|
+
# +-- Manifest.lock
|
33
|
+
# |
|
34
|
+
# +-- Pods.xcodeproj
|
35
|
+
# (if installation option 'generate_multiple_pod_projects' is enabled)
|
36
|
+
# |
|
37
|
+
# +-- PodTarget1.xcodeproj
|
38
|
+
# |
|
39
|
+
# ...
|
40
|
+
# |
|
41
|
+
# +-- PodTargetN.xcodeproj
|
42
|
+
#
|
43
|
+
#
|
2
44
|
class PrebuildSandbox < Sandbox
|
3
45
|
# [String] standard_sandbox_path
|
4
46
|
def self.from_standard_sandbox_path(path)
|
@@ -10,9 +52,77 @@ module Pod
|
|
10
52
|
from_standard_sandbox_path(sandbox.root)
|
11
53
|
end
|
12
54
|
|
55
|
+
def make_source_link(source, target)
|
56
|
+
source = Pathname.new(source)
|
57
|
+
target = Pathname.new(target)
|
58
|
+
target.parent.mkpath unless target.parent.exist?
|
59
|
+
target.rmtree if target.exist?
|
60
|
+
relative_source = source.relative_path_from(target.parent)
|
61
|
+
FileUtils.ln_sf(relative_source, target)
|
62
|
+
end
|
63
|
+
|
64
|
+
def source_path
|
65
|
+
'../Pods-Source'
|
66
|
+
end
|
67
|
+
|
68
|
+
def headers_root
|
69
|
+
root + source_path + 'Headers'
|
70
|
+
end
|
71
|
+
|
13
72
|
def project_path
|
14
|
-
|
15
|
-
|
73
|
+
root + source_path + 'Pods-Source.xcodeproj'
|
74
|
+
end
|
75
|
+
|
76
|
+
def specifications_root
|
77
|
+
# root + source_path + 'Local Podspecs'
|
78
|
+
super
|
79
|
+
end
|
80
|
+
|
81
|
+
def target_support_files_root
|
82
|
+
root + source_path + 'Target Support Files'
|
83
|
+
end
|
84
|
+
|
85
|
+
def link_source_project!
|
86
|
+
root.children.each do |child|
|
87
|
+
next if ['Headers', 'Local Podspecs', 'Target Support Files'].include? child.basename.to_s
|
88
|
+
next if ['.lock', '.xcodeproj'].include? child.extname.to_s
|
89
|
+
make_source_link(child, root + source_path + child.basename)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def clean_source_project!
|
94
|
+
return if Jxedt.config.keep_source_project?
|
95
|
+
|
96
|
+
source_project_path = root + source_path
|
97
|
+
source_project_path.rmtree if source_project_path.exist?
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module Pod
|
103
|
+
class Installer
|
104
|
+
# The {UserProjectIntegrator} integrates the libraries generated by
|
105
|
+
# TargetDefinitions of the {Podfile} with their correspondent user
|
106
|
+
# projects.
|
107
|
+
#
|
108
|
+
class UserProjectIntegrator
|
109
|
+
alias_method :old_create_workspace, :create_workspace
|
110
|
+
def create_workspace
|
111
|
+
old_create_workspace unless sandbox.is_a?(Pod::PrebuildSandbox)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module Pod
|
118
|
+
class Installer
|
119
|
+
# Cleans up the sandbox directory by removing stale target support files and headers.
|
120
|
+
#
|
121
|
+
class SandboxDirCleaner
|
122
|
+
alias_method :old_clean!, :clean!
|
123
|
+
def clean!
|
124
|
+
old_clean! unless @sandbox.is_a?(Pod::PrebuildSandbox)
|
125
|
+
end
|
16
126
|
end
|
17
127
|
end
|
18
128
|
end
|
@@ -44,8 +44,12 @@ module Jxedt
|
|
44
44
|
require_relative '../prebuild'
|
45
45
|
|
46
46
|
# prebuild_job
|
47
|
-
|
48
|
-
|
47
|
+
sandbox.link_source_project!
|
48
|
+
if Jxedt.config.prebuild_job?
|
49
|
+
log_section "🚀 Prebuild frameworks"
|
50
|
+
Jxedt::Prebuild.new(source_installer).build
|
51
|
+
end
|
52
|
+
sandbox.clean_source_project!
|
49
53
|
|
50
54
|
log_section "🤖 Resume pod installation"
|
51
55
|
require_relative '../targets/pod_target'
|
@@ -1,4 +1,54 @@
|
|
1
1
|
module Pod
|
2
|
+
class PodTarget < Target
|
3
|
+
alias_method :old_resource_paths, :resource_paths
|
4
|
+
def resource_paths
|
5
|
+
resource_paths = old_resource_paths
|
6
|
+
# 没有使用二进制不处理
|
7
|
+
return resource_paths unless self.use_binary
|
8
|
+
|
9
|
+
# 遍历所有的resources
|
10
|
+
resource_paths.each do |name, resources|
|
11
|
+
resources.map! {|resource_file|
|
12
|
+
resource_extname = Pathname.new(resource_file).basename.extname
|
13
|
+
# 如果文件不需要编译,跳过
|
14
|
+
next resource_file unless self.class.resource_extension_compilable?(resource_extname)
|
15
|
+
|
16
|
+
# 确定编译后的文件名称
|
17
|
+
output_extname = self.class.output_extension_for_resource(resource_extname)
|
18
|
+
output_file_name = "#{Pathname.new(resource_file).basename.sub_ext('')}#{output_extname}"
|
19
|
+
# 从framework中查找编译后的文件
|
20
|
+
file_accessors.each do |file_accessor|
|
21
|
+
file_accessor.vendored_frameworks.each do |framework_file|
|
22
|
+
framework_name = Pathname.new(framework_file).basename.sub_ext('').to_s
|
23
|
+
# 只处理和当前target module_name相同的framework,否则跳过
|
24
|
+
next if self.product_module_name != framework_name
|
25
|
+
|
26
|
+
# xcframework和framework文件分别处理,而且只查找.framework根目录下的文件
|
27
|
+
if '.xcframework' == Pathname.new(framework_file).basename.extname
|
28
|
+
files = Dir.glob("#{framework_file}/**/#{framework_name}.framework/#{output_file_name}")
|
29
|
+
next if files.size == 0 # 没有查找到文件跳过
|
30
|
+
|
31
|
+
if Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
|
32
|
+
resource_file = "${PODS_XCFRAMEWORKS_BUILD_DIR}/#{self.name}/#{framework_name}.framework/#{output_file_name}"
|
33
|
+
else
|
34
|
+
resource_file = "${PODS_CONFIGURATION_BUILD_DIR}/#{framework_name}.framework/#{output_file_name}"
|
35
|
+
end
|
36
|
+
else
|
37
|
+
files = Dir.glob("#{framework_file}/#{output_file_name}")
|
38
|
+
next if files.size == 0 # 没有查找到文件跳过
|
39
|
+
|
40
|
+
resource_path = Pathname.new("#{framework_file}/#{output_file_name}") # 真实路径
|
41
|
+
resource_file = "${PODS_ROOT}/#{resource_path.relative_path_from(self.sandbox.root)}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
resource_file
|
46
|
+
}.reject!(&:nil?)
|
47
|
+
end
|
48
|
+
resource_paths
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
2
52
|
class Target
|
3
53
|
# @since 1.5.0
|
4
54
|
class BuildSettings
|
@@ -2,9 +2,9 @@ module Pod
|
|
2
2
|
class Command
|
3
3
|
class JxedtCommand < Command
|
4
4
|
class Header < JxedtCommand
|
5
|
-
self.summary = '
|
5
|
+
self.summary = '修改头文件引用问题'
|
6
6
|
self.description = <<-DESC
|
7
|
-
|
7
|
+
修改头文件引用问题\n
|
8
8
|
例如修改#import "AFNetworking.h"或#import <AFNetworking.h>这种头文件引用方式为#import <AFNetworking/AFNetworking.h>\n
|
9
9
|
使用方式:\n
|
10
10
|
到Podfile文件所在目录执行以下命令\n
|
@@ -23,6 +23,8 @@ module Pod
|
|
23
23
|
['--write', '修改命中的头文件引用,不写入则直接输出需要修改的文件和修改内容。默认false'],
|
24
24
|
['--suffix', '处理的文件后缀,默认处理\'h,m,mm,pch\'后缀的文件'],
|
25
25
|
['--header-regulation', 'header name的正则,默认为\'[\w+-]*\.h\',如果不满足也可以自定义'],
|
26
|
+
['--verbose', '在屏幕上输出修改文件的详情'],
|
27
|
+
['--log-path', '需要修改文件内容导出路径']
|
26
28
|
]
|
27
29
|
end
|
28
30
|
def initialize(argv)
|
@@ -31,6 +33,8 @@ module Pod
|
|
31
33
|
@suffix = argv.option('suffix', 'h,m,mm,pch')
|
32
34
|
@force_write = argv.flag?('write', false)
|
33
35
|
@header_regulation = argv.option('header-regulation')
|
36
|
+
@verbose_flag = argv.flag?('verbose', false)
|
37
|
+
@log_path = argv.option('log-path')
|
34
38
|
super
|
35
39
|
end
|
36
40
|
|
@@ -65,7 +69,7 @@ module Pod
|
|
65
69
|
}
|
66
70
|
|
67
71
|
# 遍历需要处理的文件
|
68
|
-
record = []
|
72
|
+
files, failed, record = [], [], []
|
69
73
|
process_target_files.each {|file_path|
|
70
74
|
changed = false
|
71
75
|
lines = File.readlines(file_path)
|
@@ -77,16 +81,36 @@ module Pod
|
|
77
81
|
header_name = line.match(/(?<=")#{header_name_regulation}(?=")/) || line.match(/(?<=<)#{header_name_regulation}(?=>)/)
|
78
82
|
next unless public_header_mapping.include?("#{header_name}")
|
79
83
|
|
84
|
+
changed = true # 文件需要修改
|
80
85
|
project_module_name = public_header_mapping["#{header_name}"]
|
81
86
|
replace_line = "#import " << "<#{project_module_name}/#{header_name}>\n"
|
82
87
|
lines[num] = replace_line
|
83
|
-
changed = true
|
84
88
|
record << "#{file_path} 第#{num}行,#{line} => #{replace_line}"
|
85
89
|
}
|
86
|
-
|
90
|
+
files << file_path if changed
|
91
|
+
begin
|
92
|
+
File.open(file_path, 'w') { |f| f.write(lines.join) } if changed && @force_write
|
93
|
+
rescue
|
94
|
+
failed << file_path
|
95
|
+
ensure
|
96
|
+
help! "因权限问题文件修改失败:\n#{file_path}" if failed.size > 0
|
97
|
+
end
|
87
98
|
}
|
88
|
-
puts "
|
89
|
-
puts
|
99
|
+
puts "需要修改文件共有:#{files.size} 个,需要修改的头文件的地方共有:#{record.size} 处"
|
100
|
+
puts "已修改完成" if files.size > 0 && @force_write
|
101
|
+
|
102
|
+
if files.size > 0
|
103
|
+
logs = <<~LOGS
|
104
|
+
需要修改的文件:
|
105
|
+
#{JSON.pretty_generate(files)}
|
106
|
+
|
107
|
+
文件修改详情:
|
108
|
+
#{JSON.pretty_generate(record)}
|
109
|
+
LOGS
|
110
|
+
logs.gsub!('\\"', '"').gsub!('\\n', '') # 去除转义字符
|
111
|
+
puts logs if @verbose_flag
|
112
|
+
File.open(log_file_path, 'w') { |file| file.write("#{logs}") } unless log_file_path.nil?
|
113
|
+
end
|
90
114
|
end
|
91
115
|
|
92
116
|
def installer_for_config
|
@@ -151,6 +175,13 @@ module Pod
|
|
151
175
|
end
|
152
176
|
dependent_targets
|
153
177
|
end
|
178
|
+
|
179
|
+
def log_file_path
|
180
|
+
log_path = @log_path
|
181
|
+
log_path << "/headerfix_output.txt" if log_path && File.directory?(log_path)
|
182
|
+
return if log_path && (!File.exist?(File.dirname(log_path)))
|
183
|
+
log_path
|
184
|
+
end
|
154
185
|
end
|
155
186
|
end
|
156
187
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class JxedtCommand < Command
|
4
|
+
class Statistics < JxedtCommand
|
5
|
+
self.summary = '统计二进制使用情况'
|
6
|
+
self.description = <<-DESC
|
7
|
+
统计二进制使用详情
|
8
|
+
DESC
|
9
|
+
self.command = 'statistics'
|
10
|
+
self.arguments = [
|
11
|
+
]
|
12
|
+
def self.options
|
13
|
+
[
|
14
|
+
['--failed', '统计校验失败的二进制'],
|
15
|
+
]
|
16
|
+
end
|
17
|
+
def initialize(argv)
|
18
|
+
@check_failed = argv.flag?('failed')
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate!
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def run
|
27
|
+
podfile = Pod::Config.instance.podfile
|
28
|
+
lockfile = Pod::Config.instance.lockfile
|
29
|
+
help! '请检查命令执行路径,需要在Podfile文件所在目录执行' if podfile.nil? || lockfile.nil?
|
30
|
+
|
31
|
+
require 'cocoapods-jxedt/binary/config'
|
32
|
+
require 'cocoapods-jxedt/binary/helper/podfile_options'
|
33
|
+
|
34
|
+
pods_root = Pathname.new(File.dirname(podfile.defined_in_file)) + "Pods"
|
35
|
+
binary_dir = pods_root + Jxedt.config.binary_dir
|
36
|
+
|
37
|
+
used_binary = []
|
38
|
+
Dir.glob("#{pods_root}/*/_Prebuild") do |file_path|
|
39
|
+
next unless File.directory?(file_path)
|
40
|
+
dir_name = File.dirname(file_path)
|
41
|
+
name = File.basename(dir_name).to_s
|
42
|
+
target_path = binary_dir + name
|
43
|
+
next unless target_path.exist? # 路径不存在,跳过
|
44
|
+
|
45
|
+
new_hash = {}
|
46
|
+
# name
|
47
|
+
new_hash[:name] = name
|
48
|
+
|
49
|
+
# multiple_configuration
|
50
|
+
configuration_enable = target_path.children().select { |path| "#{path.basename}" == 'Debug' || "#{path.basename}" == 'Release' }.count == 2
|
51
|
+
new_hash[:multiple_configuration] = configuration_enable
|
52
|
+
|
53
|
+
# checksum validation
|
54
|
+
checksum_file = target_path.children().select { |path| path.extname == '.checksum' }.first
|
55
|
+
new_hash[:checksum] = checksum_file.basename.to_s.gsub('.checksum', '') unless checksum_file.nil?
|
56
|
+
|
57
|
+
used_binary << new_hash
|
58
|
+
end
|
59
|
+
|
60
|
+
# print
|
61
|
+
index, failed = 0, []
|
62
|
+
used_binary.sort_by {|hash| hash[:name].capitalize }.each do |hash|
|
63
|
+
name = hash[:name]
|
64
|
+
|
65
|
+
checksum = lockfile.spec_checksums_hash_key(name)
|
66
|
+
validation_passed = checksum && checksum == hash[:checksum]
|
67
|
+
failed << name unless validation_passed
|
68
|
+
|
69
|
+
# 校验和是否用的 git commitid
|
70
|
+
checkout_options = lockfile.internal_data["CHECKOUT OPTIONS"] || {}
|
71
|
+
is_git_commitid = checkout_options[name] && checkout_options[name][:commit]
|
72
|
+
|
73
|
+
if validation_passed
|
74
|
+
next if @check_failed
|
75
|
+
index += 1
|
76
|
+
log = <<~LOG
|
77
|
+
#{index}). #{name}:
|
78
|
+
multiple configuration: #{hash[:multiple_configuration]}
|
79
|
+
checksum#{"(git commitid)" if is_git_commitid}: #{hash[:checksum]}
|
80
|
+
LOG
|
81
|
+
Pod::UI.puts log
|
82
|
+
else
|
83
|
+
index += 1
|
84
|
+
log = <<~LOG
|
85
|
+
#{index}). #{name}:
|
86
|
+
multiple configuration: #{hash[:multiple_configuration]}
|
87
|
+
checksum: #{hash[:checksum]}
|
88
|
+
checksum in lockfile#{"(git commitid)" if is_git_commitid}: #{checksum}
|
89
|
+
LOG
|
90
|
+
Pod::UI.puts log.red
|
91
|
+
end
|
92
|
+
end
|
93
|
+
Pod::UI.puts "checksum校验失败的组件: #{failed}".red if failed.size > 0
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-jxedt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- guojiashuang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocoapods
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- lib/cocoapods-jxedt/command/header/header.rb
|
91
91
|
- lib/cocoapods-jxedt/command/jxedt.rb
|
92
92
|
- lib/cocoapods-jxedt/command/options/options.rb
|
93
|
+
- lib/cocoapods-jxedt/command/statistics/statistics.rb
|
93
94
|
- lib/cocoapods-jxedt/gem_version.rb
|
94
95
|
- lib/cocoapods-jxedt/tool.rb
|
95
96
|
- lib/cocoapods_plugin.rb
|