cocoapods-kz 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|