cocoapods-kz 0.0.3 → 0.0.5

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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cocoapods-kz/command/install.rb +7 -6
  3. data/lib/cocoapods-kz/command/repair.rb +2 -2
  4. data/lib/cocoapods-kz/command/update.rb +7 -6
  5. data/lib/cocoapods-kz/gem_version.rb +1 -1
  6. data/lib/cocoapods-kz/helpers/kz_analyzer.rb +41 -4
  7. data/lib/cocoapods-kz/helpers/kz_framework_manager.rb +1 -1
  8. data/lib/cocoapods-kz/helpers/kz_generator.rb +268 -0
  9. data/lib/cocoapods-kz/helpers/{global_helper.rb → kz_global_helper.rb} +30 -6
  10. data/lib/cocoapods-kz/helpers/kz_pod_target.rb +76 -22
  11. data/lib/cocoapods-kz/helpers/repair_dynamic_swift.rb +2 -2
  12. data/lib/cocoapods-kz/helpers/repair_module_import.rb +16 -25
  13. data/lib/cocoapods-kz/native/analyzer.rb +4 -1
  14. data/lib/cocoapods-kz/native/dls.rb +2 -1
  15. data/lib/cocoapods-kz/native/file_accessor.rb +17 -0
  16. data/lib/cocoapods-kz/native/installer.rb +9 -24
  17. data/lib/cocoapods-kz/native/pod_target.rb +17 -0
  18. data/lib/cocoapods-kz/native/pod_target_installer.rb +30 -0
  19. data/lib/cocoapods-kz/native/specification.rb +31 -0
  20. data/lib/cocoapods-kz/native/target.rb +34 -0
  21. data/lib/cocoapods-kz/native/target_installer_helper.rb +125 -0
  22. data/lib/cocoapods-kz/native.rb +6 -2
  23. data/lib/cocoapods-kz/resources/kz_merge_swift_h.rb +14 -0
  24. metadata +10 -8
  25. data/lib/cocoapods-kz/helpers/build_framework_config.rb +0 -53
  26. data/lib/cocoapods-kz/helpers/create_hamp.rb +0 -236
  27. data/lib/cocoapods-kz/helpers/strip_framework_config.rb +0 -40
  28. data/lib/cocoapods-kz/helpers/xml_build_config.rb +0 -57
  29. 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: 8f85aeb7b3f3ec7afa4fec40b6509b2f1fa599970068a00532874ba299c96a3c
4
- data.tar.gz: eac71cb74fad8e788604563a5c10d087523fdaeee86dcd5e4b9edff9b0b645a6
3
+ metadata.gz: 7044ff9b2863844afb3101f6cd2f76a13ff40cfa6f06a7e85f546148b18abdfa
4
+ data.tar.gz: 4fa7b00baa91abeecf6f7dea4703da717639859bc99dab57a4339c9f0bf8ed87
5
5
  SHA512:
6
- metadata.gz: d78c400c79c139d5beb99b5c84e349869abec6507ad4d4b720c3ffd956542e207d34ec55e72273496b074a031fb01299ec79f26959e0611a33fd2a2e7c8d1521
7
- data.tar.gz: d5d61fdecfb237ba596539559f560747c3fdd3145324f2f069ad0e9f1c418b70786f19656405a3906992d1decea96718201f15c1103149967bea85b242e1dfc9
6
+ metadata.gz: 91b58f94829d314e2305bb5844241e43a8371b4af795eee5fa653d974350953cb22caca090d54e5e4e2f6930c5dc04f4cfa0c8b59e4a9c125de3b95b2ada7cb9
7
+ data.tar.gz: e1b3385d1bfefe18eeb4d6db502e3e8fdc563f23b1114205eedf3ce72b8bdd4d8e8b95b7f1995da282ddbc9b6f156a177c6c8b856c0b74d07e87c33283bc101e
@@ -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,10 +19,10 @@ 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', "不再生成frameowrk"]
25
+ ['--no-framework-update', "build后不再生成frameowrk"]
26
26
  ].concat(super).reject { |(name, _)| name == '--no-repo-update' }
27
27
  end
28
28
 
@@ -31,18 +31,19 @@ module Pod
31
31
  use_framework_tag = argv.flag?('framework')
32
32
  help! if use_code_tag && use_framework_tag
33
33
  KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
34
- if Pod.match_version?('~> 1.4')
34
+ if Pod.match_version?('~> 1.11')
35
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
36
  KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
37
37
  end
38
38
  KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
- KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('no-framework-update')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('framework-update') != nil
40
40
 
41
41
  super
42
42
  @additional_args = argv.remainder!
43
43
  end
44
44
 
45
45
  def run
46
+ KZ::KZGlobalHelper.instance.prepare
46
47
  install = Pod::Command::Install.new(CLAide::ARGV.new([*@additional_args]))
47
48
  install.validate!
48
49
  install.run
@@ -13,8 +13,8 @@ module Pod
13
13
 
14
14
  def self.options
15
15
  [
16
- ['--module-import', "修复所有头文件import方式,使其支持module导入,如果后面追加指定Pod名,将只修改该Pod"],
17
- ['--dynamic-swift', "将项目中所有swift添加上OC动态属性,如果后面追加指定Pod名,将只修改该Pod"]
16
+ ['--module-import', "指定组件名(只针对开发组件),修复该组件所有文件头文件导入方式,壳工程使用“Main”,如果不指定,默认对所有开发组件进行修复"],
17
+ ['--dynamic-swift', "指定组件名(只针对开发组件),将该组件中所有swift文件添加OC特性,壳工程使用“Main”,如果不指定,默认对所有开发组件进行修复"]
18
18
  ]
19
19
  end
20
20
 
@@ -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,10 +19,10 @@ 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', "不再生成frameowrk"]
25
+ ['--no-framework-update', "build后不再生成frameowrk"]
26
26
  ].concat(super)
27
27
  end
28
28
 
@@ -31,18 +31,19 @@ module Pod
31
31
  use_framework_tag = argv.flag?('framework')
32
32
  help! if use_code_tag && use_framework_tag
33
33
  KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
34
- if Pod.match_version?('~> 1.4')
34
+ if Pod.match_version?('~> 1.11')
35
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
36
  KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
37
37
  end
38
38
  KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
- KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('no-framework-update')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('framework-update') != nil
40
40
 
41
41
  super
42
42
  @additional_args = argv.remainder!
43
43
  end
44
44
 
45
45
  def run
46
+ KZ::KZGlobalHelper.instance.prepare
46
47
  update = Pod::Command::Update.new(CLAide::ARGV.new([*@additional_args]))
47
48
  update.validate!
48
49
  update.run
@@ -1,5 +1,5 @@
1
1
  module CocoapodsKz
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.5"
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)
@@ -47,7 +67,9 @@ module KZ
47
67
  kz_dependent_target_info[native_dependent_target.name] = kz_dependent_pod_target if kz_dependent_pod_target
48
68
  end
49
69
  kz_pod_target.dependent_target_info = kz_dependent_target_info
50
- kz_pod_target.add_kz_pod_config(KZGlobalHelper.instance.kz_pod_config[native_pod_target_name]) do |repair_dependent_pod_target_name|
70
+ kz_pod_config = KZGlobalHelper.instance.kz_pod_config[native_pod_target_name]
71
+ kz_pod_config = KZGlobalHelper.instance.kz_pod_config[kz_pod_target.root_name] if kz_pod_config == nil
72
+ kz_pod_target.add_kz_pod_config(kz_pod_config) do |repair_dependent_pod_target_name|
51
73
  repair_native_pod_target = get_native_pod_target_with(repair_dependent_pod_target_name)
52
74
  repair_kz_pod_target = nil
53
75
  if repair_native_pod_target
@@ -76,7 +98,7 @@ module KZ
76
98
  end
77
99
 
78
100
  def get_real_config_pod_mode(kz_pod_target)
79
- if KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name)
101
+ if specify_pod_names_contain(kz_pod_target.name)
80
102
  return KZGlobalHelper.instance.specify_pod_mode
81
103
  end
82
104
  :kz_pod_origin_mode
@@ -84,11 +106,26 @@ module KZ
84
106
 
85
107
  def get_use_config_pod_mode(kz_pod_target)
86
108
  if KZGlobalHelper.instance.specify_pod_mode == :kz_pod_framework_mode
87
- KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name) ? :kz_pod_framework_mode : :kz_pod_code_mode
109
+ specify_pod_names_contain(kz_pod_target.name) ? :kz_pod_framework_mode : :kz_pod_code_mode
88
110
  elsif KZGlobalHelper.instance.specify_pod_mode == :kz_pod_code_mode
89
- KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name) ? :kz_pod_code_mode : :kz_pod_framework_mode
111
+ specify_pod_names_contain(kz_pod_target.name) ? :kz_pod_code_mode : :kz_pod_framework_mode
90
112
  end
91
113
  end
92
114
 
115
+ def specify_pod_names_contain(target_name)
116
+ if KZGlobalHelper.instance.specify_pod_names.count > 0
117
+ KZGlobalHelper.instance.specify_pod_names.each do |specify_pod_name|
118
+ if specify_pod_name.end_with?("*")
119
+ _specify_pod_name = specify_pod_name.sub('*', '')
120
+ return true if target_name.start_with?(_specify_pod_name)
121
+ else
122
+ return true if specify_pod_name == target_name
123
+ end
124
+ end
125
+ false
126
+ else
127
+ true
128
+ end
129
+ end
93
130
  end
94
131
  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,268 @@
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}/${FULL_PRODUCT_NAME}/${PRODUCT_NAME}"
52
+ fi
53
+
54
+ if [ -d ${PRODUCT_DIR}/Modules/${PRODUCT_NAME}.swiftmodule ] && [ -d ${PRODUCT_SIMULATOR_DIR}/Modules/${PRODUCT_NAME}.swiftmodule ]; then
55
+ cp -r ${PRODUCT_DIR}/Modules/${PRODUCT_NAME}.swiftmodule "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}/Modules"
56
+ cp -r ${PRODUCT_SIMULATOR_DIR}/Modules/${PRODUCT_NAME}.swiftmodule "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}/Modules"
57
+ fi
58
+
59
+ PRODUCT_SWIFT_H=${PRODUCT_DIR}/Headers/${PRODUCT_NAME}-Swift.h
60
+ PRODUCT_SIMULATOR_SWIFT_H=${PRODUCT_SIMULATOR_DIR}/Headers/${PRODUCT_NAME}-Swift.h
61
+ TARGET_SWIFT_H=${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}/Headers/${PRODUCT_NAME}-Swift.h
62
+ if [ -f $PRODUCT_SWIFT_H ] && [ -f $PRODUCT_SIMULATOR_SWIFT_H ]; then
63
+ ruby "$KZ_MERGE_SWIFT_H_PATH" "$PRODUCT_SWIFT_H" "$PRODUCT_SIMULATOR_SWIFT_H" "$TARGET_SWIFT_H"
64
+ fi
65
+ }
66
+ end
67
+
68
+ def add_flexlib_xml_build_rules(project, native_target)
69
+ return unless KZ::KZGlobalHelper.instance.have_flexLib_pod_target
70
+
71
+ native_target.build_configurations.each do |config|
72
+ config.build_settings["KZ_XML_FLEX_COMPILER"] = FLEX_COMPLIER_PATH.to_s
73
+ config.build_settings["KZ_XML_FLEX_DIR"] = "${TARGET_TEMP_DIR}/XmlFlexs"
74
+ config.build_settings["KZ_XML_FLEX_BUILD_DIR"] = "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.bundle"
75
+ end
76
+
77
+ xml_rule = new_build_rule(project, native_target, '[KZ] Custom Xml Build')
78
+ xml_rule.file_type = 'text.xml'
79
+ xml_rule.output_files = Array['${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex']
80
+ xml_rule.script = %Q{FLEX_PATH=${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex
81
+ rm -rf ${FLEX_PATH}
82
+ $KZ_XML_FLEX_COMPILER $INPUT_FILE_PATH $FLEX_PATH
83
+ if [ -f $FLEX_PATH ] ; then
84
+ cp $FLEX_PATH $KZ_XML_FLEX_BUILD_DIR
85
+ exit 0
86
+ else
87
+ exit 1
88
+ fi}
89
+ end
90
+
91
+ def new_build_rule(project, native_target, name)
92
+ new_rule = nil
93
+ native_target.build_rules.each do |build_rule|
94
+ new_rule = build_rule if build_rule.name == name
95
+ end
96
+
97
+ if new_rule == nil
98
+ new_rule = project.new(Xcodeproj::Project::PBXBuildRule)
99
+ native_target.build_rules << new_rule
100
+ end
101
+
102
+ new_rule.name = name
103
+ new_rule.compiler_spec = 'com.apple.compilers.proxy.script'
104
+ new_rule
105
+ end
106
+
107
+ def create_hamp
108
+ # 创建壳工程hmap
109
+ main_sources_path = @main_project.project_dir + @main_project.root_object.display_name
110
+ private_hmap_hash = {}
111
+ traverse_folder(main_sources_path) do |header_path|
112
+ header_pathname = Pathname.new(header_path)
113
+ header_pathname_basename = header_pathname.basename.to_s
114
+
115
+ header_hmap_value = {}
116
+ header_hmap_value['suffix'] = header_pathname_basename
117
+ header_hmap_value['prefix'] = header_pathname.dirname.to_s + '/'
118
+
119
+ private_hmap_hash[header_pathname_basename] = header_hmap_value
120
+ end
121
+
122
+ unless private_hmap_hash.empty?
123
+ save_hmap_file(private_hmap_hash, KZ_POD_CONFIG_ROOT, @main_project.root_object.display_name)
124
+ end
125
+
126
+ # 创建pod hmap
127
+ @all_kz_pod_targets.each do |target_name, kz_pod_target|
128
+ clean_hmap_cache(kz_pod_target)
129
+
130
+ # 修复头文件导入方式
131
+ all_repair_hmap_info = {}
132
+ need_repair_import_targets = kz_pod_target.repair_import
133
+ if need_repair_import_targets.count > 0
134
+ need_repair_import_targets.each { |need_repair_import_target|
135
+ repair_hmap_info = get_hmap_info_from(need_repair_import_target, HmapContentStyle::QUOTES_REPAIR)
136
+ all_repair_hmap_info.merge!(repair_hmap_info)
137
+ }
138
+ end
139
+
140
+ kz_pod_target.recursive_dependent_targets.each do |recursive_dependent_target|
141
+ if recursive_dependent_target.need_repair_module_import
142
+ header_paths = recursive_dependent_target.public_headers
143
+ header_paths.each do |header_pathname|
144
+ header_pathname_basename = header_pathname.basename.to_s
145
+
146
+ header_hmap_value_quotes = {}
147
+ header_hmap_value_quotes['suffix'] = header_pathname_basename
148
+ header_hmap_value_quotes['prefix'] = recursive_dependent_target.product_basename + '/'
149
+ all_repair_hmap_info["#{recursive_dependent_target.root_name}/#{header_pathname_basename}"] = header_hmap_value_quotes
150
+ end
151
+ end
152
+ end
153
+
154
+ if all_repair_hmap_info.count > 0
155
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
156
+ save_hmap_file(all_repair_hmap_info, hmap_cache_path, target_name + '_repair')
157
+ kz_pod_target.repair_header_search_path = hmap_cache_path + "#{target_name}_repair.hmap"
158
+ end
159
+
160
+ # 添加私有头文件引用
161
+ if kz_pod_target.should_build?
162
+ private_hamp_info = get_hmap_info_from(kz_pod_target, HmapContentStyle::QUOTES_PRIVATE)
163
+ if private_hamp_info.count > 0
164
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
165
+ save_hmap_file(private_hamp_info, hmap_cache_path, target_name)
166
+ kz_pod_target.private_header_search_path = hmap_cache_path + "#{target_name}.hmap"
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ def traverse_folder(folder_path)
173
+ Dir.foreach(folder_path) do |file_name|
174
+ next if file_name == '.' || file_name == '..'
175
+
176
+ file_path = File.join(folder_path, file_name)
177
+ if File.file?(file_path)
178
+ yield(file_path) if file_name.end_with?('.h')
179
+ elsif File.directory?(file_path)
180
+ traverse_folder(file_path) do |path|
181
+ yield(path)
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ def clean_hmap_cache(kz_pod_target)
188
+ hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
189
+ Dir.foreach(hmap_cache_path) do |file_name|
190
+ next if file_name == '.' || file_name == '..'
191
+
192
+ if file_name.end_with?(".hmap", ".json")
193
+ FileUtils.rm(hmap_cache_path + file_name) if File.exist?(hmap_cache_path + file_name)
194
+ end
195
+ end
196
+ end
197
+
198
+ def get_hmap_info_from(kz_pod_target, hmap_content_style)
199
+ header_paths = kz_pod_target.public_headers
200
+ header_paths = kz_pod_target.all_headers if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
201
+ hmap_info = {}
202
+ header_paths.each do |header_pathname|
203
+ header_pathname_basename = header_pathname.basename.to_s
204
+
205
+ header_hmap_value_quotes = {}
206
+ header_hmap_value_quotes['suffix'] = header_pathname_basename
207
+ header_hmap_value_quotes['prefix'] = header_pathname.dirname.to_s + '/'
208
+ hmap_info[header_pathname_basename] = header_hmap_value_quotes
209
+
210
+ if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
211
+ # pch
212
+ pchfile_path = kz_pod_target.prefix_header_path
213
+ if pchfile_path.exist?
214
+ suffix = pchfile_path.basename.to_s
215
+ hmap_info[suffix] = { 'suffix' => suffix, 'prefix' => "#{pchfile_path.dirname.to_s}/" }
216
+ end
217
+
218
+ unless kz_pod_target.is_dev_pod
219
+ # 个别第三方在使用自己组件文件时,会使用#import <xx/xx.h>的方式
220
+ hmap_info[kz_pod_target.product_basename + '/' + header_pathname_basename] = header_hmap_value_quotes
221
+ end
222
+
223
+ if kz_pod_target.uses_swift && kz_pod_target.is_dev_pod
224
+ # 修改SPBoss-Swift.h文件的导入方式
225
+ swift_bridge_file_name = "#{kz_pod_target.name}-Swift.h"
226
+ hmap_info[swift_bridge_file_name] = { 'suffix' => swift_bridge_file_name, 'prefix' => "#{kz_pod_target.name}/" }
227
+
228
+ # 以SPBoss为例,在混编模式中,SPBoss-Swift.h会使用#import <SPBoss/SPBoss.h>方式导入swift需要使用的OC头文件
229
+ # SPBoss中头文件会存在当前组件与framework的Headers中,有两份。SPBoss-Swift.h只在framework中
230
+ # 编译默认从SPBoss-Swift.h找SPBoss.h,然后找SPBoss.h中的头文件也都会在framework中寻在,会造成与当前组件头文件重复
231
+ # 需要重新将#import <SPBoss/SPBoss.h>方式修复为寻找当前组件中的SPBoss.h文件,而不是framework中的SPBoss.h
232
+ if header_pathname_basename == "#{kz_pod_target.name}.h"
233
+ hmap_info[kz_pod_target.name + '/' + header_pathname_basename] = header_hmap_value_quotes
234
+ end
235
+ end
236
+ elsif hmap_content_style == HmapContentStyle::QUOTES_REPAIR
237
+ header_hmap_value_slash = {}
238
+ header_hmap_value_slash['suffix'] = header_pathname_basename
239
+ prefix_name = kz_pod_target.product_basename
240
+ if header_pathname.dirname.to_s.include?('.framework')
241
+ header_pathname.dirname.to_s.split('/').each do |name|
242
+ if name.include?('.framework')
243
+ prefix_name = name.split('.').first
244
+ end
245
+ end
246
+ end
247
+ header_hmap_value_slash['prefix'] = prefix_name + '/'
248
+ hmap_info[header_pathname_basename] = header_hmap_value_slash
249
+ end
250
+ end
251
+ hmap_info
252
+ end
253
+
254
+ def save_hmap_file(hmap_hash, save_path, file_name)
255
+ hmap_json = JSON.pretty_generate(hmap_hash)
256
+ hmap_json_path = save_path + "#{file_name}.json"
257
+ hmap_path = save_path + "#{file_name}.hmap"
258
+ json_file = File.new(hmap_json_path, 'w')
259
+ return unless json_file
260
+
261
+ json_file.syswrite(hmap_json)
262
+ system "#{HMAP_EXECUTE_PATH} convert #{hmap_json_path} #{hmap_path}"
263
+
264
+ FileUtils.rm(hmap_json_path) unless KZ::KZGlobalHelper.instance.debug
265
+ end
266
+
267
+ end
268
+ end
@@ -8,17 +8,33 @@ require_relative 'kz_pod_target'
8
8
 
9
9
  module KZ
10
10
  KZ_POD_CONFIG_ROOT = Pod::Config.instance.installation_root + 'Pods/KZPodConfigure'
11
+ KZ_POD_CONFIG_ROOT_STR = "${PODS_ROOT}/KZPodConfigure"
11
12
  # 修复pod lib报错问题
12
13
  Pod::Config.instance.installation_root = nil
13
14
 
14
15
  HMAP_EXECUTE_PATH = File.dirname(__FILE__) + '/../resources/hmap'
15
16
  FLEX_COMPLIER_PATH = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
16
17
  KZ_LOCK_FILE_PATH = KZ_POD_CONFIG_ROOT + 'KZConfigLock'
18
+ KZ_MERGE_SWIFT_H_PATH = KZ_POD_CONFIG_ROOT + 'kz_merge_swift_h.rb'
19
+
20
+ def self.deal_path_for_xcconfig(path, add_quotes = false)
21
+ if path.is_a?(String)
22
+ path_str = path.sub(KZ::KZ_POD_CONFIG_ROOT.to_s, KZ::KZ_POD_CONFIG_ROOT_STR)
23
+ path_str = ('"' + path_str + '"') if add_quotes
24
+ return path_str
25
+ elsif path.is_a?(Pathname)
26
+ path_str = path.to_s.sub(KZ::KZ_POD_CONFIG_ROOT.to_s, KZ::KZ_POD_CONFIG_ROOT_STR)
27
+ path_str = ('"' + path_str + '"') if add_quotes
28
+ return path_str
29
+ end
30
+ path
31
+ end
17
32
 
18
33
  class KZGlobalHelper
19
34
  attr_accessor :kz_pod_enable
20
35
  attr_accessor :kz_pod_config
21
36
  attr_accessor :kz_analyzer
37
+ attr_accessor :kz_generator
22
38
  attr_accessor :specify_pod_names
23
39
  attr_accessor :specify_pod_mode
24
40
  attr_accessor :debug
@@ -43,17 +59,21 @@ module KZ
43
59
  @@instance ||= new
44
60
  end
45
61
 
46
- def kz_pod_enable=(value)
47
- @kz_pod_enable = value
48
- FileUtils.rm(KZ_LOCK_FILE_PATH) if File.exist?(KZ_LOCK_FILE_PATH)
49
-
50
- if value
62
+ def prepare
63
+ if Pod::Config.instance.podfile && Pod::Config.instance.podfile.plugins.has_key?("cocoapods-kz")
64
+ FileUtils.rm(KZ_LOCK_FILE_PATH) if File.exist?(KZ_LOCK_FILE_PATH)
51
65
  FileUtils.mkdir_p(KZ_POD_CONFIG_ROOT) unless File.exist?(KZ_POD_CONFIG_ROOT)
52
66
 
53
67
  flex_compiler_de_path = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
54
68
  FileUtils.rm(flex_compiler_de_path) if File.exist?(flex_compiler_de_path)
55
69
  FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/FlexCompiler', KZ_POD_CONFIG_ROOT)
56
70
  system("chmod +x #{flex_compiler_de_path}")
71
+ FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/kz_merge_swift_h.rb', KZ_MERGE_SWIFT_H_PATH)
72
+
73
+ Pod::Config.instance.podfile.use_frameworks!(:linkage => :static)
74
+ else
75
+ @kz_pod_enable = false
76
+ @generate_kz_pod_targets = false
57
77
  end
58
78
  end
59
79
 
@@ -77,7 +97,7 @@ module KZ
77
97
  end
78
98
 
79
99
  def pod_config_result_with_target(kz_pod_target)
80
- return nil unless @kz_pod_enable && @kz_analyzer != nil
100
+ return nil unless @kz_pod_enable
81
101
  return nil unless kz_pod_target && kz_pod_target.config_pod_mode == :kz_pod_framework_mode
82
102
 
83
103
  return @pods_config_cache[kz_pod_target.name] if @pods_config_cache.has_key?(kz_pod_target.name)
@@ -110,5 +130,9 @@ module KZ
110
130
  end
111
131
  end
112
132
 
133
+ def kz_merge_swift_h_path
134
+ KZ_POD_CONFIG_ROOT_STR + '/kz_merge_swift_h.rb'
135
+ end
136
+
113
137
  end
114
138
  end