cocoapods-dongjia 1.1.5 → 1.1.6
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/lib/cocoapods-dongjia/command/reinstall.rb +8 -1
- data/lib/cocoapods-dongjia/gem_version.rb +3 -2
- data/lib/cocoapods_plugin.rb +8 -10
- data/lib/dongjia_binarization.rb +577 -0
- data/lib/helper/{podfile_warnings.rb → installer.rb} +17 -3
- metadata +39 -9
- data/lib/dongjia_scheme_manager.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dca107525ae9be1b7ed4f8bd40b5247cbcc5258035b9a0cc33ad4e4a96def6f3
|
4
|
+
data.tar.gz: c0d15ab36c6ad63daf5c82cffd1cbd8d41fc30d3a5ba1c1ddab2e3a468d2a36d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43b4aa9ab668b94cfca481ab715c5de4f338f4ba22bfdc13c2c0cdbd673ed69aac48668fbe794f56c4a2babed20e527fc5e3c246ec485436b070b3dce02290f2
|
7
|
+
data.tar.gz: 364c8b20c8dd4c8c1e1255abeaf69049f57c656bb6690cbaea4153278a108d8f84d892505d63c21048cfedac2f55fae29c8fcc775f50c1d32829d67165ea1d55
|
@@ -18,7 +18,14 @@ module Pod
|
|
18
18
|
CLAide::Argument.new('XCODE_PROJECT', false),
|
19
19
|
]
|
20
20
|
|
21
|
+
def self.options
|
22
|
+
[
|
23
|
+
["--save", "将重新生成的 project.pbxproj 文件保存下来"]
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
21
27
|
def initialize(argv)
|
28
|
+
@save = argv.flag?("save")
|
22
29
|
path = argv.shift_argument
|
23
30
|
@project_path = Pathname.new(path) if path
|
24
31
|
super
|
@@ -45,7 +52,7 @@ module Pod
|
|
45
52
|
|
46
53
|
deintegrator = Deintegrator.new
|
47
54
|
deintegrator.deintegrate_project(@project)
|
48
|
-
@project.save
|
55
|
+
@project.save if @save
|
49
56
|
|
50
57
|
verify_podfile_exists!
|
51
58
|
installer = installer_for_config
|
data/lib/cocoapods_plugin.rb
CHANGED
@@ -4,17 +4,21 @@ require_relative 'dongjia_branch_inspector'
|
|
4
4
|
require_relative 'dongjia_enterprise_inspector'
|
5
5
|
require_relative 'dongjia_pods_iterator'
|
6
6
|
require_relative 'dongjia_router'
|
7
|
-
require_relative '
|
7
|
+
require_relative 'dongjia_binarization'
|
8
8
|
|
9
9
|
require_relative 'helper/podfile'
|
10
10
|
require_relative 'helper/podfile_options'
|
11
|
-
require_relative 'helper/
|
11
|
+
require_relative 'helper/installer'
|
12
12
|
require_relative 'helper/Core/podfile/dsl'
|
13
13
|
|
14
14
|
module Dongjia
|
15
15
|
|
16
16
|
Pod::HooksManager.register('cocoapods-dongjia', :pre_install) do |ctx, params|
|
17
17
|
|
18
|
+
Binarization.load_private_config(ctx)
|
19
|
+
|
20
|
+
Binarization.remove_dirty_pod_projects()
|
21
|
+
|
18
22
|
podfile = ctx.podfile
|
19
23
|
|
20
24
|
# 禁用集成完后的反馈
|
@@ -25,7 +29,6 @@ module Dongjia
|
|
25
29
|
|
26
30
|
# 关闭静态框架依赖传递的校验
|
27
31
|
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
|
28
|
-
|
29
32
|
end
|
30
33
|
|
31
34
|
Pod::HooksManager.register('cocoapods-dongjia', :post_install) do |ctx, params|
|
@@ -33,13 +36,8 @@ module Dongjia
|
|
33
36
|
# 关闭警告 / 检查 LTO
|
34
37
|
PodsIterator.iterate(params, ctx.sandbox_root)
|
35
38
|
|
36
|
-
# 处理 appspec 配置
|
37
|
-
# SchemeManager.setup(ctx, params)
|
38
|
-
|
39
39
|
# 抓取所有路由汇总至
|
40
|
-
router = Router.new
|
41
|
-
router.scrape_routers(ctx.sandbox_root, params[:scrap_routers])
|
42
|
-
|
40
|
+
# router = Router.new
|
41
|
+
# router.scrape_routers(ctx.sandbox_root, params[:scrap_routers])
|
43
42
|
end
|
44
|
-
|
45
43
|
end
|
@@ -0,0 +1,577 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'archive/zip'
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
require 'yaml'
|
7
|
+
require 'down'
|
8
|
+
require 'pry'
|
9
|
+
require 'uri'
|
10
|
+
|
11
|
+
module Dongjia
|
12
|
+
class Binarization
|
13
|
+
|
14
|
+
@@ctx = nil
|
15
|
+
@@pod_cfg = {}
|
16
|
+
@@enabled = false
|
17
|
+
@@target_name = ""
|
18
|
+
@@submodules = {}
|
19
|
+
@@server_host = ""
|
20
|
+
|
21
|
+
# 配置文件 PrivateConfig.yml 是否存在,如果不存在,不做任何额外处理
|
22
|
+
@@config_file_exist = false
|
23
|
+
|
24
|
+
class << self
|
25
|
+
# 加载配置
|
26
|
+
def load_private_config(ctx)
|
27
|
+
@@ctx = ctx
|
28
|
+
|
29
|
+
submodule_info = load_submodules_info
|
30
|
+
@@submodules = submodule_info.to_h { |s|
|
31
|
+
[
|
32
|
+
s[:name],
|
33
|
+
{ sha: s[:sha], binary: s[:binary], }
|
34
|
+
]
|
35
|
+
}
|
36
|
+
|
37
|
+
path = ctx.podfile.defined_in_file.dirname.join("PrivateConfig.yml")
|
38
|
+
if path.exist?
|
39
|
+
config = YAML.load(File.read(path))
|
40
|
+
@@config_file_exist = true
|
41
|
+
if config
|
42
|
+
binary = config["binary"]
|
43
|
+
if binary
|
44
|
+
@@enabled ||= binary["enabled"]
|
45
|
+
@@server_host = binary["server_host"]
|
46
|
+
@@target_name = binary["target_name"].strip
|
47
|
+
ignores = binary["ignores"] || []
|
48
|
+
|
49
|
+
begin
|
50
|
+
@@submodules = query_components_existing(submodule_info).to_h { |s|
|
51
|
+
[
|
52
|
+
s["name"],
|
53
|
+
{ sha: s["sha"], binary: s["binary"], }
|
54
|
+
]
|
55
|
+
}.each { |k, v|
|
56
|
+
ignored = ignores.include?(k)
|
57
|
+
v[:binary] &&= !ignored && @@enabled
|
58
|
+
v[:ignored] = ignored
|
59
|
+
}
|
60
|
+
rescue => e
|
61
|
+
puts "Error: #{e}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# 移除脏工程
|
69
|
+
def remove_dirty_pod_projects
|
70
|
+
@@submodules
|
71
|
+
.filter { |k,v| !v[:binary] }
|
72
|
+
.map { |k,v| k }
|
73
|
+
.each { |name|
|
74
|
+
path = "./Pods/#{name}.xcodeproj"
|
75
|
+
next unless File.exist?(path)
|
76
|
+
proj = Xcodeproj::Project.open(path)
|
77
|
+
if proj.targets.map(&:name).include?("#{name}-Binary")
|
78
|
+
FileUtils.rm_rf(path)
|
79
|
+
end
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
# 加载子模块信息
|
84
|
+
def load_submodules_info
|
85
|
+
# 获取子模块的哈希值
|
86
|
+
def git_sha_value(component_name)
|
87
|
+
git_dir = ".git/modules/componentsOnRemote/#{component_name}"
|
88
|
+
git_sha = File.read(File.join(git_dir, "HEAD")).strip
|
89
|
+
if git_sha.start_with?("ref: ")
|
90
|
+
head_file = git_sha[5, git_sha.length]
|
91
|
+
git_sha = File.read(File.join(git_dir, head_file)).strip
|
92
|
+
end
|
93
|
+
git_sha
|
94
|
+
end
|
95
|
+
|
96
|
+
Dir.foreach("./componentsOnRemote").to_a
|
97
|
+
.delete_if { |x| x.start_with?('.') }
|
98
|
+
.map { |comp|
|
99
|
+
{
|
100
|
+
name: comp,
|
101
|
+
sha: git_sha_value(comp),
|
102
|
+
binary: false,
|
103
|
+
}
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
# 开始处理二进制
|
108
|
+
def process(installer)
|
109
|
+
return unless @@config_file_exist
|
110
|
+
return if @@ctx == nil || @@ctx.sandbox_root == nil
|
111
|
+
|
112
|
+
installer.analysis_result.podfile_dependency_cache.podfile_dependencies.each { |dep|
|
113
|
+
name = dep.name.split('/').first
|
114
|
+
next if @@pod_cfg.include?(name)
|
115
|
+
@@pod_cfg[name] = @@submodules[name] || {
|
116
|
+
binary: false
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
pods_proj = Xcodeproj::Project.open(File.join(@@ctx.sandbox_root, "Pods.xcodeproj"))
|
121
|
+
if @@target_name && !@@target_name.empty?
|
122
|
+
pods_target = pods_proj.targets.find { |t| t.name == "Pods-#{@@target_name}" }
|
123
|
+
else
|
124
|
+
pods_target = pods_proj.targets.first
|
125
|
+
end
|
126
|
+
|
127
|
+
download_frameworks
|
128
|
+
|
129
|
+
each_pod_proj do |name|
|
130
|
+
proj = Xcodeproj::Project.open(File.join(@@ctx.sandbox_root, "#{name}.xcodeproj"))
|
131
|
+
cfg = @@pod_cfg[name]
|
132
|
+
cfg[:project] = proj
|
133
|
+
|
134
|
+
cfg[:save] = process_target_and_dependencies(proj, name, pods_target, cfg)
|
135
|
+
|
136
|
+
# 处理 Binary Group
|
137
|
+
process_binary_group(proj, name)
|
138
|
+
|
139
|
+
# 处理 XXX-xcframeworks.sh 脚本
|
140
|
+
process_xcframeworks_shell(name)
|
141
|
+
|
142
|
+
process_pod_xcconfig(name)
|
143
|
+
end
|
144
|
+
|
145
|
+
# 更新依赖关系
|
146
|
+
each_pod_proj do |name|
|
147
|
+
cfg = @@pod_cfg[name]
|
148
|
+
proj = cfg[:project]
|
149
|
+
target = cfg[:target]
|
150
|
+
next if target.nil?
|
151
|
+
delete_list = []
|
152
|
+
target.dependencies.each { |dep|
|
153
|
+
dep_cfg = @@pod_cfg[dep.name]
|
154
|
+
next if dep_cfg.nil?
|
155
|
+
if dep_cfg[:binary]
|
156
|
+
target.add_dependency(dep_cfg[:target])
|
157
|
+
delete_list << dep
|
158
|
+
end
|
159
|
+
}
|
160
|
+
target.dependencies.delete_if { |dep| delete_list.include?(dep) }
|
161
|
+
cfg[:save] ||= !delete_list.empty?
|
162
|
+
end
|
163
|
+
|
164
|
+
# 保存
|
165
|
+
should_save = false
|
166
|
+
each_pod_proj do |name|
|
167
|
+
cfg = @@pod_cfg[name]
|
168
|
+
cfg[:project].save if cfg[:save]
|
169
|
+
should_save ||= cfg[:save]
|
170
|
+
end
|
171
|
+
pods_proj.save if should_save
|
172
|
+
|
173
|
+
process_aggregate_target_xcconfig(installer.aggregate_targets.first.name)
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
# 遍历 Pods 目录下的 xcodeproj
|
179
|
+
def each_pod_proj
|
180
|
+
Dir.foreach(@@ctx.sandbox_root) do |filename|
|
181
|
+
next if File.extname(filename) != '.xcodeproj'
|
182
|
+
|
183
|
+
name = File.basename(filename, '.xcodeproj')
|
184
|
+
next if name == 'Pods'
|
185
|
+
|
186
|
+
cfg = @@pod_cfg[name]
|
187
|
+
|
188
|
+
yield(name) if block_given?
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# 向服务器查询哪些 Pod 需要打包
|
193
|
+
def query_components_existing(components)
|
194
|
+
result = components
|
195
|
+
begin
|
196
|
+
uri = URI.parse(URI::join(@@server_host, 'api/binary/checkup').to_s)
|
197
|
+
headers = {
|
198
|
+
'Content-Type': 'application/json'
|
199
|
+
}
|
200
|
+
req = Net::HTTP::Post.new(uri, headers)
|
201
|
+
req.body = {components: components}.to_json
|
202
|
+
resp = Net::HTTP.start(uri.host, uri.port) do |http|
|
203
|
+
http.request(req)
|
204
|
+
end
|
205
|
+
result = JSON.parse(resp.body).dig('res', 'components')
|
206
|
+
rescue => e
|
207
|
+
puts "Error: #{e}"
|
208
|
+
end
|
209
|
+
return result
|
210
|
+
end
|
211
|
+
|
212
|
+
def process_target_and_dependencies(proj, name, pods_target, cfg)
|
213
|
+
changed = false
|
214
|
+
source_target = proj.target_by_name(name)
|
215
|
+
binary_target = proj.target_by_name("#{name}-Binary")
|
216
|
+
|
217
|
+
if cfg[:binary] == true
|
218
|
+
# 使用 Binary 版本的 target
|
219
|
+
if binary_target == nil
|
220
|
+
binary_target = add_binary_target(proj, name)
|
221
|
+
changed = true
|
222
|
+
end
|
223
|
+
|
224
|
+
@@pod_cfg[name][:target] = binary_target
|
225
|
+
|
226
|
+
# 移除源码版本的 target
|
227
|
+
if source_target
|
228
|
+
replace_target_dependency(pods_target, source_target, binary_target)
|
229
|
+
proj.targets.delete_if { |t| t == source_target }
|
230
|
+
changed = true
|
231
|
+
end
|
232
|
+
else
|
233
|
+
@@pod_cfg[name][:target] = source_target
|
234
|
+
# 使用源码版本的 target
|
235
|
+
source_target.build_configurations.each { |cfg|
|
236
|
+
if cfg.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] != "YES"
|
237
|
+
cfg.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] = "YES"
|
238
|
+
changed = true
|
239
|
+
end
|
240
|
+
}
|
241
|
+
end
|
242
|
+
changed
|
243
|
+
end
|
244
|
+
|
245
|
+
# 处理对应 pod 的 xcconfig
|
246
|
+
def process_pod_xcconfig(name)
|
247
|
+
# 根据 pod 是源码还是二进制包,切换路径为 PODS_CONFIGURATION_BUILD_DIR 或 PODS_XCFRAMEWORKS_BUILD_DIR
|
248
|
+
["debug", "release"].each { |cfg_name|
|
249
|
+
cfg_path = Pathname("./Pods/Target Support Files/#{name}/#{name}.#{cfg_name}.xcconfig")
|
250
|
+
next if not File.exist?(cfg_path)
|
251
|
+
cfg = Xcodeproj::Config.new(cfg_path)
|
252
|
+
fsp_str = cfg.attributes["FRAMEWORK_SEARCH_PATHS"] || "$(inherited)"
|
253
|
+
fsp = fsp_str.split(" ")
|
254
|
+
|
255
|
+
# 源码的 prefix
|
256
|
+
source_prefix = "\"${PODS_CONFIGURATION_BUILD_DIR}/"
|
257
|
+
# 二进制包的 prefix
|
258
|
+
binary_prefix = "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/"
|
259
|
+
|
260
|
+
fsp.map! { |path|
|
261
|
+
if path.start_with?(source_prefix)
|
262
|
+
pod_name = path[source_prefix.length, path.length].delete_suffix("\"")
|
263
|
+
sm = @@submodules[pod_name]
|
264
|
+
if !sm.nil? && sm[:binary]
|
265
|
+
path = path.gsub("PODS_CONFIGURATION_BUILD_DIR", "PODS_XCFRAMEWORKS_BUILD_DIR")
|
266
|
+
end
|
267
|
+
elsif path.start_with?(binary_prefix)
|
268
|
+
pod_name = path[binary_prefix.length, path.length].delete_suffix("\"")
|
269
|
+
sm = @@submodules[pod_name]
|
270
|
+
if !sm.nil? && !sm[:binary]
|
271
|
+
path = path.gsub("PODS_XCFRAMEWORKS_BUILD_DIR", "PODS_CONFIGURATION_BUILD_DIR")
|
272
|
+
end
|
273
|
+
end
|
274
|
+
path
|
275
|
+
}
|
276
|
+
cfg.attributes["FRAMEWORK_SEARCH_PATHS"] = fsp.flatten.uniq.join(" ")
|
277
|
+
cfg.save_as(cfg_path)
|
278
|
+
}
|
279
|
+
end
|
280
|
+
|
281
|
+
# 处理集成对象的 xcconfig(项目的 xcconfig)
|
282
|
+
def process_aggregate_target_xcconfig(aggregate_target_name)
|
283
|
+
# 处理 Pods/Target Support Files/Pods-项目名/Pods-项目名.debug(release).xcconfig
|
284
|
+
# 所有被二进制化的 pod,增加 "${PODS_XCFRAMEWORKS_BUILD_DIR}/#{pod_name}"
|
285
|
+
["debug", "release"].each { |cfg_name|
|
286
|
+
cfg_path = Pathname("./Pods/Target Support Files/#{aggregate_target_name}/#{aggregate_target_name}.#{cfg_name}.xcconfig")
|
287
|
+
next if not File.exist?(cfg_path)
|
288
|
+
cfg = Xcodeproj::Config.new(cfg_path)
|
289
|
+
fsp = cfg.attributes["FRAMEWORK_SEARCH_PATHS"].split(" ") || ["$(inherited)"]
|
290
|
+
@@submodules.each { |k, v|
|
291
|
+
path = "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/#{k}\""
|
292
|
+
if v[:binary] == true
|
293
|
+
fsp << path if not fsp.include?(path)
|
294
|
+
else
|
295
|
+
fsp.delete_if { |x| x == path }
|
296
|
+
end
|
297
|
+
}
|
298
|
+
cfg.attributes["FRAMEWORK_SEARCH_PATHS"] = fsp.flatten.uniq.join(" ")
|
299
|
+
cfg.save_as(cfg_path)
|
300
|
+
}
|
301
|
+
end
|
302
|
+
|
303
|
+
def add_binary_target(proj, name)
|
304
|
+
source_target = proj.target_by_name(name)
|
305
|
+
bin_target = proj.new_aggregate_target("#{name}-Binary", [], :ios, '10.0')
|
306
|
+
|
307
|
+
# 处理 xcconfig 引用
|
308
|
+
cfg_list0 = source_target.build_configuration_list
|
309
|
+
cfg_list1 = bin_target.build_configuration_list
|
310
|
+
cfg_list1["Debug"].base_configuration_reference ||= cfg_list0["Debug"].base_configuration_reference
|
311
|
+
cfg_list1["Release"].base_configuration_reference ||= cfg_list0["Release"].base_configuration_reference
|
312
|
+
|
313
|
+
# 处理 Build Phases
|
314
|
+
phase = bin_target.new_shell_script_build_phase("[CP] Copy XCFrameworks")
|
315
|
+
phase.shell_script = "\"${PODS_ROOT}/Target Support Files/#{name}/#{name}-xcframeworks.sh\""
|
316
|
+
|
317
|
+
# 添加依赖
|
318
|
+
bin_target.dependencies.replace(source_target.dependencies)
|
319
|
+
return bin_target
|
320
|
+
end
|
321
|
+
|
322
|
+
def replace_target_dependency(target, from_dep_target, to_dep_target)
|
323
|
+
dep_names = target.dependencies.map(&:name)
|
324
|
+
index = dep_names.index(from_dep_target.name)
|
325
|
+
return false if !index
|
326
|
+
target.dependencies.delete_at(index)
|
327
|
+
target.add_dependency(to_dep_target)
|
328
|
+
return true
|
329
|
+
end
|
330
|
+
|
331
|
+
# 下载 framework 到 Pods/_Frameworks 目录下
|
332
|
+
def download_frameworks
|
333
|
+
framework_root = File.join(@@ctx.sandbox_root, "_Frameworks")
|
334
|
+
cache_root = File.join(framework_root, "Caches")
|
335
|
+
FileUtils.mkdir_p(cache_root) unless File.exist?(cache_root)
|
336
|
+
|
337
|
+
@@submodules.each { |k, v|
|
338
|
+
if !v[:binary] || !v[:sha]
|
339
|
+
puts "#{k} 未发现二进制版本" if @@enabled && !v[:ignored]
|
340
|
+
next
|
341
|
+
end
|
342
|
+
|
343
|
+
module_cache_dir = File.join(cache_root, k)
|
344
|
+
FileUtils.mkdir_p(module_cache_dir) unless File.exist?(module_cache_dir)
|
345
|
+
|
346
|
+
filename = "#{v[:sha]}.zip"
|
347
|
+
binary_dir = File.join(module_cache_dir, v[:sha])
|
348
|
+
if not File.exist?(binary_dir)
|
349
|
+
# 目录不存在,下载 zip 包并解压
|
350
|
+
binary_zip_path = File.join(module_cache_dir, filename)
|
351
|
+
puts "Downloading #{k} (#{v[:sha]})"
|
352
|
+
url = URI::join(@@server_host, "binary/#{k}/#{filename}")
|
353
|
+
Down.download(url, destination: binary_zip_path)
|
354
|
+
Archive::Zip.extract(binary_zip_path, binary_dir)
|
355
|
+
FileUtils.rm_f(binary_zip_path)
|
356
|
+
end
|
357
|
+
target = File.expand_path(File.join(binary_dir, "#{k}.xcframework"))
|
358
|
+
FileUtils.ln_s(target, framework_root, force: true)
|
359
|
+
}
|
360
|
+
end
|
361
|
+
|
362
|
+
def process_binary_group(proj, name)
|
363
|
+
cfg = @@pod_cfg[name]
|
364
|
+
binary_group = proj.groups.find { |g| g.name == "Binary" }
|
365
|
+
if cfg[:binary] == true
|
366
|
+
if binary_group == nil
|
367
|
+
binary_group = proj.new_group("Binary")
|
368
|
+
binary_group.new_reference("_Frameworks/#{name}.xcframework")
|
369
|
+
proj.sort
|
370
|
+
end
|
371
|
+
else
|
372
|
+
if binary_group != nil
|
373
|
+
binary_group.remove_from_project
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def process_xcframeworks_shell(name)
|
379
|
+
cfg = @@pod_cfg[name]
|
380
|
+
return if cfg[:binary] != true
|
381
|
+
script_path = File.join(@@ctx.sandbox_root, "Target Support Files", name, "#{name}-xcframeworks.sh")
|
382
|
+
File.open(script_path, 'w') do |f|
|
383
|
+
f.write(xcframeworks_shell(name))
|
384
|
+
end
|
385
|
+
FileUtils.chmod('a+x', script_path)
|
386
|
+
end
|
387
|
+
|
388
|
+
# 获取当前 Wi-Fi 的 SSID
|
389
|
+
def get_wifi_ssid
|
390
|
+
lines = `/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I`.split("\n").map { |line| line.strip }
|
391
|
+
target = lines.find { |x| x.start_with?("SSID: ") }
|
392
|
+
target.nil? ? "" : target.delete_prefix("SSID: ")
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
module Dongjia
|
399
|
+
class Binarization
|
400
|
+
def self.xcframeworks_shell(pod_name)
|
401
|
+
<<-DESC
|
402
|
+
#!/bin/sh
|
403
|
+
set -e
|
404
|
+
set -u
|
405
|
+
set -o pipefail
|
406
|
+
|
407
|
+
function on_error {
|
408
|
+
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
|
409
|
+
}
|
410
|
+
trap 'on_error $LINENO' ERR
|
411
|
+
|
412
|
+
|
413
|
+
# This protects against multiple targets copying the same framework dependency at the same time. The solution
|
414
|
+
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
|
415
|
+
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
|
416
|
+
|
417
|
+
|
418
|
+
copy_dir()
|
419
|
+
{
|
420
|
+
local source="$1"
|
421
|
+
local destination="$2"
|
422
|
+
|
423
|
+
# Use filter instead of exclude so missing patterns don't throw errors.
|
424
|
+
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" \\"${source}\\" \\"${destination}\\""
|
425
|
+
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}" "${destination}"
|
426
|
+
}
|
427
|
+
|
428
|
+
SELECT_SLICE_RETVAL=""
|
429
|
+
|
430
|
+
select_slice() {
|
431
|
+
local paths=("$@")
|
432
|
+
# Locate the correct slice of the .xcframework for the current architectures
|
433
|
+
local target_path=""
|
434
|
+
|
435
|
+
# Split archs on space so we can find a slice that has all the needed archs
|
436
|
+
local target_archs=$(echo $ARCHS | tr " " "\\n")
|
437
|
+
|
438
|
+
local target_variant=""
|
439
|
+
if [[ "$PLATFORM_NAME" == *"simulator" ]]; then
|
440
|
+
target_variant="simulator"
|
441
|
+
fi
|
442
|
+
if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then
|
443
|
+
target_variant="maccatalyst"
|
444
|
+
fi
|
445
|
+
for i in ${!paths[@]}; do
|
446
|
+
local matched_all_archs="1"
|
447
|
+
for target_arch in $target_archs
|
448
|
+
do
|
449
|
+
if ! [[ "${paths[$i]}" == *"$target_variant"* ]]; then
|
450
|
+
matched_all_archs="0"
|
451
|
+
break
|
452
|
+
fi
|
453
|
+
|
454
|
+
# Verifies that the path contains the variant string (simulator or maccatalyst) if the variant is set.
|
455
|
+
if [[ -z "$target_variant" && ("${paths[$i]}" == *"simulator"* || "${paths[$i]}" == *"maccatalyst"*) ]]; then
|
456
|
+
matched_all_archs="0"
|
457
|
+
break
|
458
|
+
fi
|
459
|
+
|
460
|
+
# This regex matches all possible variants of the arch in the folder name:
|
461
|
+
# Let's say the folder name is: ios-armv7_armv7s_arm64_arm64e/CoconutLib.framework
|
462
|
+
# We match the following: -armv7_, _armv7s_, _arm64_ and _arm64e/.
|
463
|
+
# If we have a specific variant: ios-i386_x86_64-simulator/CoconutLib.framework
|
464
|
+
# We match the following: -i386_ and _x86_64-
|
465
|
+
# When the .xcframework wraps a static library, the folder name does not include
|
466
|
+
# any .framework. In that case, the folder name can be: ios-arm64_armv7
|
467
|
+
# We also match _armv7$ to handle that case.
|
468
|
+
local target_arch_regex="[_\\-]${target_arch}([\\/_\\-]|$)"
|
469
|
+
if ! [[ "${paths[$i]}" =~ $target_arch_regex ]]; then
|
470
|
+
matched_all_archs="0"
|
471
|
+
break
|
472
|
+
fi
|
473
|
+
done
|
474
|
+
|
475
|
+
if [[ "$matched_all_archs" == "1" ]]; then
|
476
|
+
# Found a matching slice
|
477
|
+
echo "Selected xcframework slice ${paths[$i]}"
|
478
|
+
SELECT_SLICE_RETVAL=${paths[$i]}
|
479
|
+
break
|
480
|
+
fi
|
481
|
+
done
|
482
|
+
}
|
483
|
+
|
484
|
+
install_library() {
|
485
|
+
local source="$1"
|
486
|
+
local name="$2"
|
487
|
+
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
|
488
|
+
|
489
|
+
# Libraries can contain headers, module maps, and a binary, so we'll copy everything in the folder over
|
490
|
+
|
491
|
+
local source="$binary"
|
492
|
+
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \\"- CVS/\\" --filter \\"- .svn/\\" --filter \\"- .git/\\" --filter \\"- .hg/\\" \\"${source}/*\\" \\"${destination}\\""
|
493
|
+
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}/*" "${destination}"
|
494
|
+
}
|
495
|
+
|
496
|
+
# Copies a framework to derived data for use in later build phases
|
497
|
+
install_framework()
|
498
|
+
{
|
499
|
+
local source="$1"
|
500
|
+
local name="$2"
|
501
|
+
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
|
502
|
+
|
503
|
+
if [ ! -d "$destination" ]; then
|
504
|
+
mkdir -p "$destination"
|
505
|
+
fi
|
506
|
+
|
507
|
+
copy_dir "$source" "$destination"
|
508
|
+
echo "Copied $source to $destination"
|
509
|
+
}
|
510
|
+
|
511
|
+
install_xcframework_library() {
|
512
|
+
local basepath="$1"
|
513
|
+
local name="$2"
|
514
|
+
local paths=("$@")
|
515
|
+
|
516
|
+
# Locate the correct slice of the .xcframework for the current architectures
|
517
|
+
select_slice "${paths[@]}"
|
518
|
+
local target_path="$SELECT_SLICE_RETVAL"
|
519
|
+
if [[ -z "$target_path" ]]; then
|
520
|
+
echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
|
521
|
+
return
|
522
|
+
fi
|
523
|
+
|
524
|
+
install_framework "$basepath/$target_path" "$name"
|
525
|
+
}
|
526
|
+
|
527
|
+
install_xcframework() {
|
528
|
+
local basepath="$1"
|
529
|
+
local name="$2"
|
530
|
+
local package_type="$3"
|
531
|
+
local paths=("$@")
|
532
|
+
|
533
|
+
# Locate the correct slice of the .xcframework for the current architectures
|
534
|
+
select_slice "${paths[@]}"
|
535
|
+
local target_path="$SELECT_SLICE_RETVAL"
|
536
|
+
if [[ -z "$target_path" ]]; then
|
537
|
+
echo "warning: [CP] Unable to find matching .xcframework slice in '${paths[@]}' for the current build architectures ($ARCHS)."
|
538
|
+
return
|
539
|
+
fi
|
540
|
+
local source="$basepath/$target_path"
|
541
|
+
|
542
|
+
local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}"
|
543
|
+
|
544
|
+
if [ ! -d "$destination" ]; then
|
545
|
+
mkdir -p "$destination"
|
546
|
+
fi
|
547
|
+
|
548
|
+
copy_dir "$source/" "$destination"
|
549
|
+
|
550
|
+
echo "Copied $source to $destination"
|
551
|
+
}
|
552
|
+
|
553
|
+
install_xcframework "${PODS_ROOT}/_Frameworks/#{pod_name}.xcframework" "#{pod_name}" "framework" "ios-arm64_armv7" "ios-x86_64-simulator"
|
554
|
+
DESC
|
555
|
+
end
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
559
|
+
module Xcodeproj
|
560
|
+
class Project
|
561
|
+
def target_by_name(name)
|
562
|
+
targets.find { |t| t.name == name }
|
563
|
+
end
|
564
|
+
|
565
|
+
def group_by_name(name)
|
566
|
+
groups.find { |g| g.name == name }
|
567
|
+
end
|
568
|
+
|
569
|
+
module Object
|
570
|
+
class PBXGroup
|
571
|
+
def group_by_name(name)
|
572
|
+
groups.find { |g| g.name == name }
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
576
|
+
end
|
577
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require_relative 'dongjia_version_checker'
|
2
|
+
require_relative '../dongjia_binarization'
|
2
3
|
|
3
4
|
module Pod
|
4
5
|
|
5
6
|
class Installer
|
6
7
|
|
7
8
|
class PodSourceInstaller
|
8
|
-
|
9
9
|
# 关闭自己仓库中 pod 的安全警告
|
10
10
|
old_method = instance_method(:verify_source_is_secure)
|
11
11
|
define_method(:verify_source_is_secure) do |root_spec|
|
@@ -14,15 +14,29 @@ module Pod
|
|
14
14
|
old_method.bind(self).(root_spec)
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
17
|
end
|
19
18
|
|
19
|
+
# Hook post_installer
|
20
20
|
origin_perform_post_install_actions = instance_method(:perform_post_install_actions)
|
21
21
|
define_method :perform_post_install_actions do
|
22
22
|
origin_perform_post_install_actions.bind(self).()
|
23
23
|
Dongjia::DongjiaVersionChecker.check_version
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
# Hook Pods.xcodeproj 尚未写入
|
27
|
+
origin_run_podfile_post_install_hooks = instance_method(:run_podfile_post_install_hooks)
|
28
|
+
define_method :run_podfile_post_install_hooks do
|
29
|
+
origin_run_podfile_post_install_hooks.bind(self).()
|
30
|
+
# 处理二进制化
|
31
|
+
# Dongjia::Binarization.process(self)
|
32
|
+
end
|
27
33
|
|
34
|
+
# Hook Pods.xcodeproj 已生成完毕
|
35
|
+
origin_generate_pods_project = instance_method(:generate_pods_project)
|
36
|
+
define_method :generate_pods_project do
|
37
|
+
origin_generate_pods_project.bind(self).()
|
38
|
+
# 处理二进制化
|
39
|
+
Dongjia::Binarization.process(self)
|
40
|
+
end
|
41
|
+
end
|
28
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-dongjia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jiangzhuoyi
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.13.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: down
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 5.2.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 5.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: archive-zip
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.12.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.12.0
|
69
97
|
description: A short description of cocoapods-dongjia.
|
70
98
|
email:
|
71
99
|
- jiangzhuoyi@idongjia.cn
|
@@ -83,26 +111,28 @@ files:
|
|
83
111
|
- lib/cocoapods-dongjia/command/strip.rb
|
84
112
|
- lib/cocoapods-dongjia/gem_version.rb
|
85
113
|
- lib/cocoapods_plugin.rb
|
114
|
+
- lib/dongjia_binarization.rb
|
86
115
|
- lib/dongjia_branch_inspector.rb
|
87
116
|
- lib/dongjia_config.rb
|
88
117
|
- lib/dongjia_enterprise_inspector.rb
|
89
118
|
- lib/dongjia_pods_iterator.rb
|
90
119
|
- lib/dongjia_router.rb
|
91
|
-
- lib/dongjia_scheme_manager.rb
|
92
120
|
- lib/dongjia_source.rb
|
93
121
|
- lib/helper/Core/podfile/dsl.rb
|
94
122
|
- lib/helper/dongjia_version_checker.rb
|
123
|
+
- lib/helper/installer.rb
|
95
124
|
- lib/helper/pod.rb
|
96
125
|
- lib/helper/podfile.rb
|
97
126
|
- lib/helper/podfile_options.rb
|
98
|
-
- lib/helper/podfile_warnings.rb
|
99
127
|
- lib/helper/project.rb
|
100
128
|
homepage: https://github.com/EXAMPLE/cocoapods-dongjia
|
101
129
|
licenses:
|
102
130
|
- MIT
|
103
131
|
metadata:
|
104
|
-
update_desc:
|
105
|
-
|
132
|
+
update_desc: |2
|
133
|
+
- 支持集成二进制版本的 Pod
|
134
|
+
- 优化 reinstall 命令
|
135
|
+
post_install_message:
|
106
136
|
rdoc_options: []
|
107
137
|
require_paths:
|
108
138
|
- lib
|
@@ -117,8 +147,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
147
|
- !ruby/object:Gem::Version
|
118
148
|
version: '0'
|
119
149
|
requirements: []
|
120
|
-
rubygems_version: 3.
|
121
|
-
signing_key:
|
150
|
+
rubygems_version: 3.2.19
|
151
|
+
signing_key:
|
122
152
|
specification_version: 4
|
123
153
|
summary: A longer description of cocoapods-dongjia.
|
124
154
|
test_files: []
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'helper/project'
|
2
|
-
|
3
|
-
module Dongjia
|
4
|
-
|
5
|
-
class SchemeManager
|
6
|
-
|
7
|
-
# 获取主工程的 development team
|
8
|
-
def self.development_team(ctx)
|
9
|
-
team = nil
|
10
|
-
project = ctx.umbrella_targets.first.user_project
|
11
|
-
return team unless project.is_a?(Xcodeproj::Project)
|
12
|
-
|
13
|
-
target = project.targets.find { |t|
|
14
|
-
!t.name.include?('企业版') && !t.name.end_with?('Extension')
|
15
|
-
}
|
16
|
-
return team unless target.is_a?(Xcodeproj::Project::PBXNativeTarget)
|
17
|
-
|
18
|
-
build_cfg = target.build_configurations.find { |c| c.name == 'Debug' }
|
19
|
-
return team unless build_cfg.is_a?(Xcodeproj::Project::XCBuildConfiguration)
|
20
|
-
|
21
|
-
team = build_cfg.build_settings['DEVELOPMENT_TEAM']
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.setup(ctx, params)
|
25
|
-
visibled_appspecs = params[:visibled_appspecs]
|
26
|
-
# return if !visibled_appspecs || visibled_appspecs.empty?
|
27
|
-
sandbox_root = ctx.sandbox_root
|
28
|
-
|
29
|
-
team = development_team(ctx)
|
30
|
-
|
31
|
-
Dir.foreach(sandbox_root).select{|f| f.end_with?('xcodeproj')}.each do |name|
|
32
|
-
proj = Xcodeproj::Project.open(File.join(sandbox_root, name))
|
33
|
-
proj.targets.each do | target |
|
34
|
-
# 确保是 appspec
|
35
|
-
next unless target.name.include?('-')
|
36
|
-
# 确保是可执行程序
|
37
|
-
next unless target.product_type == 'com.apple.product-type.application'
|
38
|
-
|
39
|
-
# 设置签名信息
|
40
|
-
if team.is_a?(String)
|
41
|
-
target.build_configurations.first.build_settings['DEVELOPMENT_TEAM'] = team
|
42
|
-
target.build_configurations.each { |cfg|
|
43
|
-
cfg.build_settings['DEVELOPMENT_TEAM'] = team
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
if visibled_appspecs.include?(target.name.split('-').first)
|
48
|
-
# 将 visibled_appspecs 中指定的 target 设为可见状态
|
49
|
-
proj.set_target_scheme_visible(target, true)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
proj.save if team.is_a?(String)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|