cocoapods-kz 0.0.2 → 0.0.4

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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cocoapods-kz/command/install.rb +12 -9
  3. data/lib/cocoapods-kz/command/kz.rb +1 -0
  4. data/lib/cocoapods-kz/command/repair.rb +47 -0
  5. data/lib/cocoapods-kz/command/update.rb +12 -8
  6. data/lib/cocoapods-kz/gem_version.rb +1 -1
  7. data/lib/cocoapods-kz/helpers/kz_analyzer.rb +46 -3
  8. data/lib/cocoapods-kz/helpers/kz_framework_manager.rb +1 -1
  9. data/lib/cocoapods-kz/helpers/kz_generator.rb +256 -0
  10. data/lib/cocoapods-kz/helpers/kz_global_helper.rb +127 -0
  11. data/lib/cocoapods-kz/helpers/kz_pod_target.rb +95 -24
  12. data/lib/cocoapods-kz/helpers/repair_dynamic_swift.rb +373 -0
  13. data/lib/cocoapods-kz/helpers/repair_module_import.rb +113 -0
  14. data/lib/cocoapods-kz/native/acknowledgements.rb +8 -15
  15. data/lib/cocoapods-kz/native/analyzer.rb +5 -4
  16. data/lib/cocoapods-kz/native/dls.rb +2 -1
  17. data/lib/cocoapods-kz/native/file_accessor.rb +25 -8
  18. data/lib/cocoapods-kz/native/installer.rb +9 -22
  19. data/lib/cocoapods-kz/native/pod_target.rb +17 -0
  20. data/lib/cocoapods-kz/native/pod_target_installer.rb +30 -0
  21. data/lib/cocoapods-kz/native/target.rb +34 -0
  22. data/lib/cocoapods-kz/native/target_installer_helper.rb +105 -0
  23. data/lib/cocoapods-kz/native.rb +4 -1
  24. metadata +13 -10
  25. data/lib/cocoapods-kz/helpers/build_framework_config.rb +0 -48
  26. data/lib/cocoapods-kz/helpers/create_hamp.rb +0 -214
  27. data/lib/cocoapods-kz/helpers/global_helper.rb +0 -71
  28. data/lib/cocoapods-kz/helpers/strip_framework_config.rb +0 -40
  29. data/lib/cocoapods-kz/helpers/xml_build_config.rb +0 -53
  30. data/lib/cocoapods-kz/native/user_project_integrator.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18e1dd57432a470374b85e1794cf69de70759adb36f68c49c7728938ee14a4be
4
- data.tar.gz: a3817262cf67e2e65481738f5cd9ea4f8f4af4ea70a8b763a1ea4260edcc7b0e
3
+ metadata.gz: 2f8cee909ef575acab6b79cbcc8bb35111b0828bdac5b60ff697e09f72939373
4
+ data.tar.gz: 71d9afa7f5b11a7e517c4e2a59fcf91d8b1f9f5ff1e55656187fe23468eb86ab
5
5
  SHA512:
6
- metadata.gz: f34e514bf9be6dfc1932d3d6c636150a168613a0576070d606d22fc750c11065a8a4ba7545a4b807d80490a174d0977703a7cd639cb36aa0ae5670fe8f9eea43
7
- data.tar.gz: e59798c2da8fd42bed9ec76532799256a304d611ea0a94a7e9c38db515d9a0cea69a25e222b13f5f2c8d186eebc720c8b734c7e24c1efb2be8160adc5c895815
6
+ metadata.gz: b313218bd5b0dddd59a8f757306c9d1075d4269867b4f092d643fec4d91640d775c496e18ed35936b5a634daf70ed629cd780e55b1962d88ef4707fc5784137b
7
+ data.tar.gz: 0dfbce6a258f4d94eec260e16856088d9f97533a63f394be0e9cff6ca66e47f4af68048015c0970454b235d72bbd12e55d65054abbd75c000005f484cc656b2b
@@ -1,4 +1,4 @@
1
- require 'cocoapods-kz/helpers/global_helper'
1
+ require 'cocoapods-kz/helpers/kz_global_helper'
2
2
  require 'cocoapods-kz/gem_version'
3
3
 
4
4
  module Pod
@@ -19,28 +19,31 @@ module Pod
19
19
  ['--deployment', 'Disallow any changes to the Podfile or the Podfile.lock during installation'],
20
20
  ['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
21
21
  'applies to projects that have enabled incremental installation'],
22
- ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
23
- ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
22
+ ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开),支持追加*匹配任意内容"],
23
+ ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开),支持追加*匹配任意内容"],
24
24
  ['--debug', "debug模式,会打印调试日志或生成调试文件"],
25
+ ['--no-framework-update', "build后不再生成frameowrk"]
25
26
  ].concat(super).reject { |(name, _)| name == '--no-repo-update' }
26
27
  end
27
28
 
28
29
  def initialize(argv)
29
- @use_code_tag = argv.flag?('code')
30
- @use_framework_tag = argv.flag?('framework')
31
- @debug = argv.flag?('debug')
32
- help! if @use_code_tag && @use_framework_tag
33
- KZ::KZGlobalHelper.instance.analyze_special_parameters(@use_code_tag, @use_framework_tag, argv.arguments!)
30
+ use_code_tag = argv.flag?('code')
31
+ use_framework_tag = argv.flag?('framework')
32
+ help! if use_code_tag && use_framework_tag
33
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
34
34
  if Pod.match_version?('~> 1.4')
35
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
36
37
  end
37
- KZ::KZGlobalHelper.instance.debug = true if @debug
38
+ KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('framework-update') != nil
38
40
 
39
41
  super
40
42
  @additional_args = argv.remainder!
41
43
  end
42
44
 
43
45
  def run
46
+ KZ::KZGlobalHelper.instance.prepare
44
47
  install = Pod::Command::Install.new(CLAide::ARGV.new([*@additional_args]))
45
48
  install.validate!
46
49
  install.run
@@ -1,5 +1,6 @@
1
1
  require_relative 'install'
2
2
  require_relative 'update'
3
+ require_relative 'repair'
3
4
 
4
5
  module Pod
5
6
  class Command
@@ -0,0 +1,47 @@
1
+ require 'cocoapods-kz/helpers/repair_dynamic_swift'
2
+ require 'cocoapods-kz/helpers/repair_module_import'
3
+
4
+ module Pod
5
+ class Command
6
+ class Kz < Command
7
+ class Repair < Kz
8
+ self.summary = 'pod kz repair,用于修复各种不符合规范的场景'
9
+
10
+ self.description = <<-DESC
11
+ 结合可选子命令用于执行各种修补脚本
12
+ DESC
13
+
14
+ def self.options
15
+ [
16
+ ['--module-import', "指定组件名(只针对开发组件),修复该组件所有文件头文件导入方式,壳工程使用“Main”,如果不指定,默认对所有开发组件进行修复"],
17
+ ['--dynamic-swift', "指定组件名(只针对开发组件),将该组件中所有swift文件添加OC特性,壳工程使用“Main”,如果不指定,默认对所有开发组件进行修复"]
18
+ ]
19
+ end
20
+
21
+ def initialize(argv)
22
+ help! if argv.arguments == 0
23
+ @repair_module_import = argv.flag?('module-import')
24
+ @repair_dynamic_swift = argv.flag?('dynamic-swift')
25
+ help! if !@repair_module_import && !@repair_dynamic_swift
26
+
27
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(true, false, argv.arguments!)
28
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
29
+
30
+ super
31
+ end
32
+
33
+ def run
34
+ installer = installer_for_config
35
+ installer.prepare
36
+ installer.resolve_dependencies.analyze
37
+
38
+ if @repair_dynamic_swift
39
+ KZ::KZSwiftAttachOCFeature.new.repair
40
+ else @repair_module_import
41
+ KZ::KZRepairModuleImport.new(installer.aggregate_targets.first.user_project).repair
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,4 +1,4 @@
1
- require 'cocoapods-kz/helpers/global_helper'
1
+ require 'cocoapods-kz/helpers/kz_global_helper'
2
2
 
3
3
  module Pod
4
4
  class Command
@@ -19,27 +19,31 @@ module Pod
19
19
  ['--exclude-pods=podName', 'Pods to exclude during update. Multiple pods must be comma-delimited'],
20
20
  ['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
21
21
  'applies to projects that have enabled incremental installation'],
22
- ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
23
- ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
22
+ ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开),支持追加*匹配任意内容"],
23
+ ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开),支持追加*匹配任意内容"],
24
24
  ['--debug', "debug模式,会打印调试日志或生成调试文件"],
25
+ ['--no-framework-update', "build后不再生成frameowrk"]
25
26
  ].concat(super)
26
27
  end
27
28
 
28
29
  def initialize(argv)
29
- @use_code_tag = argv.flag?('code')
30
- @use_framework_tag = argv.flag?('framework')
31
- help! if @use_code_tag && @use_framework_tag
32
- KZ::KZGlobalHelper.instance.analyze_special_parameters(@use_code_tag, @use_framework_tag, argv.arguments!)
30
+ use_code_tag = argv.flag?('code')
31
+ use_framework_tag = argv.flag?('framework')
32
+ help! if use_code_tag && use_framework_tag
33
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
33
34
  if Pod.match_version?('~> 1.4')
34
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
35
37
  end
36
- KZ::KZGlobalHelper.instance.debug = true if @debug
38
+ KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('framework-update') != nil
37
40
 
38
41
  super
39
42
  @additional_args = argv.remainder!
40
43
  end
41
44
 
42
45
  def run
46
+ KZ::KZGlobalHelper.instance.prepare
43
47
  update = Pod::Command::Update.new(CLAide::ARGV.new([*@additional_args]))
44
48
  update.validate!
45
49
  update.run
@@ -1,5 +1,5 @@
1
1
  module CocoapodsKz
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
4
4
 
5
5
  module Pod
@@ -1,6 +1,8 @@
1
1
  require_relative 'kz_pod_target'
2
+ require_relative 'kz_global_helper'
2
3
 
3
4
  module KZ
5
+
4
6
  class KZAnalyzer
5
7
  attr_accessor :all_kz_pod_targets
6
8
 
@@ -14,6 +16,24 @@ module KZ
14
16
  @native_pod_targets.each { |native_pod_target|
15
17
  create_kz_pod_target_from(native_pod_target, :kz_pod_origin_mode)
16
18
  }
19
+
20
+ # 检测是否有product名称相同的target
21
+ temp_repeat_product_name = []
22
+ @all_kz_pod_targets.each do |name, kz_pod_target|
23
+ if temp_repeat_product_name.include?(kz_pod_target.product_name)
24
+ kz_pod_target.product_name = "#{kz_pod_target.name}.framework"
25
+ kz_pod_target.product_basename = kz_pod_target.name
26
+ result = KZGlobalHelper.instance.pod_config_result_with_target(kz_pod_target)
27
+ if result
28
+ kz_pod_target.repair_modulemap_path = result.resource_path + kz_pod_target.product_name + "Modules/module.modulemap"
29
+ else
30
+ kz_pod_target.repair_modulemap_path = "${PODS_CONFIGURATION_BUILD_DIR}/#{kz_pod_target.name}/#{kz_pod_target.product_name}/Modules/module.modulemap"
31
+ end
32
+ kz_pod_target.need_repair_module_import = true
33
+ else
34
+ temp_repeat_product_name << kz_pod_target.product_name
35
+ end
36
+ end
17
37
  end
18
38
 
19
39
  def create_kz_pod_target_from(native_pod_target, config_pod_mode)
@@ -33,6 +53,14 @@ module KZ
33
53
  end
34
54
  @all_kz_pod_targets[native_pod_target_name] = kz_pod_target
35
55
 
56
+ if is_dev_pod && native_pod_target.test_dependent_targets_by_spec_name.count > 0
57
+ test_pod_targets = native_pod_target.test_dependent_targets_by_spec_name.values.flatten
58
+ test_pod_targets.each do |test_pod_target|
59
+ kz_test_pod_target = create_kz_pod_target_from(test_pod_target, :kz_pod_framework_mode)
60
+ @all_kz_pod_targets[test_pod_target.name] = kz_test_pod_target
61
+ end
62
+ end
63
+
36
64
  kz_dependent_target_info = {}
37
65
  native_pod_target.dependent_targets.each do |native_dependent_target|
38
66
  kz_dependent_pod_target = create_kz_pod_target_from(native_dependent_target, kz_pod_target.config_pod_mode)
@@ -68,7 +96,7 @@ module KZ
68
96
  end
69
97
 
70
98
  def get_real_config_pod_mode(kz_pod_target)
71
- if KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name)
99
+ if specify_pod_names_contain(kz_pod_target.name)
72
100
  return KZGlobalHelper.instance.specify_pod_mode
73
101
  end
74
102
  :kz_pod_origin_mode
@@ -76,11 +104,26 @@ module KZ
76
104
 
77
105
  def get_use_config_pod_mode(kz_pod_target)
78
106
  if KZGlobalHelper.instance.specify_pod_mode == :kz_pod_framework_mode
79
- KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name) ? :kz_pod_framework_mode : :kz_pod_code_mode
107
+ specify_pod_names_contain(kz_pod_target.name) ? :kz_pod_framework_mode : :kz_pod_code_mode
80
108
  elsif KZGlobalHelper.instance.specify_pod_mode == :kz_pod_code_mode
81
- KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name) ? :kz_pod_code_mode : :kz_pod_framework_mode
109
+ specify_pod_names_contain(kz_pod_target.name) ? :kz_pod_code_mode : :kz_pod_framework_mode
82
110
  end
83
111
  end
84
112
 
113
+ def specify_pod_names_contain(target_name)
114
+ if KZGlobalHelper.instance.specify_pod_names.count > 0
115
+ KZGlobalHelper.instance.specify_pod_names.each do |specify_pod_name|
116
+ if specify_pod_name.end_with?("*")
117
+ _specify_pod_name = specify_pod_name.sub('*', '')
118
+ return true if target_name.start_with?(_specify_pod_name)
119
+ else
120
+ return true if specify_pod_name == target_name
121
+ end
122
+ end
123
+ false
124
+ else
125
+ true
126
+ end
127
+ end
85
128
  end
86
129
  end
@@ -1,5 +1,5 @@
1
1
  require_relative 'kz_pod_target'
2
- require_relative 'global_helper'
2
+ require_relative 'kz_global_helper'
3
3
  require_relative 'kz_config_result'
4
4
 
5
5
  module KZ
@@ -0,0 +1,256 @@
1
+ require 'xcodeproj'
2
+ require 'fileutils'
3
+
4
+ module KZ
5
+ class HmapContentStyle
6
+ QUOTES_PRIVATE = 1
7
+ QUOTES_REPAIR = 2
8
+ end
9
+
10
+ class KZGenerator
11
+
12
+ def initialize(main_project)
13
+ @all_kz_pod_targets = KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets
14
+ @main_project = main_project
15
+ end
16
+
17
+ def add_framework_generator_build_phase(native_target)
18
+ return if KZ::KZGlobalHelper.instance.disable_generate_framework
19
+
20
+ build_phase = native_target.new_shell_script_build_phase('[KZ] Generate Framework')
21
+ build_phase.show_env_vars_in_log = '0'
22
+ build_phase.output_paths = ['${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}']
23
+ build_phase.shell_script = %q{
24
+ if [ "${MACH_O_TYPE}" != "staticlib" ]; then
25
+ exit 0
26
+ fi
27
+
28
+ PRODUCT_DIR=${PODS_BUILD_DIR}/Debug-iphoneos/${TARGET_NAME}/${FULL_PRODUCT_NAME}
29
+ PRODUCT_SIMULATOR_DIR=${PODS_BUILD_DIR}/Debug-iphonesimulator/${TARGET_NAME}/${FULL_PRODUCT_NAME}
30
+ CURRENT_PRODUCT_DIR=${PODS_CONFIGURATION_BUILD_DIR}/${TARGET_NAME}
31
+
32
+ if [ -d "${KZ_FRAMEWORK_CACHE_PATH}" ]; then
33
+ rm -r "${KZ_FRAMEWORK_CACHE_PATH}"
34
+ fi
35
+ mkdir -p "${KZ_FRAMEWORK_CACHE_PATH}"
36
+
37
+ if [ -d "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}" ]; then
38
+ rm -r "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}"
39
+ fi
40
+ cp -r ${CURRENT_PRODUCT_DIR}/${FULL_PRODUCT_NAME} "${KZ_FRAMEWORK_CACHE_PATH}"
41
+
42
+ find "${CURRENT_PRODUCT_DIR}" -iname "*.bundle" | while read -r BUNDLE_FILE; do
43
+ BUNDLE_NAME=$(basename ${BUNDLE_FILE})
44
+ if [ -d "${KZ_FRAMEWORK_CACHE_PATH}/${BUNDLE_NAME}" ]; then
45
+ rm -r "${KZ_FRAMEWORK_CACHE_PATH}/${BUNDLE_NAME}"
46
+ fi
47
+ cp -r ${BUNDLE_FILE} "${KZ_FRAMEWORK_CACHE_PATH}"
48
+ done
49
+
50
+ if [ -f ${PRODUCT_DIR}/${PRODUCT_NAME} ] && [ -f ${PRODUCT_SIMULATOR_DIR}/${PRODUCT_NAME} ]; then
51
+ lipo -create ${PRODUCT_DIR}/${PRODUCT_NAME} ${PRODUCT_SIMULATOR_DIR}/${PRODUCT_NAME} -output "${KZ_FRAMEWORK_CACHE_PATH}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}"
52
+ fi
53
+ }
54
+ end
55
+
56
+ def add_flexlib_xml_build_rules(project, native_target)
57
+ return unless KZ::KZGlobalHelper.instance.have_flexLib_pod_target
58
+
59
+ native_target.build_configurations.each do |config|
60
+ config.build_settings["KZ_XML_FLEX_COMPILER"] = FLEX_COMPLIER_PATH.to_s
61
+ config.build_settings["KZ_XML_FLEX_DIR"] = "${TARGET_TEMP_DIR}/XmlFlexs"
62
+ config.build_settings["KZ_XML_FLEX_BUILD_DIR"] = "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.bundle"
63
+ end
64
+
65
+ xml_rule = new_build_rule(project, native_target, '[KZ] Custom Xml Build')
66
+ xml_rule.file_type = 'text.xml'
67
+ xml_rule.output_files = Array['${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex']
68
+ xml_rule.script = %Q{FLEX_PATH=${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex
69
+ rm -rf ${FLEX_PATH}
70
+ $KZ_XML_FLEX_COMPILER $INPUT_FILE_PATH $FLEX_PATH
71
+ if [ -f $FLEX_PATH ] ; then
72
+ cp $FLEX_PATH $KZ_XML_FLEX_BUILD_DIR
73
+ exit 0
74
+ else
75
+ exit 1
76
+ fi}
77
+ end
78
+
79
+ def new_build_rule(project, native_target, name)
80
+ new_rule = nil
81
+ native_target.build_rules.each do |build_rule|
82
+ new_rule = build_rule if build_rule.name == name
83
+ end
84
+
85
+ if new_rule == nil
86
+ new_rule = project.new(Xcodeproj::Project::PBXBuildRule)
87
+ native_target.build_rules << new_rule
88
+ end
89
+
90
+ new_rule.name = name
91
+ new_rule.compiler_spec = 'com.apple.compilers.proxy.script'
92
+ new_rule
93
+ end
94
+
95
+ def create_hamp
96
+ # 创建壳工程hmap
97
+ main_sources_path = @main_project.project_dir + @main_project.root_object.display_name
98
+ private_hmap_hash = {}
99
+ traverse_folder(main_sources_path) do |header_path|
100
+ header_pathname = Pathname.new(header_path)
101
+ header_pathname_basename = header_pathname.basename.to_s
102
+
103
+ header_hmap_value = {}
104
+ header_hmap_value['suffix'] = header_pathname_basename
105
+ header_hmap_value['prefix'] = header_pathname.dirname.to_s + '/'
106
+
107
+ private_hmap_hash[header_pathname_basename] = header_hmap_value
108
+ end
109
+
110
+ unless private_hmap_hash.empty?
111
+ save_hmap_file(private_hmap_hash, KZ_POD_CONFIG_ROOT, @main_project.root_object.display_name)
112
+ end
113
+
114
+ # 创建pod hmap
115
+ @all_kz_pod_targets.each do |target_name, kz_pod_target|
116
+ clean_hmap_cache(kz_pod_target)
117
+
118
+ # 修复头文件导入方式
119
+ all_repair_hmap_info = {}
120
+ need_repair_import_targets = kz_pod_target.repair_import
121
+ if need_repair_import_targets.count > 0
122
+ need_repair_import_targets.each { |need_repair_import_target|
123
+ repair_hmap_info = get_hmap_info_from(need_repair_import_target, HmapContentStyle::QUOTES_REPAIR)
124
+ all_repair_hmap_info.merge!(repair_hmap_info)
125
+ }
126
+ end
127
+
128
+ kz_pod_target.recursive_dependent_targets.each do |recursive_dependent_target|
129
+ if recursive_dependent_target.need_repair_module_import
130
+ header_paths = recursive_dependent_target.public_headers
131
+ header_paths.each do |header_pathname|
132
+ header_pathname_basename = header_pathname.basename.to_s
133
+
134
+ header_hmap_value_quotes = {}
135
+ header_hmap_value_quotes['suffix'] = header_pathname_basename
136
+ header_hmap_value_quotes['prefix'] = recursive_dependent_target.product_basename + '/'
137
+ all_repair_hmap_info["#{recursive_dependent_target.root_name}/#{header_pathname_basename}"] = header_hmap_value_quotes
138
+ end
139
+ end
140
+ end
141
+
142
+ if all_repair_hmap_info.count > 0
143
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
144
+ save_hmap_file(all_repair_hmap_info, hmap_cache_path, target_name + '_repair')
145
+ kz_pod_target.repair_header_search_path = hmap_cache_path + "#{target_name}_repair.hmap"
146
+ end
147
+
148
+ # 添加私有头文件引用
149
+ if kz_pod_target.should_build?
150
+ private_hamp_info = get_hmap_info_from(kz_pod_target, HmapContentStyle::QUOTES_PRIVATE)
151
+ if private_hamp_info.count > 0
152
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
153
+ save_hmap_file(private_hamp_info, hmap_cache_path, target_name)
154
+ kz_pod_target.private_header_search_path = hmap_cache_path + "#{target_name}.hmap"
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ def traverse_folder(folder_path)
161
+ Dir.foreach(folder_path) do |file_name|
162
+ next if file_name == '.' || file_name == '..'
163
+
164
+ file_path = File.join(folder_path, file_name)
165
+ if File.file?(file_path)
166
+ yield(file_path) if file_name.end_with?('.h')
167
+ elsif File.directory?(file_path)
168
+ traverse_folder(file_path) do |path|
169
+ yield(path)
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ def clean_hmap_cache(kz_pod_target)
176
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
177
+ Dir.foreach(hmap_cache_path) do |file_name|
178
+ next if file_name == '.' || file_name == '..'
179
+
180
+ if file_name.end_with?(".hmap", ".json")
181
+ FileUtils.rm(hmap_cache_path + file_name) if File.exist?(hmap_cache_path + file_name)
182
+ end
183
+ end
184
+ end
185
+
186
+ def get_hmap_info_from(kz_pod_target, hmap_content_style)
187
+ header_paths = kz_pod_target.public_headers
188
+ header_paths = kz_pod_target.all_headers if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
189
+ hmap_info = {}
190
+ header_paths.each do |header_pathname|
191
+ header_pathname_basename = header_pathname.basename.to_s
192
+
193
+ header_hmap_value_quotes = {}
194
+ header_hmap_value_quotes['suffix'] = header_pathname_basename
195
+ header_hmap_value_quotes['prefix'] = header_pathname.dirname.to_s + '/'
196
+ hmap_info[header_pathname_basename] = header_hmap_value_quotes
197
+
198
+ if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
199
+ # pch
200
+ pchfile_path = kz_pod_target.prefix_header_path
201
+ if pchfile_path.exist?
202
+ suffix = pchfile_path.basename.to_s
203
+ hmap_info[suffix] = { 'suffix' => suffix, 'prefix' => "#{pchfile_path.dirname.to_s}/" }
204
+ end
205
+
206
+ unless kz_pod_target.is_dev_pod
207
+ # 各别第三方在使用自己组件文件时,会使用#import <xx/xx.h>的方式
208
+ hmap_info[kz_pod_target.name + '/' + header_pathname_basename] = header_hmap_value_quotes
209
+ end
210
+
211
+ if kz_pod_target.uses_swift && kz_pod_target.is_dev_pod
212
+ # 修改SPBoss-Swift.h文件的导入方式
213
+ swift_bridge_file_name = "#{kz_pod_target.name}-Swift.h"
214
+ hmap_info[swift_bridge_file_name] = { 'suffix' => swift_bridge_file_name, 'prefix' => "#{kz_pod_target.name}/" }
215
+
216
+ # 以SPBoss为例,在混编模式中,SPBoss-Swift.h会使用#import <SPBoss/SPBoss.h>方式导入swift需要使用的OC头文件
217
+ # SPBoss中头文件会存在当前组件与framework的Headers中,有两份。SPBoss-Swift.h只在framework中
218
+ # 编译默认从SPBoss-Swift.h找SPBoss.h,然后找SPBoss.h中的头文件也都会在framework中寻在,会造成与当前组件头文件重复
219
+ # 需要重新将#import <SPBoss/SPBoss.h>方式修复为寻找当前组件中的SPBoss.h文件,而不是framework中的SPBoss.h
220
+ if header_pathname_basename == "#{kz_pod_target.name}.h"
221
+ hmap_info[kz_pod_target.name + '/' + header_pathname_basename] = header_hmap_value_quotes
222
+ end
223
+ end
224
+ elsif hmap_content_style == HmapContentStyle::QUOTES_REPAIR
225
+ header_hmap_value_slash = {}
226
+ header_hmap_value_slash['suffix'] = header_pathname_basename
227
+ prefix_name = kz_pod_target.name
228
+ if header_pathname.dirname.to_s.include?('.framework')
229
+ header_pathname.dirname.to_s.split('/').each do |name|
230
+ if name.include?('.framework')
231
+ prefix_name = name.split('.').first
232
+ end
233
+ end
234
+ end
235
+ header_hmap_value_slash['prefix'] = prefix_name + '/'
236
+ hmap_info[header_pathname_basename] = header_hmap_value_slash
237
+ end
238
+ end
239
+ hmap_info
240
+ end
241
+
242
+ def save_hmap_file(hmap_hash, save_path, file_name)
243
+ hmap_json = JSON.pretty_generate(hmap_hash)
244
+ hmap_json_path = save_path + "#{file_name}.json"
245
+ hmap_path = save_path + "#{file_name}.hmap"
246
+ json_file = File.new(hmap_json_path, 'w')
247
+ return unless json_file
248
+
249
+ json_file.syswrite(hmap_json)
250
+ system "#{HMAP_EXECUTE_PATH} convert #{hmap_json_path} #{hmap_path}"
251
+
252
+ FileUtils.rm(hmap_json_path) unless KZ::KZGlobalHelper.instance.debug
253
+ end
254
+
255
+ end
256
+ end
@@ -0,0 +1,127 @@
1
+ require 'cocoapods'
2
+ require 'fileutils'
3
+ require 'json'
4
+ require_relative 'kz_analyzer'
5
+ require_relative 'kz_framework_manager'
6
+ require_relative 'kz_config_result'
7
+ require_relative 'kz_pod_target'
8
+
9
+ module KZ
10
+ KZ_POD_CONFIG_ROOT = Pod::Config.instance.installation_root + 'Pods/KZPodConfigure'
11
+ KZ_POD_CONFIG_ROOT_STR = "${PODS_ROOT}/KZPodConfigure"
12
+ # 修复pod lib报错问题
13
+ Pod::Config.instance.installation_root = nil
14
+
15
+ HMAP_EXECUTE_PATH = File.dirname(__FILE__) + '/../resources/hmap'
16
+ FLEX_COMPLIER_PATH = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
17
+ KZ_LOCK_FILE_PATH = KZ_POD_CONFIG_ROOT + 'KZConfigLock'
18
+
19
+ def self.deal_path_for_xcconfig(path, add_quotes = false)
20
+ if path.is_a?(String)
21
+ path_str = path.sub(KZ::KZ_POD_CONFIG_ROOT.to_s, KZ::KZ_POD_CONFIG_ROOT_STR)
22
+ path_str = ('"' + path_str + '"') if add_quotes
23
+ return path_str
24
+ elsif path.is_a?(Pathname)
25
+ path_str = path.to_s.sub(KZ::KZ_POD_CONFIG_ROOT.to_s, KZ::KZ_POD_CONFIG_ROOT_STR)
26
+ path_str = ('"' + path_str + '"') if add_quotes
27
+ return path_str
28
+ end
29
+ path
30
+ end
31
+
32
+ class KZGlobalHelper
33
+ attr_accessor :kz_pod_enable
34
+ attr_accessor :kz_pod_config
35
+ attr_accessor :kz_analyzer
36
+ attr_accessor :kz_generator
37
+ attr_accessor :specify_pod_names
38
+ attr_accessor :specify_pod_mode
39
+ attr_accessor :debug
40
+ attr_accessor :kz_config_lock
41
+ attr_accessor :disable_generate_framework
42
+ attr_accessor :generate_kz_pod_targets
43
+
44
+ private_class_method :new
45
+
46
+ def initialize
47
+ @kz_pod_enable = false
48
+ @specify_pod_mode = :kz_pod_origin_mode
49
+ @pods_config_cache = {}
50
+ @debug = false
51
+ @kz_config_lock = {}
52
+ @disable_generate_framework = false
53
+ @generate_kz_pod_targets = false
54
+ end
55
+
56
+ @@instance = nil
57
+ def self.instance
58
+ @@instance ||= new
59
+ end
60
+
61
+ def prepare
62
+ FileUtils.rm(KZ_LOCK_FILE_PATH) if File.exist?(KZ_LOCK_FILE_PATH)
63
+ FileUtils.mkdir_p(KZ_POD_CONFIG_ROOT) unless File.exist?(KZ_POD_CONFIG_ROOT)
64
+
65
+ flex_compiler_de_path = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
66
+ FileUtils.rm(flex_compiler_de_path) if File.exist?(flex_compiler_de_path)
67
+ FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/FlexCompiler', KZ_POD_CONFIG_ROOT)
68
+ system("chmod +x #{flex_compiler_de_path}")
69
+
70
+ Pod::Config.instance.podfile.use_frameworks!(:linkage => :static) if Pod::Config.instance.podfile
71
+ end
72
+
73
+ def analyze_special_parameters(use_code_tag, use_framework_tag, pod_names)
74
+ specify_pod_names = []
75
+ if pod_names.count > 0
76
+ pod_names.each do |param|
77
+ if param.include?(',')
78
+ specify_pod_names.concat(param.split(","))
79
+ else
80
+ specify_pod_names << param
81
+ end
82
+ end
83
+ end
84
+ @specify_pod_names = specify_pod_names
85
+ if use_code_tag
86
+ @specify_pod_mode = :kz_pod_code_mode
87
+ elsif use_framework_tag
88
+ @specify_pod_mode = :kz_pod_framework_mode
89
+ end
90
+ end
91
+
92
+ def pod_config_result_with_target(kz_pod_target)
93
+ return nil unless @kz_pod_enable
94
+ return nil unless kz_pod_target && kz_pod_target.config_pod_mode == :kz_pod_framework_mode
95
+
96
+ return @pods_config_cache[kz_pod_target.name] if @pods_config_cache.has_key?(kz_pod_target.name)
97
+
98
+ result = KZFrameworkManager.validate_framework_and_get_result(kz_pod_target)
99
+
100
+ @pods_config_cache[kz_pod_target.name] = result if result
101
+ result
102
+ end
103
+
104
+ def have_flexLib_pod_target
105
+ @kz_analyzer.kz_pod_targets_with("FlexLib").count > 0
106
+ end
107
+
108
+ def write_lock_file
109
+ self.kz_analyzer.all_kz_pod_targets.values.each do |kz_pod_target|
110
+ result = pod_config_result_with_target(kz_pod_target)
111
+
112
+ @kz_config_lock[kz_pod_target.name] ||= {}
113
+ @kz_config_lock[kz_pod_target.name]["dev_pod"] = kz_pod_target.is_dev_pod
114
+ @kz_config_lock[kz_pod_target.name]["use_framework"] = (result != nil)
115
+ @kz_config_lock[kz_pod_target.name]["version"] = kz_pod_target.version
116
+ end
117
+
118
+ if @kz_config_lock.count > 0
119
+ lock_file_content = JSON.pretty_generate(@kz_config_lock)
120
+ File.open(KZ_LOCK_FILE_PATH, 'w') do |file|
121
+ file.write(lock_file_content)
122
+ end
123
+ end
124
+ end
125
+
126
+ end
127
+ end