cocoapods-kz 0.0.13 → 0.0.15
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-kz/command/info.rb +5 -2
- data/lib/cocoapods-kz/command/repair.rb +19 -12
- data/lib/cocoapods-kz/gem_version.rb +1 -1
- data/lib/cocoapods-kz/helpers/kz_analyzer.rb +29 -0
- data/lib/cocoapods-kz/helpers/kz_framework_manager.rb +24 -1
- data/lib/cocoapods-kz/helpers/{kz_generator.rb → kz_generator_hmap.rb} +2 -222
- data/lib/cocoapods-kz/helpers/kz_generator_on_demand_resources.rb +231 -0
- data/lib/cocoapods-kz/helpers/kz_global_helper.rb +38 -8
- data/lib/cocoapods-kz/helpers/kz_pod_target.rb +79 -5
- data/lib/cocoapods-kz/helpers/repair_module_import.rb +1 -1
- data/lib/cocoapods-kz/native/build_configuration.rb +12 -0
- data/lib/cocoapods-kz/native/dls.rb +13 -7
- data/lib/cocoapods-kz/native/file_accessor.rb +25 -5
- data/lib/cocoapods-kz/native/installer.rb +11 -2
- data/lib/cocoapods-kz/native/path_list.rb +11 -0
- data/lib/cocoapods-kz/native/pod_target_installer.rb +0 -20
- data/lib/cocoapods-kz/native/specification.rb +6 -0
- data/lib/cocoapods-kz/native/target_installer_helper.rb +36 -1
- data/lib/cocoapods-kz/native/target_integrator.rb +6 -12
- data/lib/cocoapods-kz/native.rb +2 -0
- data/lib/cocoapods-kz/resources/FlexCompiler_V1 +0 -0
- data/lib/cocoapods-kz/resources/on_demand_resources/kz_on_demand_resources_process.rb +194 -0
- data/lib/cocoapods-kz/resources/on_demand_resources/kz_on_demand_resources_xocde.sh +4 -81
- metadata +8 -7
- data/lib/cocoapods-kz/native/dsl_spec.rb +0 -7
- data/lib/cocoapods-kz/resources/on_demand_resources/kz_complete_asset_pack_output_spec_plist.rb +0 -26
- data/lib/cocoapods-kz/resources/on_demand_resources/kz_create_asset_pack_manifest_plist.rb +0 -44
- data/lib/cocoapods-kz/resources/on_demand_resources/kz_create_on_demand_resources_plis.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 772c4e4e048e8879e3a0e9a922b887c3206338c9ec397f8747b017891f47e51d
|
4
|
+
data.tar.gz: 995dfcee40ec45c2c6b23d43bc7d08a8e3c8e2c6570fc9d7881c76850b679014
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 802feb2c0501d20a2cf5b18031ee8f029d8b234a28bb9c8e6b6fbf6a21ac27d429a90af7f26aadb6977fb4b76d9e9e75cb07e94b33b1acbd0d0eb969bf7e065b
|
7
|
+
data.tar.gz: 3b9c1b52b50bb27d1b5f2ae8d595cd427409c0fc0653a0781ae5ae394efdfa5d2642d1fe6d29f2e12ef9b92c6e08ce276201ab2843b777bb9b9dcacacc9899a6
|
@@ -11,8 +11,11 @@ module Pod
|
|
11
11
|
DESC
|
12
12
|
|
13
13
|
def initialize(argv)
|
14
|
-
|
15
|
-
|
14
|
+
if Pod.match_version?('~> 1.11')
|
15
|
+
KZ::KZGlobalHelper.instance.kz_pod_enable = true
|
16
|
+
KZ::KZGlobalHelper.instance.analyze_special_parameters(true, false, argv.arguments!)
|
17
|
+
KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
|
18
|
+
end
|
16
19
|
super
|
17
20
|
end
|
18
21
|
|
@@ -25,24 +25,31 @@ module Pod
|
|
25
25
|
@repair_private_hmap = argv.flag?('private-hmap')
|
26
26
|
banner! unless @repair_module_import || @repair_dynamic_swift || @repair_private_hmap
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
if Pod.match_version?('~> 1.11')
|
29
|
+
KZ::KZGlobalHelper.instance.kz_pod_enable = true
|
30
|
+
KZ::KZGlobalHelper.instance.analyze_special_parameters(true, false, argv.arguments!)
|
31
|
+
KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
|
32
|
+
end
|
30
33
|
|
31
34
|
super
|
32
35
|
end
|
33
36
|
|
34
37
|
def run
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
38
|
+
KZ::KZGlobalHelper.instance.prepare
|
39
|
+
|
40
|
+
if KZ::KZGlobalHelper.instance.kz_pod_enable
|
41
|
+
installer = installer_for_config
|
42
|
+
installer.prepare
|
43
|
+
installer.resolve_dependencies
|
44
|
+
installer.download_dependencies
|
45
|
+
|
46
|
+
if @repair_dynamic_swift
|
47
|
+
KZ::KZSwiftAttachOCFeature.new.repair
|
48
|
+
elsif @repair_module_import
|
49
|
+
KZ::KZRepairModuleImport.new(installer.aggregate_targets.first.user_project).repair
|
50
|
+
else @repair_private_hmap
|
45
51
|
KZ::KZGlobalHelper.instance.kz_generator.create_hamp
|
52
|
+
end
|
46
53
|
end
|
47
54
|
end
|
48
55
|
end
|
@@ -3,18 +3,41 @@ require_relative 'kz_global_helper'
|
|
3
3
|
|
4
4
|
module KZ
|
5
5
|
|
6
|
+
class KZFlexLibInfo
|
7
|
+
attr_accessor :have_flexLib_pod
|
8
|
+
attr_accessor :have_kzswiftui_pod
|
9
|
+
attr_accessor :flexLib_version
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@have_flexLib_pod = false
|
13
|
+
@have_kzswiftui_pod = false
|
14
|
+
@flexLib_version = Pod::Version::ZERO
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
6
18
|
class KZAnalyzer
|
7
19
|
attr_accessor :all_kz_pod_targets
|
20
|
+
attr_accessor :pod_of_flexlib_info
|
8
21
|
|
9
22
|
def initialize(native_pod_targets, development_pods)
|
10
23
|
@native_pod_targets = native_pod_targets
|
11
24
|
@development_pods = development_pods.keys
|
12
25
|
@all_kz_pod_targets = {}
|
26
|
+
@pod_of_flexlib_info = KZFlexLibInfo.new
|
13
27
|
end
|
14
28
|
|
15
29
|
def analyer
|
16
30
|
@native_pod_targets.each { |native_pod_target|
|
17
31
|
create_kz_pod_target_from(native_pod_target, :kz_pod_origin_mode)
|
32
|
+
|
33
|
+
if native_pod_target.root_spec.name == "FlexLib"
|
34
|
+
@pod_of_flexlib_info ||= KZFlexLibInfo()
|
35
|
+
@pod_of_flexlib_info.have_flexLib_pod = true
|
36
|
+
@pod_of_flexlib_info.flexLib_version = native_pod_target.root_spec.version
|
37
|
+
elsif native_pod_target.root_spec.name == "KZSwiftUI"
|
38
|
+
@pod_of_flexlib_info ||= KZFlexLibInfo()
|
39
|
+
@pod_of_flexlib_info.have_kzswiftui_pod = true
|
40
|
+
end
|
18
41
|
}
|
19
42
|
|
20
43
|
# 检测是否有product名称相同的target
|
@@ -59,6 +82,12 @@ module KZ
|
|
59
82
|
kz_pod_target = KZPodTarget.new(native_pod_target)
|
60
83
|
is_dev_pod = @development_pods.include?(native_pod_target_name)
|
61
84
|
kz_pod_target.is_dev_pod = is_dev_pod
|
85
|
+
if KZGlobalHelper.instance.on_demand_resources_info.enable
|
86
|
+
on_demand_resources_config_patterns = KZGlobalHelper.instance.on_demand_resources_info.config_plist_path_patterns[kz_pod_target.root_name]
|
87
|
+
unless on_demand_resources_config_patterns.nil?
|
88
|
+
kz_pod_target.on_demand_resources_config_patterns = on_demand_resources_config_patterns
|
89
|
+
end
|
90
|
+
end
|
62
91
|
kz_pod_target.force_config_pod_mode = get_force_config_pod_mode(kz_pod_target)
|
63
92
|
if config_pod_mode != :kz_pod_origin_mode && !is_dev_pod
|
64
93
|
kz_pod_target.config_pod_mode = config_pod_mode
|
@@ -2,6 +2,7 @@ require_relative 'kz_pod_target'
|
|
2
2
|
require_relative 'kz_global_helper'
|
3
3
|
require_relative 'kz_config_result'
|
4
4
|
require 'tmpdir'
|
5
|
+
require 'shellwords'
|
5
6
|
require_relative 'kz_log'
|
6
7
|
|
7
8
|
module KZ
|
@@ -50,6 +51,26 @@ module KZ
|
|
50
51
|
@@all_resources_cache_info
|
51
52
|
end
|
52
53
|
|
54
|
+
def self.handle_origin_library(origin_libraries, kz_pod_target)
|
55
|
+
tempdir = Pathname(Dir.mktmpdir)
|
56
|
+
lib_frameworks_path = tempdir + "lib_frameworks"
|
57
|
+
FileUtils.mkdir_p(lib_frameworks_path)
|
58
|
+
|
59
|
+
origin_lib_frameworks = []
|
60
|
+
origin_libraries.each do |origin_library_path|
|
61
|
+
lib_framework_name = origin_library_path.basename(origin_library_path.extname)
|
62
|
+
lib_framework_path = lib_frameworks_path + "#{lib_framework_name}.framework"
|
63
|
+
FileUtils.mkdir_p(lib_framework_path)
|
64
|
+
|
65
|
+
FileUtils.cp(origin_library_path, lib_framework_path + lib_framework_name)
|
66
|
+
origin_lib_frameworks.append(lib_framework_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
new_frameworks = handle_origin_framework(origin_lib_frameworks, kz_pod_target)
|
70
|
+
FileUtils.rm_r(tempdir)
|
71
|
+
new_frameworks
|
72
|
+
end
|
73
|
+
|
53
74
|
def self.handle_origin_framework(origin_frameworks, kz_pod_target)
|
54
75
|
new_frameworks = []
|
55
76
|
old_destination_path = kz_pod_target.pod_config_cache_path(false , true)
|
@@ -181,7 +202,9 @@ module KZ
|
|
181
202
|
FileUtils.mkdir_p(ar_x_path)
|
182
203
|
ar_x_success = system("cd #{ar_x_path}; ar x #{arm64_framework_exe_path}")
|
183
204
|
if ar_x_success
|
184
|
-
|
205
|
+
Dir["#{ar_x_path}/*.o"].each do |file|
|
206
|
+
system(ARM64_TO_SIMULATOR_EXECUTE_PATH, file)
|
207
|
+
end
|
185
208
|
system("ar crv #{temp_framwork_exe_path} #{ar_x_path}/*.o &> /dev/null")
|
186
209
|
else
|
187
210
|
FileUtils.rm_r(tempdir)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'xcodeproj'
|
2
2
|
require 'fileutils'
|
3
|
+
require_relative 'kz_generator_on_demand_resources'
|
3
4
|
|
4
5
|
module KZ
|
5
6
|
|
@@ -8,8 +9,6 @@ module KZ
|
|
8
9
|
def initialize(main_project)
|
9
10
|
@all_kz_pod_targets = KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets
|
10
11
|
@main_project = main_project
|
11
|
-
@installation_root = Pod::Config.instance.installation_root
|
12
|
-
@on_demand_resources_folder = KZ_POD_CONFIG_ROOT + "OnDemandResources"
|
13
12
|
end
|
14
13
|
|
15
14
|
def add_framework_generator_build_phase(native_target)
|
@@ -346,224 +345,5 @@ module KZ
|
|
346
345
|
json_file.close
|
347
346
|
end
|
348
347
|
|
349
|
-
def create_on_demand_resources
|
350
|
-
# 清除历史配置
|
351
|
-
FileUtils.rm_r(@on_demand_resources_folder) if File.exist?(@on_demand_resources_folder)
|
352
|
-
FileUtils.mkdir_p(@on_demand_resources_folder)
|
353
|
-
|
354
|
-
# 汇总所有配置文件,用于代码中加载资源
|
355
|
-
on_demand_resources_all_config = {}
|
356
|
-
@all_kz_pod_targets.each do |target_name, kz_pod_target|
|
357
|
-
if kz_pod_target.is_dev_pod
|
358
|
-
# 寻找配置文件KZOnDemandResourcesConfig.plist
|
359
|
-
kz_pod_target.native_pod_target.file_accessors.each do |file_accessor|
|
360
|
-
file_accessor.resource_bundles.map do |bundle_name, paths|
|
361
|
-
paths.each do |path|
|
362
|
-
if path.basename.to_s == "KZOnDemandResourcesConfig.plist"
|
363
|
-
plist_hash = Xcodeproj::Plist.read_from_path(path)
|
364
|
-
if plist_hash.size > 0
|
365
|
-
on_demand_resources_all_config[kz_pod_target.name] = plist_hash
|
366
|
-
analyze_on_demand_resources_config_plist(plist_hash, kz_pod_target, paths)
|
367
|
-
kz_pod_target.add_on_demand_resources(path)
|
368
|
-
end
|
369
|
-
end
|
370
|
-
end
|
371
|
-
end
|
372
|
-
end
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
if on_demand_resources_all_config.size > 0
|
377
|
-
use_for_code_plist_path = @on_demand_resources_folder + "KZOnDemandResourcesAllConfig.plist"
|
378
|
-
Xcodeproj::Plist.write_to_path(on_demand_resources_all_config, use_for_code_plist_path)
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
def analyze_on_demand_resources_config_plist(plist_hash, kz_pod_target, all_resources_paths)
|
383
|
-
resources_path = @on_demand_resources_folder + "Bundles/#{kz_pod_target.name}"
|
384
|
-
FileUtils.mkdir_p(resources_path)
|
385
|
-
|
386
|
-
# 生成AssetPackOutputSpecifications.plist,用于Images.xcassets编译
|
387
|
-
asset_pack_output_specifications_resources = []
|
388
|
-
|
389
|
-
# 用于生成OnDemandResources.plist文件,放到main bundle中标记按需加载资源
|
390
|
-
on_demand_resources_plist = {}
|
391
|
-
bundle_resource_request_tags = {}
|
392
|
-
on_demand_resources_plist["NSBundleResourceRequestTags"] = bundle_resource_request_tags
|
393
|
-
bundle_resource_request_asset_packs = {}
|
394
|
-
on_demand_resources_plist["NSBundleResourceRequestAssetPacks"] = bundle_resource_request_asset_packs
|
395
|
-
|
396
|
-
# 统计所有的xcassets资源
|
397
|
-
have_config_xcassets = false
|
398
|
-
|
399
|
-
# 从配置plist中读取'Initial Install Tags'资源
|
400
|
-
initial_plist_hash = plist_hash["Initial Install Tags"]
|
401
|
-
on_deman_resources_from_plist(initial_plist_hash, kz_pod_target, 1, all_resources_paths, resources_path) do |tag, bundle_id, bundle_path, normal_file_names, have_xcassets_paths|
|
402
|
-
# 如有配置中有.xcassets资源,需要先标记,等待编译时单独再单独编译
|
403
|
-
if have_xcassets_paths
|
404
|
-
have_config_xcassets = true
|
405
|
-
|
406
|
-
resource_item = {}
|
407
|
-
resource_item["bundle-id"] = bundle_id
|
408
|
-
resource_item["bundle-path"] = bundle_path
|
409
|
-
resource_item["tags"] = [tag]
|
410
|
-
asset_pack_output_specifications_resources << resource_item
|
411
|
-
end
|
412
|
-
|
413
|
-
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
414
|
-
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
415
|
-
end
|
416
|
-
|
417
|
-
# Prefetched Tag Order
|
418
|
-
prefetched_plist_hash = plist_hash["Prefetched Tag Order"]
|
419
|
-
on_deman_resources_from_plist(prefetched_plist_hash, kz_pod_target, 0.5, all_resources_paths, resources_path) do |tag, bundle_id, bunlde_path, normal_file_names, have_xcassets_paths|
|
420
|
-
if have_xcassets_paths
|
421
|
-
have_config_xcassets = true
|
422
|
-
|
423
|
-
resource_item = {}
|
424
|
-
resource_item["bundle-id"] = bundle_id
|
425
|
-
resource_item["bundle-path"] = bunlde_path
|
426
|
-
resource_item["tags"] = [tag]
|
427
|
-
asset_pack_output_specifications_resources << resource_item
|
428
|
-
end
|
429
|
-
|
430
|
-
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
431
|
-
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
432
|
-
end
|
433
|
-
|
434
|
-
# Download Only On Demand
|
435
|
-
download_plist_hash = plist_hash["Download Only On Demand"]
|
436
|
-
on_deman_resources_from_plist(download_plist_hash, kz_pod_target, 0, all_resources_paths, resources_path) do |tag, bundle_id, bunlde_path, normal_file_names, have_xcassets_paths|
|
437
|
-
if have_xcassets_paths
|
438
|
-
have_config_xcassets = true
|
439
|
-
|
440
|
-
resource_item = {}
|
441
|
-
resource_item["bundle-id"] = bundle_id
|
442
|
-
resource_item["bundle-path"] = bunlde_path
|
443
|
-
resource_item["tags"] = [tag]
|
444
|
-
asset_pack_output_specifications_resources << resource_item
|
445
|
-
end
|
446
|
-
|
447
|
-
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
448
|
-
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
449
|
-
end
|
450
|
-
|
451
|
-
if asset_pack_output_specifications_resources.size > 0
|
452
|
-
write_to_path(asset_pack_output_specifications_resources, resources_path + "AssetPackOutputSpecifications.plist")
|
453
|
-
end
|
454
|
-
|
455
|
-
if bundle_resource_request_tags.size > 0 || bundle_resource_request_asset_packs.size > 0
|
456
|
-
Xcodeproj::Plist.write_to_path(on_demand_resources_plist, resources_path + "OnDemandResources.plist")
|
457
|
-
end
|
458
|
-
|
459
|
-
# 一个组件可能有多个xcassets,只要其中一个有配置on demand resources,所有xcassets都需要单独编译
|
460
|
-
all_xcassets_paths = []
|
461
|
-
if have_config_xcassets
|
462
|
-
all_resources_paths.each do |path|
|
463
|
-
if path.extname == ".xcassets"
|
464
|
-
all_xcassets_paths << path
|
465
|
-
end
|
466
|
-
end
|
467
|
-
end
|
468
|
-
|
469
|
-
target_bundle_info = {}
|
470
|
-
target_bundle_info["name"] = kz_pod_target.name
|
471
|
-
target_bundle_info["xcassets_paths"] = all_xcassets_paths
|
472
|
-
Xcodeproj::Plist.write_to_path(target_bundle_info, resources_path + "TargetBundleInfo.plist")
|
473
|
-
|
474
|
-
end
|
475
|
-
|
476
|
-
def on_deman_resources_from_plist(plist_hash, kz_pod_target, priority, all_resources_paths, resources_path)
|
477
|
-
return unless (!plist_hash.nil? && plist_hash.size > 0)
|
478
|
-
|
479
|
-
plist_hash.each do |tag, file_paths|
|
480
|
-
normal_file_names = []
|
481
|
-
normal_file_paths = []
|
482
|
-
have_xcassets_paths = false
|
483
|
-
file_paths.each do |rel_file_path|
|
484
|
-
file_path = @installation_root + rel_file_path.strip
|
485
|
-
next unless file_path.exist?
|
486
|
-
|
487
|
-
if file_path.extname == ".imageset"
|
488
|
-
# imageset文件配置
|
489
|
-
xcassets_path = find_xcassets_path(file_path)
|
490
|
-
if all_resources_paths.include?(xcassets_path)
|
491
|
-
kz_pod_target.add_on_demand_resources(xcassets_path)
|
492
|
-
have_xcassets_paths = true
|
493
|
-
end
|
494
|
-
|
495
|
-
content_json_path = file_path + "Contents.json"
|
496
|
-
content_json = JSON.parse(File.read(file_path + "Contents.json"))
|
497
|
-
content_json["properties"] = { "on-demand-resource-tags" => [tag] }
|
498
|
-
content_json_file = File.new(content_json_path, 'w')
|
499
|
-
content_json_file.syswrite(JSON.pretty_generate(content_json))
|
500
|
-
else
|
501
|
-
# 普通文件配置
|
502
|
-
if all_resources_paths.include?(file_path)
|
503
|
-
kz_pod_target.add_on_demand_resources(file_path)
|
504
|
-
normal_file_paths << file_path
|
505
|
-
normal_file_names << file_path.basename
|
506
|
-
end
|
507
|
-
end
|
508
|
-
end
|
509
|
-
|
510
|
-
create_bundle_info_plist(tag, priority, normal_file_paths, resources_path) do |bundle_id, bundle_path|
|
511
|
-
yield(tag, bundle_id, bundle_path, normal_file_names, have_xcassets_paths)
|
512
|
-
end
|
513
|
-
end
|
514
|
-
end
|
515
|
-
|
516
|
-
def find_xcassets_path(path)
|
517
|
-
return "" if path.root?
|
518
|
-
|
519
|
-
if path.extname == ".xcassets"
|
520
|
-
path
|
521
|
-
else
|
522
|
-
find_xcassets_path(path + "..")
|
523
|
-
end
|
524
|
-
end
|
525
|
-
|
526
|
-
def create_bundle_info_plist(tag, priority, normal_file_paths, resource_path)
|
527
|
-
# project bundle identifier
|
528
|
-
project_bundle_identifier = KZGlobalHelper.instance.on_demand_resources_bundle_id
|
529
|
-
tag_md5 = md5_sign(tag)
|
530
|
-
# bundle folder
|
531
|
-
demand_bundle_folder_name = "#{project_bundle_identifier}.#{tag}-#{tag_md5}.assetpack"
|
532
|
-
demand_bundle_folder = resource_path + "OnDemandResources/#{demand_bundle_folder_name}"
|
533
|
-
# create bundle folder
|
534
|
-
FileUtils.mkdir_p(demand_bundle_folder) unless FileTest::exist?(demand_bundle_folder)
|
535
|
-
# copy file
|
536
|
-
normal_file_paths.each do |file|
|
537
|
-
FileUtils.cp(file, demand_bundle_folder)
|
538
|
-
end
|
539
|
-
|
540
|
-
bundle_info_plist = {}
|
541
|
-
bundle_info_plist["Priority"] = priority if priority > 0
|
542
|
-
bundle_info_plist["Tags"] = [tag]
|
543
|
-
demand_bundle_id = "#{project_bundle_identifier}.asset-pack-#{tag_md5}"
|
544
|
-
bundle_info_plist["CFBundleIdentifier"] = demand_bundle_id
|
545
|
-
Xcodeproj::Plist.write_to_path(bundle_info_plist, demand_bundle_folder + "Info.plist")
|
546
|
-
|
547
|
-
yield(demand_bundle_id, demand_bundle_folder_name)
|
548
|
-
end
|
549
|
-
|
550
|
-
def md5_sign(key)
|
551
|
-
OpenSSL::Digest::MD5.hexdigest(key)
|
552
|
-
end
|
553
|
-
|
554
|
-
# Xcodeproj::Plist.write_to_path只支持hash,如果是数组需要重写write方法
|
555
|
-
def write_to_path(hash, path)
|
556
|
-
unless path.is_a?(String) || path.is_a?(Pathname)
|
557
|
-
raise TypeError, "The given `#{path}` must be a string or 'pathname'."
|
558
|
-
end
|
559
|
-
path = path.to_s
|
560
|
-
raise IOError, 'Empty path.' if path.empty?
|
561
|
-
|
562
|
-
File.open(path, 'w') do |f|
|
563
|
-
plist = Nanaimo::Plist.new(hash, :xml)
|
564
|
-
Nanaimo::Writer::XMLWriter.new(plist, :pretty => true, :output => f, :strict => false).write
|
565
|
-
end
|
566
|
-
end
|
567
|
-
|
568
348
|
end
|
569
|
-
end
|
349
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module KZ
|
5
|
+
class KZGenerator
|
6
|
+
|
7
|
+
def create_on_demand_resources
|
8
|
+
kz_on_demand_resources_all_config_path = KZ_POD_CONFIG_ROOT + "KZOnDemandResourcesAllConfig.plist"
|
9
|
+
FileUtils.rm(kz_on_demand_resources_all_config_path) if File.exist?(kz_on_demand_resources_all_config_path)
|
10
|
+
|
11
|
+
# 汇总所有配置文件,用于代码中加载资源
|
12
|
+
on_demand_resources_all_config = {}
|
13
|
+
@all_kz_pod_targets.each do |target_name, kz_pod_target|
|
14
|
+
on_demand_resources_info = kz_pod_target.on_demand_resources_info
|
15
|
+
next if on_demand_resources_info.empty?
|
16
|
+
|
17
|
+
analyze_on_demand_resources_config_plist(on_demand_resources_info, kz_pod_target)
|
18
|
+
on_demand_resources_all_config[target_name] = on_demand_resources_info
|
19
|
+
end
|
20
|
+
|
21
|
+
# 将汇总的配置写入app中,供代码读取
|
22
|
+
if on_demand_resources_all_config.size > 0
|
23
|
+
write_to_path(on_demand_resources_all_config, kz_on_demand_resources_all_config_path)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_all_xcassets(kz_pod_target)
|
28
|
+
all_xcassets_paths = []
|
29
|
+
kz_pod_target.native_pod_target.file_accessors.each do |file_accessor|
|
30
|
+
file_accessor.resource_bundles.map do |bundle_name, paths|
|
31
|
+
paths.each do |path|
|
32
|
+
if path.extname == ".xcassets"
|
33
|
+
all_xcassets_paths << path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
all_xcassets_paths
|
39
|
+
end
|
40
|
+
|
41
|
+
def analyze_on_demand_resources_config_plist(plist_hash, kz_pod_target)
|
42
|
+
resources_path = kz_pod_target.pod_config_cache_path(false, false, true)
|
43
|
+
FileUtils.rm_r(resources_path) if File.exist?(resources_path)
|
44
|
+
FileUtils.mkdir_p(resources_path)
|
45
|
+
kz_pod_target.on_demand_resources_config_path = resources_path.to_s
|
46
|
+
|
47
|
+
# 生成AssetPackOutputSpecifications.plist,用于Images.xcassets编译
|
48
|
+
asset_pack_output_specifications_resources = []
|
49
|
+
|
50
|
+
# 用于生成OnDemandResources.plist文件,放到main bundle中标记按需加载资源
|
51
|
+
on_demand_resources_plist = {}
|
52
|
+
bundle_resource_request_tags = {}
|
53
|
+
on_demand_resources_plist["NSBundleResourceRequestTags"] = bundle_resource_request_tags
|
54
|
+
bundle_resource_request_asset_packs = {}
|
55
|
+
on_demand_resources_plist["NSBundleResourceRequestAssetPacks"] = bundle_resource_request_asset_packs
|
56
|
+
|
57
|
+
# 用于odr资源编译时读取所需的参数
|
58
|
+
odr_build_info = {}
|
59
|
+
|
60
|
+
# 从配置plist中读取'Initial Install Tags'资源
|
61
|
+
initial_plist_hash = plist_hash["Initial Install Tags"]
|
62
|
+
on_demand_resources_from_plist(initial_plist_hash, kz_pod_target, 1, resources_path, odr_build_info) do |tag, bundle_id, bundle_path, normal_file_names, have_xcassets_paths|
|
63
|
+
# 如有配置中有.xcassets资源,需要先标记,等待编译时单独再单独编译
|
64
|
+
if have_xcassets_paths
|
65
|
+
resource_item = {}
|
66
|
+
resource_item["bundle-id"] = bundle_id
|
67
|
+
resource_item["bundle-path"] = bundle_path
|
68
|
+
resource_item["tags"] = [tag]
|
69
|
+
asset_pack_output_specifications_resources << resource_item
|
70
|
+
end
|
71
|
+
|
72
|
+
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
73
|
+
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
74
|
+
end
|
75
|
+
|
76
|
+
# Prefetched Tag Order
|
77
|
+
prefetched_plist_hash = plist_hash["Prefetched Tag Order"]
|
78
|
+
on_demand_resources_from_plist(prefetched_plist_hash, kz_pod_target, 0.5, resources_path, odr_build_info) do |tag, bundle_id, bunlde_path, normal_file_names, have_xcassets_paths|
|
79
|
+
if have_xcassets_paths
|
80
|
+
resource_item = {}
|
81
|
+
resource_item["bundle-id"] = bundle_id
|
82
|
+
resource_item["bundle-path"] = bunlde_path
|
83
|
+
resource_item["tags"] = [tag]
|
84
|
+
asset_pack_output_specifications_resources << resource_item
|
85
|
+
end
|
86
|
+
|
87
|
+
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
88
|
+
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
89
|
+
end
|
90
|
+
|
91
|
+
# Download Only On Demand
|
92
|
+
download_plist_hash = plist_hash["Download Only On Demand"]
|
93
|
+
on_demand_resources_from_plist(download_plist_hash, kz_pod_target, 0, resources_path, odr_build_info) do |tag, bundle_id, bunlde_path, normal_file_names, have_xcassets_paths|
|
94
|
+
if have_xcassets_paths
|
95
|
+
resource_item = {}
|
96
|
+
resource_item["bundle-id"] = bundle_id
|
97
|
+
resource_item["bundle-path"] = bunlde_path
|
98
|
+
resource_item["tags"] = [tag]
|
99
|
+
asset_pack_output_specifications_resources << resource_item
|
100
|
+
end
|
101
|
+
|
102
|
+
bundle_resource_request_tags[tag] = { "NSAssetPacks" => [bundle_id] }
|
103
|
+
bundle_resource_request_asset_packs[bundle_id] = normal_file_names if normal_file_names.size > 0
|
104
|
+
end
|
105
|
+
|
106
|
+
if asset_pack_output_specifications_resources.size > 0
|
107
|
+
write_to_path(asset_pack_output_specifications_resources, resources_path + "AssetPackOutputSpecifications.plist")
|
108
|
+
end
|
109
|
+
|
110
|
+
if bundle_resource_request_tags.size > 0 || bundle_resource_request_asset_packs.size > 0
|
111
|
+
write_to_path(on_demand_resources_plist, resources_path + "OnDemandResources.plist")
|
112
|
+
end
|
113
|
+
|
114
|
+
unless odr_build_info.empty?
|
115
|
+
all_xcassets_dest_plist_path = kz_pod_target.pod_config_cache_path(false, false, true) + "odr_build_info.plist"
|
116
|
+
write_to_path(odr_build_info, all_xcassets_dest_plist_path)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def on_demand_resources_from_plist(plist_hash, kz_pod_target, priority, resources_path, odr_build_info)
|
121
|
+
return unless (!plist_hash.nil? && plist_hash.size > 0)
|
122
|
+
|
123
|
+
all_normal_file_names = []
|
124
|
+
plist_hash.each do |tag, file_paths|
|
125
|
+
normal_file_names = []
|
126
|
+
normal_file_paths = []
|
127
|
+
|
128
|
+
have_xcassets_paths = false
|
129
|
+
file_paths.each do |file_path|
|
130
|
+
next unless file_path.exist?
|
131
|
+
|
132
|
+
if file_path.extname == ".imageset"
|
133
|
+
have_xcassets_paths = true
|
134
|
+
xcassets_path = find_xcassets_path(file_path)
|
135
|
+
unless xcassets_path.nil?
|
136
|
+
on_demand_resources_xcassets(kz_pod_target, odr_build_info, xcassets_path) do |tag_info|
|
137
|
+
tag_info[file_path.relative_path_from(xcassets_path)] = tag
|
138
|
+
end
|
139
|
+
end
|
140
|
+
else
|
141
|
+
# 普通文件配置
|
142
|
+
normal_file_paths << file_path
|
143
|
+
normal_file_names << file_path.basename
|
144
|
+
all_normal_file_names << file_path.basename
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
create_bundle_info_plist(tag, priority, normal_file_paths, resources_path) do |bundle_id, bundle_path|
|
149
|
+
yield(tag, bundle_id, bundle_path, normal_file_names, have_xcassets_paths)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
unless all_normal_file_names.empty?
|
154
|
+
odr_build_info["normal_files"] ||= []
|
155
|
+
odr_normal_files = odr_build_info["normal_files"]
|
156
|
+
odr_normal_files.concat(all_normal_file_names)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def find_xcassets_path(path)
|
161
|
+
return nil if path.root?
|
162
|
+
|
163
|
+
if path.extname == ".xcassets"
|
164
|
+
path
|
165
|
+
else
|
166
|
+
find_xcassets_path(path.parent)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def on_demand_resources_xcassets(kz_pod_target, odr_build_info, xcassets_path)
|
171
|
+
if odr_build_info["all_xcassets"].nil?
|
172
|
+
all_xcassets_info = {}
|
173
|
+
all_xcassets_paths = kz_pod_target.all_xcassets_paths
|
174
|
+
all_xcassets_paths.each do |path|
|
175
|
+
all_xcassets_info[path.basename.to_s] = { "path" => path.to_s, "tags" => {} }
|
176
|
+
end
|
177
|
+
odr_build_info["all_xcassets"] = all_xcassets_info
|
178
|
+
end
|
179
|
+
all_xcassets_info = odr_build_info["all_xcassets"]
|
180
|
+
xcassets_name = xcassets_path.basename.to_s
|
181
|
+
xcassets_info = all_xcassets_info[xcassets_name]
|
182
|
+
if xcassets_info.nil?
|
183
|
+
all_xcassets_info[xcassets_name] = { "path" => xcassets_path.to_s, "tags" => {} }
|
184
|
+
end
|
185
|
+
yield(all_xcassets_info[xcassets_name]["tags"])
|
186
|
+
end
|
187
|
+
|
188
|
+
def create_bundle_info_plist(tag, priority, normal_file_paths, resource_path)
|
189
|
+
# project bundle identifier
|
190
|
+
project_bundle_identifier = KZGlobalHelper.instance.on_demand_resources_info.bundle_id
|
191
|
+
tag_md5 = md5_sign(tag)
|
192
|
+
# bundle folder
|
193
|
+
demand_bundle_folder_name = "#{project_bundle_identifier}.#{tag}-#{tag_md5}.assetpack"
|
194
|
+
demand_bundle_folder = resource_path + "OnDemandResources/#{demand_bundle_folder_name}"
|
195
|
+
# create bundle folder
|
196
|
+
FileUtils.mkdir_p(demand_bundle_folder) unless FileTest::exist?(demand_bundle_folder)
|
197
|
+
# copy file
|
198
|
+
normal_file_paths.each do |file|
|
199
|
+
FileUtils.cp(file, demand_bundle_folder)
|
200
|
+
end
|
201
|
+
|
202
|
+
bundle_info_plist = {}
|
203
|
+
bundle_info_plist["Priority"] = priority if priority > 0
|
204
|
+
bundle_info_plist["Tags"] = [tag]
|
205
|
+
demand_bundle_id = "#{project_bundle_identifier}.asset-pack-#{tag_md5}"
|
206
|
+
bundle_info_plist["CFBundleIdentifier"] = demand_bundle_id
|
207
|
+
Xcodeproj::Plist.write_to_path(bundle_info_plist, demand_bundle_folder + "Info.plist")
|
208
|
+
|
209
|
+
yield(demand_bundle_id, demand_bundle_folder_name)
|
210
|
+
end
|
211
|
+
|
212
|
+
def md5_sign(key)
|
213
|
+
OpenSSL::Digest::MD5.hexdigest(key)
|
214
|
+
end
|
215
|
+
|
216
|
+
# Xcodeproj::Plist.write_to_path只支持hash,如果是数组需要重写write方法
|
217
|
+
def write_to_path(hash, path)
|
218
|
+
unless path.is_a?(String) || path.is_a?(Pathname)
|
219
|
+
raise TypeError, "The given `#{path}` must be a string or 'pathname'."
|
220
|
+
end
|
221
|
+
path = path.to_s
|
222
|
+
raise IOError, 'Empty path.' if path.empty?
|
223
|
+
|
224
|
+
File.open(path, 'w') do |f|
|
225
|
+
plist = Nanaimo::Plist.new(hash, :xml)
|
226
|
+
Nanaimo::Writer::XMLWriter.new(plist, :pretty => true, :output => f, :strict => false).write
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
end
|