cocoapods-kz 0.0.1
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 +7 -0
- data/lib/cocoapods-kz/command/install.rb +51 -0
- data/lib/cocoapods-kz/command/kz.rb +41 -0
- data/lib/cocoapods-kz/command/update.rb +50 -0
- data/lib/cocoapods-kz/command.rb +1 -0
- data/lib/cocoapods-kz/gem_version.rb +9 -0
- data/lib/cocoapods-kz/helpers/build_framework_config.rb +48 -0
- data/lib/cocoapods-kz/helpers/create_hamp.rb +214 -0
- data/lib/cocoapods-kz/helpers/global_helper.rb +71 -0
- data/lib/cocoapods-kz/helpers/kz_analyzer.rb +86 -0
- data/lib/cocoapods-kz/helpers/kz_config_result.rb +41 -0
- data/lib/cocoapods-kz/helpers/kz_framework_manager.rb +52 -0
- data/lib/cocoapods-kz/helpers/kz_pod_target.rb +174 -0
- data/lib/cocoapods-kz/helpers/strip_framework_config.rb +40 -0
- data/lib/cocoapods-kz/helpers/xml_build_config.rb +53 -0
- data/lib/cocoapods-kz/native/acknowledgements.rb +26 -0
- data/lib/cocoapods-kz/native/analyzer.rb +20 -0
- data/lib/cocoapods-kz/native/dls.rb +42 -0
- data/lib/cocoapods-kz/native/file_accessor.rb +87 -0
- data/lib/cocoapods-kz/native/installer.rb +33 -0
- data/lib/cocoapods-kz/native/user_project_integrator.rb +16 -0
- data/lib/cocoapods-kz/native.rb +11 -0
- data/lib/cocoapods-kz/resources/FlexCompiler +0 -0
- data/lib/cocoapods-kz/resources/hmap +0 -0
- data/lib/cocoapods-kz.rb +1 -0
- data/lib/cocoapods_plugin.rb +2 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8a317f2398ad6a77714f19384835a99c77ec15219cdebe66aca2641365d4e0cf
|
4
|
+
data.tar.gz: 99fdf75cc916699c8a899c537d0d54093445f62e00b0f7a18eaa4c036a09b763
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '09bc36c2bccf0d934ff3962d87a681e46f2e0017dae03f34c09dc960a45fc49a140e46e48f9024547ddfe2c3a61da5811f901191f3073f0edd53a4c1ca27fc4f'
|
7
|
+
data.tar.gz: 900c51c4d49bae1fe6aca9b844af5f56570651c031198e5addfbbb7e70574a8a3312b563dcec88421b6a3c484879e7aef4e05ba9595202b3beb2ed7f08a0ca03
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'cocoapods-kz/helpers/global_helper'
|
2
|
+
require 'cocoapods-kz/gem_version'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Command
|
6
|
+
class Kz < Command
|
7
|
+
class Install < Kz
|
8
|
+
self.summary = 'pod kz install,用于指定pod是否开启framework模式'
|
9
|
+
|
10
|
+
self.description = <<-DESC
|
11
|
+
pod kz install 通过 --kz-framework与指定pod名(多个pod,使用英文逗号隔开),尝试开启这些pod的framework模式,如果framwork不存在则仍然会使用code模式
|
12
|
+
通过 --kz-code 与指定pod名(多个pod,使用英文逗号隔开),尝试开启这些pod的code模式,其余pod将尝试使用framework模式,如果framwork不存在则仍然会使用code模式
|
13
|
+
如果不添加任何参数,则默认所有pod为code模式,--kz-framework与--kz-code不能同时使用
|
14
|
+
DESC
|
15
|
+
|
16
|
+
def self.options
|
17
|
+
[
|
18
|
+
['--repo-update', 'Force running `pod repo update` before install'],
|
19
|
+
['--deployment', 'Disallow any changes to the Podfile or the Podfile.lock during installation'],
|
20
|
+
['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
|
21
|
+
'applies to projects that have enabled incremental installation'],
|
22
|
+
['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
|
23
|
+
['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
|
24
|
+
['--debug', "debug模式,会打印调试日志或生成调试文件"],
|
25
|
+
].concat(super).reject { |(name, _)| name == '--no-repo-update' }
|
26
|
+
end
|
27
|
+
|
28
|
+
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!)
|
34
|
+
if Pod.match_version?('~> 1.4')
|
35
|
+
KZ::KZGlobalHelper.instance.kz_pod_enable = true
|
36
|
+
end
|
37
|
+
KZ::KZGlobalHelper.instance.debug = true if @debug
|
38
|
+
|
39
|
+
super
|
40
|
+
@additional_args = argv.remainder!
|
41
|
+
end
|
42
|
+
|
43
|
+
def run
|
44
|
+
install = Pod::Command::Install.new(CLAide::ARGV.new([*@additional_args]))
|
45
|
+
install.validate!
|
46
|
+
install.run
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'install'
|
2
|
+
require_relative 'update'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Command
|
6
|
+
# This is an example of a cocoapods plugin adding a top-level subcommand
|
7
|
+
# to the 'pod' command.
|
8
|
+
#
|
9
|
+
# You can also create subcommands of existing or new commands. Say you
|
10
|
+
# wanted to add a subcommand to `list` to show newly deprecated pods,
|
11
|
+
# (e.g. `pod list deprecated`), there are a few things that would need
|
12
|
+
# to change.
|
13
|
+
#
|
14
|
+
# - move this file to `lib/pod/command/list/deprecated.rb` and update
|
15
|
+
# the class to exist in the the Pod::Command::List namespace
|
16
|
+
# - change this class to extend from `List` instead of `Command`. This
|
17
|
+
# tells the plugin system that it is a subcommand of `list`.
|
18
|
+
# - edit `lib/cocoapods_plugins.rb` to require this file
|
19
|
+
#
|
20
|
+
# @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
|
21
|
+
# in the `plugins.json` file, once your plugin is released.
|
22
|
+
#
|
23
|
+
class Kz < Command
|
24
|
+
self.summary = 'Short description of cocoapods-kz.'
|
25
|
+
self.abstract_command = true
|
26
|
+
self.description = <<-DESC
|
27
|
+
看准组建化头文件管理、混编、二进制化
|
28
|
+
DESC
|
29
|
+
|
30
|
+
def initialize(argv)
|
31
|
+
@help = argv.flag?('help')
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate!
|
36
|
+
super
|
37
|
+
banner! if @help
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'cocoapods-kz/helpers/global_helper'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Command
|
5
|
+
class Kz < Command
|
6
|
+
class Update < Kz
|
7
|
+
self.summary = 'pod kz update,用于指定pod是否开启framework模式'
|
8
|
+
|
9
|
+
self.description = <<-DESC
|
10
|
+
pod kz update 通过 --kz-framework与指定pod名(多个pod,使用英文逗号隔开),尝试开启这些pod的framework模式,如果framwork不存在则仍然会使用code模式
|
11
|
+
通过 --kz-code 与指定pod名(多个pod,使用英文逗号隔开),尝试开启这些pod的code模式,其余pod将尝试使用framework模式,如果framwork不存在则仍然会使用code模式
|
12
|
+
如果不添加任何参数,则默认所有pod为code模式,--kz-framework与--kz-code不能同时使用
|
13
|
+
DESC
|
14
|
+
|
15
|
+
def self.options
|
16
|
+
[
|
17
|
+
["--sources=#{Pod::TrunkSource::TRUNK_REPO_URL}", 'The sources from which to update dependent pods. ' \
|
18
|
+
'Multiple sources must be comma-delimited'],
|
19
|
+
['--exclude-pods=podName', 'Pods to exclude during update. Multiple pods must be comma-delimited'],
|
20
|
+
['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
|
21
|
+
'applies to projects that have enabled incremental installation'],
|
22
|
+
['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
|
23
|
+
['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
|
24
|
+
['--debug', "debug模式,会打印调试日志或生成调试文件"],
|
25
|
+
].concat(super)
|
26
|
+
end
|
27
|
+
|
28
|
+
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!)
|
33
|
+
if Pod.match_version?('~> 1.4')
|
34
|
+
KZ::KZGlobalHelper.instance.kz_pod_enable = true
|
35
|
+
end
|
36
|
+
KZ::KZGlobalHelper.instance.debug = true if @debug
|
37
|
+
|
38
|
+
super
|
39
|
+
@additional_args = argv.remainder!
|
40
|
+
end
|
41
|
+
|
42
|
+
def run
|
43
|
+
update = Pod::Command::Update.new(CLAide::ARGV.new([*@additional_args]))
|
44
|
+
update.validate!
|
45
|
+
update.run
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-kz/command/kz'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module KZ
|
2
|
+
class BuildFrameworkConfig
|
3
|
+
|
4
|
+
def initialize(main_project, pod_project)
|
5
|
+
@pod_project = pod_project
|
6
|
+
end
|
7
|
+
|
8
|
+
def config_project
|
9
|
+
@pod_project.targets.each do |target|
|
10
|
+
if target.isa == "PBXNativeTarget" && target.product_type == "com.apple.product-type.framework"
|
11
|
+
generate_framework_script = target.new_shell_script_build_phase('[KZ] Generate Framework')
|
12
|
+
generate_framework_script.show_env_vars_in_log = '0'
|
13
|
+
generate_framework_script.always_out_of_date = '1'
|
14
|
+
generate_framework_script.shell_script = %q{
|
15
|
+
if [ "${MACH_O_TYPE}" != "staticlib" ]; then
|
16
|
+
exit 0
|
17
|
+
fi
|
18
|
+
|
19
|
+
if [ "${ACTION}" != "build" ]; then
|
20
|
+
exit 0
|
21
|
+
fi
|
22
|
+
|
23
|
+
PRODUCT_DIR=${PODS_BUILD_DIR}/Debug-iphoneos/${TARGET_NAME}/${FULL_PRODUCT_NAME}
|
24
|
+
PRODUCT_SIMULATOR_DIR=${PODS_BUILD_DIR}/Debug-iphonesimulator/${TARGET_NAME}/${FULL_PRODUCT_NAME}
|
25
|
+
CURRENT_PRODUCT_DIR=${PODS_CONFIGURATION_BUILD_DIR}/${TARGET_NAME}
|
26
|
+
|
27
|
+
if [ -d "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}" ]; then
|
28
|
+
rm -r "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}"
|
29
|
+
fi
|
30
|
+
cp -r ${CURRENT_PRODUCT_DIR}/${FULL_PRODUCT_NAME} "${KZ_FRAMEWORK_CACHE_PATH}"
|
31
|
+
|
32
|
+
find "${CURRENT_PRODUCT_DIR}" -iname "*.bundle" -type d | while read -r BUNDLE_FILE; do
|
33
|
+
BUNDLE_NAME=$(basename ${BUNDLE_FILE})
|
34
|
+
if [ -d "${KZ_FRAMEWORK_CACHE_PATH}/${BUNDLE_NAME}" ]; then
|
35
|
+
rm -r "${KZ_FRAMEWORK_CACHE_PATH}/${BUNDLE_NAME}"
|
36
|
+
fi
|
37
|
+
cp -r ${BUNDLE_FILE} "${KZ_FRAMEWORK_CACHE_PATH}"
|
38
|
+
done
|
39
|
+
|
40
|
+
if [ -f ${PRODUCT_DIR}/${PRODUCT_NAME} ] && [ -f ${PRODUCT_SIMULATOR_DIR}/${PRODUCT_NAME} ]; then
|
41
|
+
lipo -create ${PRODUCT_DIR}/${PRODUCT_NAME} ${PRODUCT_SIMULATOR_DIR}/${PRODUCT_NAME} -output "${KZ_FRAMEWORK_CACHE_PATH}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}"
|
42
|
+
fi
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,214 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require_relative 'global_helper'
|
3
|
+
|
4
|
+
module KZ
|
5
|
+
class HmapContentStyle
|
6
|
+
QUOTES_PRIVATE = 1
|
7
|
+
QUOTES_REPAIR = 2
|
8
|
+
end
|
9
|
+
|
10
|
+
class CreateHmap
|
11
|
+
|
12
|
+
def initialize(main_project, pod_project)
|
13
|
+
@main_project = main_project
|
14
|
+
@pod_project = pod_project
|
15
|
+
end
|
16
|
+
|
17
|
+
def traverse_folder(folder_path)
|
18
|
+
Dir.foreach(folder_path) do |file_name|
|
19
|
+
next if file_name == '.' || file_name == '..'
|
20
|
+
|
21
|
+
file_path = File.join(folder_path, file_name)
|
22
|
+
if File.file?(file_path)
|
23
|
+
yield(file_path) if file_name.end_with?('.h')
|
24
|
+
elsif File.directory?(file_path)
|
25
|
+
traverse_folder(file_path) do |file_path|
|
26
|
+
yield(file_path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_pod_pchfile_path(target_name)
|
33
|
+
@pod_project.project_dir + 'Target Support Files' + target_name + "#{target_name}-prefix.pch"
|
34
|
+
end
|
35
|
+
|
36
|
+
def save_hmap_file(hmap_hash, save_path, file_name)
|
37
|
+
hmap_json = JSON.pretty_generate(hmap_hash)
|
38
|
+
hmap_json_path = save_path + "#{file_name}.json"
|
39
|
+
hmap_path = save_path + "#{file_name}.hmap"
|
40
|
+
json_file = File.new(hmap_json_path, 'w')
|
41
|
+
return unless json_file
|
42
|
+
|
43
|
+
json_file.syswrite(hmap_json)
|
44
|
+
system "#{HMAP_EXECUTE_PATH} convert #{hmap_json_path} #{hmap_path}"
|
45
|
+
|
46
|
+
FileUtils.rm(hmap_json_path) unless KZ::KZGlobalHelper.instance.debug
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_main_hamp
|
50
|
+
main_sources_path = @main_project.project_dir + @main_project.root_object.display_name
|
51
|
+
private_hmap_hash = {}
|
52
|
+
traverse_folder(main_sources_path) do |header_path|
|
53
|
+
header_pathname = Pathname.new(header_path)
|
54
|
+
header_pathname_basename = header_pathname.basename.to_s
|
55
|
+
|
56
|
+
header_hmap_value = {}
|
57
|
+
header_hmap_value['suffix'] = header_pathname_basename
|
58
|
+
header_hmap_value['prefix'] = header_pathname.dirname.to_s + '/'
|
59
|
+
|
60
|
+
private_hmap_hash[header_pathname_basename] = header_hmap_value
|
61
|
+
end
|
62
|
+
|
63
|
+
if !private_hmap_hash.empty?
|
64
|
+
save_hmap_file(private_hmap_hash, KZ_POD_CONFIG_ROOT, @main_project.root_object.display_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
@main_project.targets.each do |target|
|
68
|
+
if target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.application"
|
69
|
+
target.build_configurations.each do |config|
|
70
|
+
config.build_settings['HEADER_SEARCH_PATHS'] = "${PODS_ROOT}/#{@main_project.root_object.display_name }.hmap"
|
71
|
+
config.build_settings['USE_HEADERMAP'] = 'NO'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_all_native_target_from(project)
|
78
|
+
all_native_target = {}
|
79
|
+
|
80
|
+
project.targets.each do |target|
|
81
|
+
if target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.framework" and !target.name.start_with?('Pods-')
|
82
|
+
all_native_target[target.name] = target
|
83
|
+
end
|
84
|
+
end
|
85
|
+
all_native_target
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_all_handle_target_from(project)
|
89
|
+
all_handle_target = {}
|
90
|
+
|
91
|
+
project.targets.each do |target|
|
92
|
+
if !(target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.bundle") and !target.name.start_with?('Pods-')
|
93
|
+
all_handle_target[target.name] = target
|
94
|
+
end
|
95
|
+
end
|
96
|
+
all_handle_target
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_hmap_info_from(kz_pod_target, hmap_content_style)
|
100
|
+
header_paths = kz_pod_target.public_headers
|
101
|
+
header_paths = kz_pod_target.all_headers if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
|
102
|
+
hmap_info = {}
|
103
|
+
header_paths.each do |header_pathname|
|
104
|
+
header_pathname_basename = header_pathname.basename.to_s
|
105
|
+
|
106
|
+
header_hmap_value_quotes = {}
|
107
|
+
header_hmap_value_quotes['suffix'] = header_pathname_basename
|
108
|
+
header_hmap_value_quotes['prefix'] = header_pathname.dirname.to_s + '/'
|
109
|
+
hmap_info[header_pathname_basename] = header_hmap_value_quotes
|
110
|
+
|
111
|
+
if hmap_content_style == HmapContentStyle::QUOTES_PRIVATE
|
112
|
+
# pch
|
113
|
+
pchfile_path = get_pod_pchfile_path(kz_pod_target.name)
|
114
|
+
if pchfile_path.exist?
|
115
|
+
suffix = pchfile_path.basename.to_s
|
116
|
+
prefix = pchfile_path.dirname.to_s + '/'
|
117
|
+
header_hmap_value = {}
|
118
|
+
header_hmap_value['suffix'] = suffix
|
119
|
+
header_hmap_value['prefix'] = prefix
|
120
|
+
hmap_info[suffix] = header_hmap_value
|
121
|
+
end
|
122
|
+
|
123
|
+
unless kz_pod_target.is_dev_pod
|
124
|
+
# 各别第三方在使用自己组件文件时,会使用#import <xx/xx.h>的方式
|
125
|
+
hmap_info[kz_pod_target.name + '/' + header_pathname_basename] = header_hmap_value_quotes
|
126
|
+
end
|
127
|
+
|
128
|
+
# 例如SPBoss.h会被在SPBoss-Swift.h中以#import <SPBoss/SPBoss.h>的方式使用,需要重定义寻找路径
|
129
|
+
if kz_pod_target.uses_swift && kz_pod_target.is_dev_pod && header_pathname_basename == "#{kz_pod_target.name}.h"
|
130
|
+
hmap_info[kz_pod_target.name + '/' + header_pathname_basename] = header_hmap_value_quotes
|
131
|
+
end
|
132
|
+
elsif hmap_content_style == HmapContentStyle::QUOTES_REPAIR
|
133
|
+
header_hmap_value_slash = {}
|
134
|
+
header_hmap_value_slash['suffix'] = header_pathname_basename
|
135
|
+
header_hmap_value_slash['prefix'] = kz_pod_target.name + '/'
|
136
|
+
hmap_info[header_pathname_basename] = header_hmap_value_slash
|
137
|
+
end
|
138
|
+
end
|
139
|
+
hmap_info
|
140
|
+
end
|
141
|
+
|
142
|
+
def create_pod_hamp(all_kz_pod_targets)
|
143
|
+
all_handle_targets = get_all_handle_target_from(@pod_project)
|
144
|
+
all_handle_targets.each do |target_name, target|
|
145
|
+
kz_pod_target = all_kz_pod_targets[target_name]
|
146
|
+
next unless kz_pod_target
|
147
|
+
|
148
|
+
# 修复头文件导入方式
|
149
|
+
kz_recursive_dependent_targets = kz_pod_target.repair_import
|
150
|
+
if kz_recursive_dependent_targets.count > 0
|
151
|
+
all_repair_hmap_info = {}
|
152
|
+
kz_recursive_dependent_targets.each { |recursive_dependent_target|
|
153
|
+
repair_hmap_info = get_hmap_info_from(recursive_dependent_target, HmapContentStyle::QUOTES_REPAIR)
|
154
|
+
all_repair_hmap_info.merge!(repair_hmap_info)
|
155
|
+
}
|
156
|
+
if all_repair_hmap_info.count > 0
|
157
|
+
hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
|
158
|
+
save_hmap_file(all_repair_hmap_info, hmap_cache_path, target_name + '_repair')
|
159
|
+
kz_pod_target.repair_header_search_path = hmap_cache_path + "#{target_name}_repair.hmap"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
all_native_targets = get_all_native_target_from(@pod_project)
|
165
|
+
all_native_targets.each do |target_name, target|
|
166
|
+
kz_pod_target = all_kz_pod_targets[target_name]
|
167
|
+
next unless kz_pod_target
|
168
|
+
|
169
|
+
# 添加私有头文件引用
|
170
|
+
private_hamp_info = get_hmap_info_from(kz_pod_target, HmapContentStyle::QUOTES_PRIVATE)
|
171
|
+
if private_hamp_info.count > 0
|
172
|
+
hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
|
173
|
+
save_hmap_file(private_hamp_info, kz_pod_target.pod_config_cache_path(false), target_name)
|
174
|
+
kz_pod_target.private_header_search_path = hmap_cache_path + "#{target_name}.hmap"
|
175
|
+
end
|
176
|
+
|
177
|
+
# 修复缺失的依赖
|
178
|
+
framework_search_paths = '$(inherited)'
|
179
|
+
kz_pod_target.all_repair_dependent_target_info.values.each do |repair_target|
|
180
|
+
result = KZGlobalHelper.instance.pod_config_result_with_target(repair_target)
|
181
|
+
if result
|
182
|
+
framework_search_paths += (' ' + "#{result.resource_path.to_s}")
|
183
|
+
else
|
184
|
+
# 修复target依赖
|
185
|
+
dependency_target = all_native_targets[repair_target.name]
|
186
|
+
target.add_dependency(dependency_target) if dependency_target
|
187
|
+
# 修复framework_search_paths
|
188
|
+
framework_search_paths += (' ' + '"${PODS_CONFIGURATION_BUILD_DIR}/' + repair_target.name + '"')
|
189
|
+
end
|
190
|
+
end
|
191
|
+
kz_pod_target.framwork_search_paths = framework_search_paths
|
192
|
+
end
|
193
|
+
|
194
|
+
all_native_targets.each do |target_name, target|
|
195
|
+
kz_pod_target = all_kz_pod_targets[target_name]
|
196
|
+
next unless kz_pod_target
|
197
|
+
|
198
|
+
# 添加配置
|
199
|
+
target.build_configurations.each do |config|
|
200
|
+
config.build_settings['HEADER_SEARCH_PATHS'] = kz_pod_target.header_search_paths
|
201
|
+
config.build_settings['USE_HEADERMAP'] = 'NO'
|
202
|
+
config.build_settings['FRAMEWORK_SEARCH_PATHS'] = kz_pod_target.framwork_search_paths
|
203
|
+
config.build_settings['KZ_FRAMEWORK_CACHE_PATH'] = kz_pod_target.pod_config_cache_path(true).to_s
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def config_project
|
209
|
+
create_main_hamp
|
210
|
+
create_pod_hamp(KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets)
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'cocoapods'
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'kz_analyzer'
|
4
|
+
require_relative 'kz_framework_manager'
|
5
|
+
require_relative 'kz_config_result'
|
6
|
+
require_relative 'kz_pod_target'
|
7
|
+
|
8
|
+
module KZ
|
9
|
+
KZ_POD_CONFIG_ROOT = Pod::Config.instance.sandbox_root + 'KZPodConfigure'
|
10
|
+
|
11
|
+
HMAP_EXECUTE_PATH = File.dirname(__FILE__) + '/../resources/hmap'
|
12
|
+
FLEX_COMPLIER_PATH = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
|
13
|
+
|
14
|
+
class KZGlobalHelper
|
15
|
+
attr_accessor :kz_pod_enable
|
16
|
+
attr_accessor :kz_pod_config
|
17
|
+
attr_accessor :kz_analyzer
|
18
|
+
attr_accessor :specify_pod_names
|
19
|
+
attr_accessor :specify_pod_mode
|
20
|
+
attr_accessor :debug
|
21
|
+
|
22
|
+
private_class_method :new
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@kz_pod_enable = false
|
26
|
+
@specify_pod_mode = :kz_pod_origin_mode
|
27
|
+
@pods_config_cache = {}
|
28
|
+
@debug = false
|
29
|
+
|
30
|
+
FileUtils.mkdir_p(KZ_POD_CONFIG_ROOT)
|
31
|
+
FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/FlexCompiler', KZ_POD_CONFIG_ROOT)
|
32
|
+
end
|
33
|
+
|
34
|
+
@@instance = nil
|
35
|
+
def self.instance
|
36
|
+
@@instance ||= new
|
37
|
+
end
|
38
|
+
|
39
|
+
def analyze_special_parameters(use_code_tag, use_framework_tag, pod_names)
|
40
|
+
specify_pod_names = []
|
41
|
+
if pod_names.count > 0
|
42
|
+
pod_names.each do |param|
|
43
|
+
if param.include?(',')
|
44
|
+
specify_pod_names.concat(param.split(","))
|
45
|
+
else
|
46
|
+
specify_pod_names << param
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
@specify_pod_names = specify_pod_names
|
51
|
+
if use_code_tag
|
52
|
+
@specify_pod_mode = :kz_pod_code_mode
|
53
|
+
elsif use_framework_tag
|
54
|
+
@specify_pod_mode = :kz_pod_framework_mode
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def pod_config_result_with_target(kz_pod_target)
|
59
|
+
return nil unless @kz_pod_enable && @kz_analyzer != nil
|
60
|
+
return nil unless kz_pod_target && kz_pod_target.config_pod_mode == :kz_pod_framework_mode
|
61
|
+
|
62
|
+
return @pods_config_cache[kz_pod_target.name] if @pods_config_cache.has_key?(kz_pod_target.name)
|
63
|
+
|
64
|
+
result = KZFrameworkManager.validate_framework_and_get_result(kz_pod_target)
|
65
|
+
|
66
|
+
@pods_config_cache[kz_pod_target.name] = result if result
|
67
|
+
result
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require_relative 'kz_pod_target'
|
2
|
+
|
3
|
+
module KZ
|
4
|
+
class KZAnalyzer
|
5
|
+
attr_accessor :all_kz_pod_targets
|
6
|
+
|
7
|
+
def initialize(native_pod_targets, development_pods)
|
8
|
+
@native_pod_targets = native_pod_targets
|
9
|
+
@development_pods = development_pods.keys
|
10
|
+
@all_kz_pod_targets = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def analyer
|
14
|
+
@native_pod_targets.each { |native_pod_target|
|
15
|
+
create_kz_pod_target_from(native_pod_target, :kz_pod_origin_mode)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_kz_pod_target_from(native_pod_target, config_pod_mode)
|
20
|
+
native_pod_target_name = native_pod_target.name
|
21
|
+
if @all_kz_pod_targets.has_key?(native_pod_target_name)
|
22
|
+
kz_pod_target = @all_kz_pod_targets[native_pod_target_name]
|
23
|
+
kz_pod_target.config_pod_mode = config_pod_mode unless kz_pod_target.is_dev_pod
|
24
|
+
else
|
25
|
+
kz_pod_target = KZPodTarget.new(native_pod_target)
|
26
|
+
is_dev_pod = @development_pods.include?(native_pod_target_name)
|
27
|
+
kz_pod_target.is_dev_pod = is_dev_pod
|
28
|
+
kz_pod_target.force_config_pod_mode = get_real_config_pod_mode(kz_pod_target)
|
29
|
+
if config_pod_mode != :kz_pod_origin_mode && !is_dev_pod
|
30
|
+
kz_pod_target.config_pod_mode = config_pod_mode
|
31
|
+
else
|
32
|
+
kz_pod_target.config_pod_mode = get_use_config_pod_mode(kz_pod_target)
|
33
|
+
end
|
34
|
+
@all_kz_pod_targets[native_pod_target_name] = kz_pod_target
|
35
|
+
|
36
|
+
kz_dependent_target_info = {}
|
37
|
+
native_pod_target.dependent_targets.each do |native_dependent_target|
|
38
|
+
kz_dependent_pod_target = create_kz_pod_target_from(native_dependent_target, kz_pod_target.config_pod_mode)
|
39
|
+
kz_dependent_target_info[native_dependent_target.name] = kz_dependent_pod_target if kz_dependent_pod_target
|
40
|
+
end
|
41
|
+
kz_pod_target.dependent_target_info = kz_dependent_target_info
|
42
|
+
kz_pod_target.add_kz_pod_config(KZGlobalHelper.instance.kz_pod_config[native_pod_target_name]) do |repair_dependent_pod_target_name|
|
43
|
+
repair_native_pod_target = get_native_pod_target_with(repair_dependent_pod_target_name)
|
44
|
+
repair_kz_pod_target = nil
|
45
|
+
if repair_native_pod_target
|
46
|
+
repair_kz_pod_target = create_kz_pod_target_from(repair_native_pod_target, kz_pod_target.config_pod_mode)
|
47
|
+
end
|
48
|
+
repair_kz_pod_target
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
kz_pod_target
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_native_pod_target_with(pod_target_name)
|
56
|
+
@native_pod_targets.each do |native_pod_target|
|
57
|
+
return native_pod_target if native_pod_target.name == pod_target_name
|
58
|
+
end
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def kz_pod_targets_with(pod_name)
|
63
|
+
kz_pod_targets = []
|
64
|
+
@all_kz_pod_targets.values.each do |target|
|
65
|
+
kz_pod_targets << target if target.root_name == pod_name
|
66
|
+
end
|
67
|
+
kz_pod_targets
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_real_config_pod_mode(kz_pod_target)
|
71
|
+
if KZGlobalHelper.instance.specify_pod_names.include?(kz_pod_target.name)
|
72
|
+
return KZGlobalHelper.instance.specify_pod_mode
|
73
|
+
end
|
74
|
+
:kz_pod_origin_mode
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_use_config_pod_mode(kz_pod_target)
|
78
|
+
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
|
80
|
+
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
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'kz_pod_target'
|
2
|
+
|
3
|
+
module KZ
|
4
|
+
class KZConfigResult
|
5
|
+
attr_accessor :name
|
6
|
+
attr_accessor :kz_pod_target
|
7
|
+
attr_accessor :resource_path
|
8
|
+
|
9
|
+
def initialize(kz_pod_target)
|
10
|
+
@name = kz_pod_target.name
|
11
|
+
@kz_pod_target = kz_pod_target
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_bundle_paths
|
15
|
+
bundle_paths = []
|
16
|
+
Dir.foreach(@resource_path) do |bundle_name|
|
17
|
+
next if bundle_name == '.' || bundle_name == '..'
|
18
|
+
|
19
|
+
bundle_path = @resource_path + bundle_name
|
20
|
+
if File.directory?(bundle_path) && bundle_name.end_with?(".bundle")
|
21
|
+
bundle_paths << bundle_path
|
22
|
+
end
|
23
|
+
end
|
24
|
+
bundle_paths
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_framework_paths
|
28
|
+
framework_paths = []
|
29
|
+
Dir.foreach(@resource_path) do |framework_name|
|
30
|
+
next if framework_name == '.' || framework_name == '..'
|
31
|
+
|
32
|
+
framework_path = @resource_path + framework_name
|
33
|
+
if File.directory?(framework_path) && framework_name.end_with?(".framework")
|
34
|
+
framework_paths << framework_path
|
35
|
+
end
|
36
|
+
end
|
37
|
+
framework_paths
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative 'kz_pod_target'
|
2
|
+
require_relative 'global_helper'
|
3
|
+
require_relative 'kz_config_result'
|
4
|
+
|
5
|
+
module KZ
|
6
|
+
class KZFrameworkManager
|
7
|
+
@@all_resources_cache_info = {}
|
8
|
+
|
9
|
+
def self.validate_framework_and_get_result(kz_pod_target)
|
10
|
+
resources_cache_info = self.resources_cache_info
|
11
|
+
resource_path = resources_cache_info["#{kz_pod_target.name}_#{kz_pod_target.version}"]
|
12
|
+
return nil unless resource_path
|
13
|
+
|
14
|
+
result = KZConfigResult.new(kz_pod_target)
|
15
|
+
result.resource_path = resource_path
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.resources_cache_info
|
20
|
+
if @@all_resources_cache_info.count > 0
|
21
|
+
return @@all_resources_cache_info
|
22
|
+
end
|
23
|
+
|
24
|
+
Dir.foreach(KZ_POD_CONFIG_ROOT) do |folder_name|
|
25
|
+
next if folder_name == '.' || folder_name == '..'
|
26
|
+
|
27
|
+
config_folder = KZ_POD_CONFIG_ROOT + folder_name
|
28
|
+
if File.directory?(config_folder)
|
29
|
+
Dir.foreach(config_folder) do |version|
|
30
|
+
next if version == '.' || version == '..'
|
31
|
+
|
32
|
+
version_folder = config_folder + version
|
33
|
+
if File.directory?(version_folder)
|
34
|
+
have_framework = false
|
35
|
+
Dir.foreach(version_folder) do |file_name|
|
36
|
+
next if file_name == '.' || file_name == '..'
|
37
|
+
|
38
|
+
if file_name.end_with?(".framework") && File.directory?(version_folder + file_name)
|
39
|
+
have_framework = true
|
40
|
+
break
|
41
|
+
end
|
42
|
+
end
|
43
|
+
@@all_resources_cache_info["#{folder_name}_#{version}"] = version_folder if have_framework
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
@@all_resources_cache_info
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'cocoapods'
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'global_helper'
|
4
|
+
|
5
|
+
module KZ
|
6
|
+
class KZPodTarget
|
7
|
+
|
8
|
+
attr_reader :native_pod_target
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :root_name
|
11
|
+
attr_reader :product_name
|
12
|
+
attr_reader :version
|
13
|
+
attr_accessor :dependent_target_info
|
14
|
+
attr_accessor :repair_dependent_target_info
|
15
|
+
attr_reader :repair_import
|
16
|
+
attr_accessor :is_dev_pod
|
17
|
+
attr_accessor :config_pod_mode
|
18
|
+
attr_accessor :force_config_pod_mode
|
19
|
+
|
20
|
+
attr_accessor :private_header_search_path
|
21
|
+
attr_accessor :repair_header_search_path
|
22
|
+
attr_accessor :framwork_search_paths
|
23
|
+
|
24
|
+
def initialize(native_pod_target)
|
25
|
+
@native_pod_target = native_pod_target
|
26
|
+
@name = native_pod_target.name
|
27
|
+
@root_name = native_pod_target.root_spec.name
|
28
|
+
@product_name = native_pod_target.product_name
|
29
|
+
@version = native_pod_target.version
|
30
|
+
@dependent_target_info = {}
|
31
|
+
@repair_dependent_target_info = {}
|
32
|
+
@repair_import = []
|
33
|
+
@isDevPod = false
|
34
|
+
@config_pod_mode = :kz_pod_origin_mode
|
35
|
+
|
36
|
+
native_pod_target.file_accessors.each do |file_accessor|
|
37
|
+
file_accessor.kz_pod_target = self
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def uses_swift
|
42
|
+
native_pod_target.uses_swift?
|
43
|
+
end
|
44
|
+
|
45
|
+
def all_headers
|
46
|
+
return @_all_headers if @_all_headers != nil
|
47
|
+
|
48
|
+
all_headers = []
|
49
|
+
native_pod_target.file_accessors.each do |file_accessor|
|
50
|
+
all_headers.concat(file_accessor.headers)
|
51
|
+
end
|
52
|
+
|
53
|
+
@_all_headers = all_headers
|
54
|
+
@_all_headers
|
55
|
+
end
|
56
|
+
|
57
|
+
def public_headers
|
58
|
+
return @_public_headers if @_public_headers != nil
|
59
|
+
|
60
|
+
public_headers = []
|
61
|
+
native_pod_target.file_accessors.each do |file_accessor|
|
62
|
+
public_headers.concat(file_accessor.origin_public_headers)
|
63
|
+
public_headers.concat(file_accessor.vendored_frameworks_headers)
|
64
|
+
end
|
65
|
+
|
66
|
+
@_public_headers = public_headers
|
67
|
+
@_public_headers
|
68
|
+
end
|
69
|
+
|
70
|
+
def config_pod_mode=(value)
|
71
|
+
return if value == :kz_pod_origin_mode
|
72
|
+
|
73
|
+
if @config_pod_mode != :kz_pod_framework_mode
|
74
|
+
@config_pod_mode = value
|
75
|
+
end
|
76
|
+
|
77
|
+
@dependent_target_info.values.each do |dependent_target|
|
78
|
+
dependent_target.config_pod_mode=(value) unless dependent_target.is_dev_pod
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def config_pod_mode
|
83
|
+
return @force_config_pod_mode if @force_config_pod_mode != :kz_pod_origin_mode
|
84
|
+
|
85
|
+
@config_pod_mode
|
86
|
+
end
|
87
|
+
|
88
|
+
def add_kz_pod_config(pod_config)
|
89
|
+
return unless pod_config
|
90
|
+
|
91
|
+
repair_dependency = pod_config[:dependency]
|
92
|
+
if repair_dependency
|
93
|
+
repair_dependency.each { |repair_dependent_pod_target_name|
|
94
|
+
kz_repair_pod_target = yield(repair_dependent_pod_target_name)
|
95
|
+
if kz_repair_pod_target
|
96
|
+
@dependent_target_info[repair_dependent_pod_target_name] = kz_repair_pod_target
|
97
|
+
@repair_dependent_target_info[repair_dependent_pod_target_name] = kz_repair_pod_target
|
98
|
+
end
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
repair_import = pod_config[:repair_import]
|
103
|
+
if repair_import.is_a?(TrueClass)
|
104
|
+
@repair_import = self.recursive_dependent_targets
|
105
|
+
elsif repair_import.is_a?(Array)
|
106
|
+
repair_import.each do |repair_import_target_name|
|
107
|
+
kz_repair_pod_target = yield(repair_import_target_name)
|
108
|
+
@repair_import << kz_repair_pod_target
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def all_need_repair_import
|
114
|
+
all_need_repair_import = []
|
115
|
+
|
116
|
+
self.recursive_dependent_targets.each do |dependent_target|
|
117
|
+
all_need_repair_import << dependent_target if dependent_target.repair_import.count > 0
|
118
|
+
end
|
119
|
+
all_need_repair_import.uniq
|
120
|
+
end
|
121
|
+
|
122
|
+
def recursive_dependent_targets
|
123
|
+
recursive_dependent_targets = []
|
124
|
+
@dependent_target_info.values.each do |dependent_target|
|
125
|
+
recursive_dependent_targets << dependent_target
|
126
|
+
recursive_dependent_targets.concat(dependent_target.recursive_dependent_targets)
|
127
|
+
end
|
128
|
+
if recursive_dependent_targets.count > 0
|
129
|
+
recursive_dependent_targets.uniq
|
130
|
+
end
|
131
|
+
recursive_dependent_targets
|
132
|
+
end
|
133
|
+
|
134
|
+
def header_search_paths
|
135
|
+
header_search_paths = ''
|
136
|
+
if @private_header_search_path && File.exist?(@private_header_search_path)
|
137
|
+
header_search_paths = @private_header_search_path.to_s
|
138
|
+
end
|
139
|
+
repair_header_search_paths = self.all_repair_header_search_paths.join(' ')
|
140
|
+
if repair_header_search_paths.length > 0
|
141
|
+
header_search_paths += (' ' + repair_header_search_paths)
|
142
|
+
end
|
143
|
+
header_search_paths
|
144
|
+
end
|
145
|
+
|
146
|
+
def all_repair_dependent_target_info
|
147
|
+
all_repair_dependent_target_info = @repair_dependent_target_info
|
148
|
+
@dependent_target_info.values.each do |dependent_target|
|
149
|
+
all_repair_dependent_target_info.merge!(dependent_target.all_repair_dependent_target_info)
|
150
|
+
end
|
151
|
+
all_repair_dependent_target_info
|
152
|
+
end
|
153
|
+
|
154
|
+
def all_repair_header_search_paths
|
155
|
+
all_repair_header_search_paths = []
|
156
|
+
if @repair_header_search_path && File.exist?(@repair_header_search_path)
|
157
|
+
all_repair_header_search_paths << @repair_header_search_path.to_s
|
158
|
+
end
|
159
|
+
self.all_need_repair_import.each do |need_repair_target|
|
160
|
+
sub_repair_header_search_path = need_repair_target.repair_header_search_path
|
161
|
+
all_repair_header_search_paths << sub_repair_header_search_path if sub_repair_header_search_path
|
162
|
+
end
|
163
|
+
all_repair_header_search_paths.uniq
|
164
|
+
end
|
165
|
+
|
166
|
+
def pod_config_cache_path(concat_version)
|
167
|
+
kz_target_framework_folder = KZ_POD_CONFIG_ROOT + @name
|
168
|
+
kz_target_framework_folder += @version if concat_version
|
169
|
+
FileUtils.mkdir_p(kz_target_framework_folder) unless File.exist?(kz_target_framework_folder)
|
170
|
+
Pathname(kz_target_framework_folder)
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module KZ
|
5
|
+
class StripFrameworkConfig
|
6
|
+
def initialize(main_project, pod_project)
|
7
|
+
@main_project = main_project
|
8
|
+
@pod_project = pod_project
|
9
|
+
end
|
10
|
+
|
11
|
+
def pod_target_support_files_path
|
12
|
+
@pod_project.project_dir + 'Target Support Files'
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_project
|
16
|
+
@main_project.targets.each do |target|
|
17
|
+
if target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.application"
|
18
|
+
target_support_file_path = pod_target_support_files_path + "Pods-#{target.name}" + "Pods-#{target.name}-frameworks.sh"
|
19
|
+
if target_support_file_path.exist?
|
20
|
+
temp_sh_file_path = @main_project.project_dir + "Pods-#{target.name}" + 'temp.sh'
|
21
|
+
temp_sh_file = Tempfile.new(temp_sh_file_path.to_s)
|
22
|
+
chmod_cmd = "chmod +x #{temp_sh_file.path}"
|
23
|
+
system chmod_cmd
|
24
|
+
|
25
|
+
sh_file = File.open(target_support_file_path, "r+")
|
26
|
+
sh_file.each_line { |line|
|
27
|
+
temp_sh_file.puts(line)
|
28
|
+
if line.start_with?(" # Resign the code if required by the build settings to avoid unstable apps")
|
29
|
+
temp_sh_file.puts(' xcrun strip -x "${destination}/${basename}.framework/${basename}" 2> /dev/null')
|
30
|
+
end
|
31
|
+
}
|
32
|
+
temp_sh_file.close
|
33
|
+
FileUtils.mv(temp_sh_file.path, target_support_file_path)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'global_helper'
|
2
|
+
|
3
|
+
module KZ
|
4
|
+
class XmlBuildConfig
|
5
|
+
def initialize(main_project, pod_project)
|
6
|
+
@pod_project = pod_project
|
7
|
+
end
|
8
|
+
|
9
|
+
def new_build_rule(project, target, name)
|
10
|
+
new_rule = nil
|
11
|
+
target.build_rules.each do |build_rule|
|
12
|
+
new_rule = build_rule if build_rule.name == name
|
13
|
+
end
|
14
|
+
|
15
|
+
if new_rule == nil
|
16
|
+
new_rule = project.new(Xcodeproj::Project::PBXBuildRule)
|
17
|
+
target.build_rules << new_rule
|
18
|
+
end
|
19
|
+
|
20
|
+
new_rule.name = name
|
21
|
+
new_rule.compiler_spec = 'com.apple.compilers.proxy.script'
|
22
|
+
new_rule
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_xml_rule(project, target)
|
26
|
+
xml_rule = new_build_rule(project, target, '[KZ] Custom Xml Build')
|
27
|
+
xml_rule.file_type = 'text.xml'
|
28
|
+
xml_rule.output_files = Array['${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex']
|
29
|
+
xml_rule.script = %Q{FLEX_PATH=${KZ_XML_FLEX_DIR}/${INPUT_FILE_BASE}.flex
|
30
|
+
rm -rf ${FLEX_PATH}
|
31
|
+
$KZ_XML_FLEX_COMPILER $INPUT_FILE_PATH $FLEX_PATH
|
32
|
+
if [ -f $FLEX_PATH ] ; then
|
33
|
+
cp $FLEX_PATH $KZ_XML_FLEX_BUILD_DIR
|
34
|
+
exit 0
|
35
|
+
else
|
36
|
+
exit 1
|
37
|
+
fi}
|
38
|
+
end
|
39
|
+
|
40
|
+
def config_project
|
41
|
+
@pod_project.targets.each do |target|
|
42
|
+
if target.isa == "PBXNativeTarget" && target.product_type == "com.apple.product-type.framework" && target.name.start_with?("SP")
|
43
|
+
target.build_configurations.each do |config|
|
44
|
+
config.build_settings["KZ_XML_FLEX_COMPILER"] = FLEX_COMPLIER_PATH.to_s
|
45
|
+
config.build_settings["KZ_XML_FLEX_DIR"] = "${TARGET_TEMP_DIR}/XmlFlexs"
|
46
|
+
config.build_settings["KZ_XML_FLEX_BUILD_DIR"] = "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.bundle"
|
47
|
+
end
|
48
|
+
self.create_xml_rule(@pod_project, target)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'cocoapods-kz/native/acknowledgements'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
module Generator
|
5
|
+
class Acknowledgements
|
6
|
+
def license_text(spec)
|
7
|
+
return nil unless spec.license
|
8
|
+
text = spec.license[:text]
|
9
|
+
unless text
|
10
|
+
if license_file = spec.license[:file]
|
11
|
+
license_path = file_accessor(spec).root + license_file
|
12
|
+
if File.exist?(license_path)
|
13
|
+
text = IO.read(license_path)
|
14
|
+
else
|
15
|
+
# UI.warn "Unable to read the license file `#{license_file}` " \
|
16
|
+
# "for the spec `#{spec}`"
|
17
|
+
end
|
18
|
+
elsif license_file = file_accessor(spec).license
|
19
|
+
text = IO.read(license_file)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
text
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'cocoapods-kz/helpers/global_helper'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Installer
|
5
|
+
class Analyzer
|
6
|
+
alias_method :original_generate_targets, :generate_targets
|
7
|
+
|
8
|
+
def generate_targets(resolver_specs_by_target, target_inspections)
|
9
|
+
aggregate_targets, pod_targets = original_generate_targets(resolver_specs_by_target, target_inspections)
|
10
|
+
|
11
|
+
kz_analyer = KZ::KZAnalyzer.new(pod_targets, self.sandbox.development_pods)
|
12
|
+
kz_analyer.analyer
|
13
|
+
KZ::KZGlobalHelper.instance.kz_analyzer = kz_analyer
|
14
|
+
|
15
|
+
[aggregate_targets, pod_targets]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'cocoapods-kz/helpers/global_helper'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Podfile
|
5
|
+
module DSL
|
6
|
+
KZ::KZGlobalHelper.instance.kz_pod_config ||= {}
|
7
|
+
|
8
|
+
def kz_pod(name = nil, *requirements)
|
9
|
+
unless name
|
10
|
+
raise StandardError, 'kz_pod requires a name.'
|
11
|
+
end
|
12
|
+
|
13
|
+
kz_pod_config = {}
|
14
|
+
kz_pod_config[name] ||= {}
|
15
|
+
|
16
|
+
pod_attach = requirements.last
|
17
|
+
return false unless pod_attach.is_a?(Hash)
|
18
|
+
|
19
|
+
dependency = pod_attach.delete(:dependency)
|
20
|
+
if !dependency.nil? && dependency.is_a?(Array)
|
21
|
+
kz_pod_config[name][:dependency] = dependency
|
22
|
+
end
|
23
|
+
|
24
|
+
repair_import = pod_attach.delete(:repair_import)
|
25
|
+
if repair_import
|
26
|
+
kz_pod_config[name][:repair_import] = repair_import
|
27
|
+
end
|
28
|
+
|
29
|
+
KZ::KZGlobalHelper.instance.kz_pod_config.merge!(kz_pod_config)
|
30
|
+
end
|
31
|
+
|
32
|
+
def pod(name = nil, *requirements)
|
33
|
+
unless name
|
34
|
+
raise StandardError, 'A dependency requires a name.'
|
35
|
+
end
|
36
|
+
|
37
|
+
current_target_definition.store_pod(name, *requirements)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'cocoapods/sandbox/file_accessor'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class Sandbox
|
5
|
+
class FileAccessor
|
6
|
+
|
7
|
+
attr_accessor :kz_pod_target
|
8
|
+
|
9
|
+
alias_method :origin_public_headers, :public_headers
|
10
|
+
def public_headers(include_frameworks = false)
|
11
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
12
|
+
[]
|
13
|
+
else
|
14
|
+
origin_public_headers(include_frameworks)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def project_headers
|
19
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
20
|
+
[]
|
21
|
+
else
|
22
|
+
project_header_files
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def private_headers
|
27
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
28
|
+
[]
|
29
|
+
else
|
30
|
+
private_header_files
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :origin_source_files, :source_files
|
35
|
+
def source_files
|
36
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
37
|
+
[]
|
38
|
+
else
|
39
|
+
origin_source_files
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
alias_method :origin_arc_source_files, :arc_source_files
|
44
|
+
def arc_source_files
|
45
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
46
|
+
[]
|
47
|
+
else
|
48
|
+
origin_arc_source_files
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
alias_method :origin_resource_bundles, :resource_bundles
|
53
|
+
def resource_bundles
|
54
|
+
if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
55
|
+
{}
|
56
|
+
else
|
57
|
+
origin_resource_bundles
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
alias_method :origin_resources, :resources
|
62
|
+
def resources
|
63
|
+
result = KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
64
|
+
if result
|
65
|
+
resources = origin_resources
|
66
|
+
resources.concat(result.get_bundle_paths)
|
67
|
+
resources
|
68
|
+
else
|
69
|
+
origin_resources
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
alias_method :origin_vendored_frameworks, :vendored_frameworks
|
74
|
+
def vendored_frameworks
|
75
|
+
result = KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
|
76
|
+
if result
|
77
|
+
frameworks = origin_vendored_frameworks
|
78
|
+
frameworks.concat(result.get_framework_paths)
|
79
|
+
frameworks
|
80
|
+
else
|
81
|
+
origin_vendored_frameworks
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'cocoapods/installer'
|
2
|
+
require 'cocoapods-kz/helpers/xml_build_config'
|
3
|
+
require 'cocoapods-kz/helpers/strip_framework_config'
|
4
|
+
require 'cocoapods-kz/helpers/build_framework_config'
|
5
|
+
require 'cocoapods-kz/helpers/create_hamp'
|
6
|
+
|
7
|
+
module Pod
|
8
|
+
class Installer
|
9
|
+
alias_method :original_integrate_user_project, :integrate_user_project
|
10
|
+
def integrate_user_project
|
11
|
+
original_integrate_user_project
|
12
|
+
|
13
|
+
main_project = self.aggregate_targets.first.user_project
|
14
|
+
pods_project = self.pods_project
|
15
|
+
|
16
|
+
puts 'Config Xml Build Rules'
|
17
|
+
KZ::XmlBuildConfig.new(main_project, pods_project).config_project
|
18
|
+
|
19
|
+
puts 'Config Framework Strip'
|
20
|
+
KZ::StripFrameworkConfig.new(main_project, pods_project).config_project
|
21
|
+
|
22
|
+
puts 'Config Framework Build'
|
23
|
+
KZ::BuildFrameworkConfig.new(main_project, pods_project).config_project
|
24
|
+
|
25
|
+
puts 'Config Hmap'
|
26
|
+
KZ::CreateHmap.new(main_project, pods_project).config_project
|
27
|
+
|
28
|
+
main_project.save
|
29
|
+
pods_project.save
|
30
|
+
puts 'Config Done'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'cocoapods/installer/user_project_integrator'
|
2
|
+
require 'cocoapods-kz/helpers/global_helper'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Installer
|
6
|
+
class UserProjectIntegrator
|
7
|
+
|
8
|
+
alias_method :origin_print_override_warning, :print_override_warning
|
9
|
+
def print_override_warning(aggregate_target, user_target, config, key)
|
10
|
+
unless KZ::KZGlobalHelper.instance.kz_pod_enable
|
11
|
+
origin_print_override_warning(aggregate_target, user_target, config, key)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'cocoapods'
|
2
|
+
require_relative 'gem_version'
|
3
|
+
|
4
|
+
if Pod.match_version?('~> 1.4')
|
5
|
+
require 'cocoapods-kz/native/dls'
|
6
|
+
require 'cocoapods-kz/native/installer'
|
7
|
+
require 'cocoapods-kz/native/acknowledgements'
|
8
|
+
require 'cocoapods-kz/native/analyzer'
|
9
|
+
require 'cocoapods-kz/native/file_accessor'
|
10
|
+
require 'cocoapods-kz/native/user_project_integrator'
|
11
|
+
end
|
Binary file
|
Binary file
|
data/lib/cocoapods-kz.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-kz/gem_version'
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cocoapods-kz
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- yixiong
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-11-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A short description of cocoapods-kz.
|
42
|
+
email:
|
43
|
+
- yixiong@kanzhun.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/cocoapods-kz.rb
|
49
|
+
- lib/cocoapods-kz/command.rb
|
50
|
+
- lib/cocoapods-kz/command/install.rb
|
51
|
+
- lib/cocoapods-kz/command/kz.rb
|
52
|
+
- lib/cocoapods-kz/command/update.rb
|
53
|
+
- lib/cocoapods-kz/gem_version.rb
|
54
|
+
- lib/cocoapods-kz/helpers/build_framework_config.rb
|
55
|
+
- lib/cocoapods-kz/helpers/create_hamp.rb
|
56
|
+
- lib/cocoapods-kz/helpers/global_helper.rb
|
57
|
+
- lib/cocoapods-kz/helpers/kz_analyzer.rb
|
58
|
+
- lib/cocoapods-kz/helpers/kz_config_result.rb
|
59
|
+
- lib/cocoapods-kz/helpers/kz_framework_manager.rb
|
60
|
+
- lib/cocoapods-kz/helpers/kz_pod_target.rb
|
61
|
+
- lib/cocoapods-kz/helpers/strip_framework_config.rb
|
62
|
+
- lib/cocoapods-kz/helpers/xml_build_config.rb
|
63
|
+
- lib/cocoapods-kz/native.rb
|
64
|
+
- lib/cocoapods-kz/native/acknowledgements.rb
|
65
|
+
- lib/cocoapods-kz/native/analyzer.rb
|
66
|
+
- lib/cocoapods-kz/native/dls.rb
|
67
|
+
- lib/cocoapods-kz/native/file_accessor.rb
|
68
|
+
- lib/cocoapods-kz/native/installer.rb
|
69
|
+
- lib/cocoapods-kz/native/user_project_integrator.rb
|
70
|
+
- lib/cocoapods-kz/resources/FlexCompiler
|
71
|
+
- lib/cocoapods-kz/resources/hmap
|
72
|
+
- lib/cocoapods_plugin.rb
|
73
|
+
homepage: https://github.com/EXAMPLE/cocoapods-kz
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubygems_version: 3.4.13
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: A longer description of cocoapods-kz.
|
96
|
+
test_files: []
|