cocoapods-jxedt 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/cocoapods-jxedt/binary/Intergation.rb +18 -13
- data/lib/cocoapods-jxedt/binary/config.rb +62 -0
- data/lib/cocoapods-jxedt/binary/helper/podfile_post_install_hook.rb +29 -0
- data/lib/cocoapods-jxedt/binary/hooks/CocoapodsJxedtHook.rb +6 -9
- data/lib/cocoapods-jxedt/binary/hooks/post_install.rb +2 -2
- data/lib/cocoapods-jxedt/binary/hooks/pre_install.rb +30 -10
- data/lib/cocoapods-jxedt/binary/main.rb +1 -0
- data/lib/cocoapods-jxedt/binary/pod-room/framework.rb +40 -0
- data/lib/cocoapods-jxedt/binary/pod-room/xcodebuild_command.rb +79 -1
- data/lib/cocoapods-jxedt/binary/pod-room/xcodebuild_raw.rb +1 -1
- data/lib/cocoapods-jxedt/binary/prebuild.rb +92 -14
- data/lib/cocoapods-jxedt/command/binary/binary.rb +36 -0
- data/lib/cocoapods-jxedt/command/binary/command/build.rb +84 -0
- data/lib/cocoapods-jxedt/command/binary/command/clean.rb +101 -0
- data/lib/cocoapods-jxedt/command/binary/command/fetch.rb +36 -0
- data/lib/cocoapods-jxedt/command/binary/command/push.rb +41 -0
- data/lib/cocoapods-jxedt/command/binary/command/statistics.rb +104 -0
- data/lib/cocoapods-jxedt/command/jxedt.rb +1 -1
- data/lib/cocoapods-jxedt/command/options/options.rb +85 -2
- data/lib/cocoapods-jxedt/gem_version.rb +1 -1
- data/lib/cocoapods-jxedt/git_helper/cache_fetcher.rb +34 -0
- data/lib/cocoapods-jxedt/git_helper/cache_pucher.rb +42 -0
- data/lib/cocoapods-jxedt/git_helper/git_command.rb +48 -0
- data/lib/cocoapods-jxedt/git_helper/zip.rb +22 -0
- metadata +14 -3
- data/lib/cocoapods-jxedt/command/statistics/statistics.rb +0 -98
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce0b5536dca75bc86d6f3abb3769eb01f71c234d0c2297797c58c08c23d0708d
|
4
|
+
data.tar.gz: 3d35dbe1026d3e87251d35dab948d1b9f7ec8d2029b72c12a3689021d476fab8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 273c9150c1d416861cb7d3e3722a440c5d3a52910cfcafbae3620f824ad7fae09834ff686b1925bfd02baccbbc0405cabd89f51a8484bbcc917771528c994cf5
|
7
|
+
data.tar.gz: 5393135f03f3443ee623fd56df1a4411c62d83f5cc2f4d8de5f67f687c9da3cfb6e6ccd45bd9e73fd38045c80fbd9e08fbed10555eafbc4586ad671be2f57be9
|
@@ -138,7 +138,7 @@ module Pod
|
|
138
138
|
specs = self.analysis_result.specifications
|
139
139
|
prebuilt_specs = (specs.select do |spec|
|
140
140
|
# rmtree
|
141
|
-
target_prebuild_files = self.sandbox.
|
141
|
+
target_prebuild_files = self.sandbox.pod_dir(spec.name) + "_Prebuild"
|
142
142
|
target_prebuild_files.rmtree if target_prebuild_files.exist?
|
143
143
|
|
144
144
|
self.prebuild_pod_names.include? spec.root.name
|
@@ -149,18 +149,6 @@ module Pod
|
|
149
149
|
checked_specs[spec.root.name] = [] if checked_specs[spec.root.name].nil?
|
150
150
|
checked_specs[spec.root.name] << spec
|
151
151
|
|
152
|
-
# Use the prebuild framworks as vendered frameworks
|
153
|
-
# get_corresponding_targets
|
154
|
-
targets = Pod.fast_get_targets_for_pod_name(spec.root.name, self.pod_targets, cache)
|
155
|
-
targets.each do |target|
|
156
|
-
# the framework_file_path rule is decided when `install_for_prebuild`,
|
157
|
-
# as to compitable with older version and be less wordy.
|
158
|
-
check_sandbox.prebuild_vendored_frameworks(spec.root.name).each do |frame_file_path|
|
159
|
-
framework_file_path = "_Prebuild/" + frame_file_path
|
160
|
-
framework_file_path = nil if checked_specs[spec.root.name].size > 1 # spec.root.name相同的只添加一次framework文件
|
161
|
-
add_vendered_framework(spec, target.platform.name.to_s, framework_file_path)
|
162
|
-
end
|
163
|
-
end
|
164
152
|
# Clean the source files
|
165
153
|
# we just add the prebuilt framework to specific platform and set no source files
|
166
154
|
# for all platform, so it doesn't support the sence that 'a pod perbuild for one
|
@@ -186,8 +174,25 @@ module Pod
|
|
186
174
|
spec.attributes_hash["resources"] += prebuild_bundles
|
187
175
|
end
|
188
176
|
|
177
|
+
# Use the prebuild framworks as vendered frameworks
|
178
|
+
# get_corresponding_targets
|
179
|
+
targets = Pod.fast_get_targets_for_pod_name(spec.root.name, self.pod_targets, cache)
|
180
|
+
targets.each do |target|
|
181
|
+
# the framework_file_path rule is decided when `install_for_prebuild`,
|
182
|
+
# as to compitable with older version and be less wordy.
|
183
|
+
check_sandbox.prebuild_vendored_frameworks(spec.root.name).each do |frame_file_path|
|
184
|
+
framework_file_path = "_Prebuild/" + frame_file_path
|
185
|
+
framework_file_path = nil if checked_specs[spec.root.name].size > 1 # spec.root.name相同的只添加一次framework文件
|
186
|
+
add_vendered_framework(spec, target.platform.name.to_s, framework_file_path)
|
187
|
+
end
|
188
|
+
|
189
|
+
# clear resource when target is a dynamic framework
|
190
|
+
spec.attributes_hash["resources"] = [] if target.build_as_dynamic_framework?
|
191
|
+
end
|
192
|
+
|
189
193
|
# to avoid the warning of missing license
|
190
194
|
spec.attributes_hash["license"] = {}
|
195
|
+
# keep all file in pods
|
191
196
|
spec.attributes_hash["preserve_paths"] = "**/*"
|
192
197
|
|
193
198
|
end
|
@@ -24,12 +24,22 @@ module Jxedt
|
|
24
24
|
:device_build_enabled => "编译真机。默认true",
|
25
25
|
:simulator_build_enabled => "编译模拟器。默认false",
|
26
26
|
:disable_dsym => "禁止编译dsym产物。默认true",
|
27
|
+
:disable_resource_compilable_pods => "禁止编译有需要编译的resource文件(xib、xcdatamodeld等)的pod",
|
27
28
|
:build_log_path => "编译的log输出路径",
|
28
29
|
:build_args => "编译的配置。了解xcodebuild命令的可以配置编译参数,例如配置 ARCHS='arm64 armv7'",
|
30
|
+
:git_cache => 'git缓存配置,A Hash. 详情查看 GIT_CACHE_CONFIG'
|
29
31
|
}.freeze
|
30
32
|
|
33
|
+
GIT_CACHE_CONFIG = {
|
34
|
+
:repo => '配置缓存仓库地址,如:{:remote => "https://github.com/user/cocoapods-cache.git", :local => "~/.cocoapods-jxedt/cocoapods-cache"},或者直接写远程仓库地址"https://github.com/user/cocoapods-cache.git"',
|
35
|
+
:branch => 'git cache的branch,默认是master分支',
|
36
|
+
:auto_fetch => 'pod install过程是否自动拉取远程的二进制,默认true',
|
37
|
+
:auto_push => 'pod install过程是否自动同步二进制结果到远程仓库,默认false',
|
38
|
+
}.freeze
|
39
|
+
|
31
40
|
def initialize()
|
32
41
|
@dsl_config = {}
|
42
|
+
@git_config = {}
|
33
43
|
end
|
34
44
|
|
35
45
|
def self.instance
|
@@ -108,6 +118,10 @@ module Jxedt
|
|
108
118
|
@dsl_config[:disable_dsym] || @dsl_config[:disable_dsym].nil?
|
109
119
|
end
|
110
120
|
|
121
|
+
def disable_resource_compilable_pods?
|
122
|
+
@dsl_config[:disable_resource_compilable_pods] || false
|
123
|
+
end
|
124
|
+
|
111
125
|
def device_build_enabled?
|
112
126
|
@dsl_config[:device_build_enabled] || @dsl_config[:device_build_enabled].nil?
|
113
127
|
end
|
@@ -140,5 +154,53 @@ module Jxedt
|
|
140
154
|
configurations
|
141
155
|
end
|
142
156
|
end
|
157
|
+
|
158
|
+
# git配置 ======================================= git配置
|
159
|
+
def git_cache_config
|
160
|
+
@git_cache ||= @dsl_config[:git_cache] || {}
|
161
|
+
end
|
162
|
+
|
163
|
+
def cache_repo
|
164
|
+
@cache_repo ||= begin
|
165
|
+
cache_repo = {}
|
166
|
+
user_config = git_cache_config[:repo]
|
167
|
+
cache_repo[:remote] = user_config if user_config.is_a?(String)
|
168
|
+
cache_repo.merge!(user_config) if user_config.is_a?(Hash)
|
169
|
+
cache_repo
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def git_remote_repo
|
174
|
+
@remote ||= cache_repo[:remote]
|
175
|
+
end
|
176
|
+
|
177
|
+
def cache_repo_enabled?
|
178
|
+
remote = git_remote_repo
|
179
|
+
remote && remote.is_a?(String) && remote =~ /.*\.git$/
|
180
|
+
end
|
181
|
+
|
182
|
+
def git_cache_path
|
183
|
+
return nil unless cache_repo_enabled?
|
184
|
+
|
185
|
+
local = cache_repo[:local]
|
186
|
+
return File.expand_path(local) if local && local.is_a?(String) && local.split('/').size > 1
|
187
|
+
|
188
|
+
remote = git_remote_repo
|
189
|
+
repo_name = Pathname.new(remote).basename.sub_ext('').to_s
|
190
|
+
File.expand_path("~/.cocoapods-jxedt/#{repo_name}")
|
191
|
+
end
|
192
|
+
|
193
|
+
def auto_fetch?
|
194
|
+
git_cache_config[:auto_fetch] || git_cache_config[:auto_fetch].nil?
|
195
|
+
end
|
196
|
+
|
197
|
+
def auto_push?
|
198
|
+
git_cache_config[:auto_push]
|
199
|
+
end
|
200
|
+
|
201
|
+
def cache_branch
|
202
|
+
git_cache_config[:branch] || 'master'
|
203
|
+
end
|
204
|
+
# git配置 ======================================= git配置
|
143
205
|
end
|
144
206
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pod
|
2
|
+
class Podfile
|
3
|
+
if Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
|
4
|
+
# Calls the post install callback if defined.
|
5
|
+
#
|
6
|
+
# @param [Pod::Installer] installer
|
7
|
+
# the installer that is performing the installation.
|
8
|
+
#
|
9
|
+
# @return [Bool] whether a post install callback was specified and it was
|
10
|
+
# called.
|
11
|
+
#
|
12
|
+
# This allows the user to customize, for instance, the generated Xcode project _before_ it’s written to disk.
|
13
|
+
alias_method :old_post_install!, :post_install!
|
14
|
+
def post_install!(installer)
|
15
|
+
executed = old_post_install!(installer)
|
16
|
+
handle_pods_project_configurations!(installer) unless executed
|
17
|
+
executed
|
18
|
+
end
|
19
|
+
|
20
|
+
def handle_pods_project_configurations!(installer)
|
21
|
+
installer.pods_project.targets.each do |target|
|
22
|
+
target.build_configurations.each do |config|
|
23
|
+
config.build_settings["CODE_SIGN_IDENTITY"] = "" if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -6,20 +6,17 @@ module CocoapodsJxedtHook
|
|
6
6
|
Jxedt::PreInstall.new(installer_context).run
|
7
7
|
end
|
8
8
|
|
9
|
-
Pod::HooksManager.register('cocoapods-jxedt', :pre_integrate) do |context, _|
|
10
|
-
|
11
|
-
end
|
9
|
+
# Pod::HooksManager.register('cocoapods-jxedt', :pre_integrate) do |context, _|
|
10
|
+
# end
|
12
11
|
|
13
12
|
Pod::HooksManager.register('cocoapods-jxedt', :post_install) do |context, _|
|
14
13
|
require_relative 'post_install'
|
15
14
|
Jxedt::PostInstall.new(context).run
|
16
15
|
end
|
17
16
|
|
18
|
-
Pod::HooksManager.register('cocoapods-jxedt', :post_integrate) do |context, _|
|
19
|
-
|
20
|
-
end
|
17
|
+
# Pod::HooksManager.register('cocoapods-jxedt', :post_integrate) do |context, _|
|
18
|
+
# end
|
21
19
|
|
22
|
-
Pod::HooksManager.register('cocoapods-jxedt', :source_provider) do |context, _|
|
23
|
-
|
24
|
-
end
|
20
|
+
# Pod::HooksManager.register('cocoapods-jxedt', :source_provider) do |context, _|
|
21
|
+
# end
|
25
22
|
end
|
@@ -14,7 +14,7 @@ module Jxedt
|
|
14
14
|
validate_pod_checksum unless @installer_context.sandbox.is_a?(Pod::PrebuildSandbox)
|
15
15
|
end
|
16
16
|
|
17
|
-
def validate_pod_checksum
|
17
|
+
def validate_pod_checksum
|
18
18
|
original_installer = ObjectSpace.each_object(Pod::Installer).reject {|installer| installer.sandbox.is_a?(Pod::PrebuildSandbox) }.first
|
19
19
|
return if original_installer.nil?
|
20
20
|
|
@@ -28,7 +28,7 @@ module Jxedt
|
|
28
28
|
value2 = source_lockfile.spec_checksums_hash_key(name)
|
29
29
|
validation_failed << name if value1.nil? || value2.nil? || value1 != value2
|
30
30
|
}
|
31
|
-
Pod::UI.warn "Lockfile文件校验失败,请检查Pod组件: #{validation_failed}"
|
31
|
+
Pod::UI.warn "⚠️ ⚠️ ⚠️ Lockfile文件校验失败,请检查Pod组件: #{validation_failed}"
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -16,10 +16,8 @@ module Jxedt
|
|
16
16
|
# check binary switch
|
17
17
|
return unless Jxedt.config.binary_switch?
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
podfile.target_definition_list.each do |target_definition|
|
22
|
-
raise STDERR.puts "[!] Cocoapods-binary requires `use_frameworks!`".red if not target_definition.uses_frameworks?
|
19
|
+
unless Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
|
20
|
+
raise STDERR.puts "[!] cocoapods-jxedt binary plugin should use cocoapods version greater than '1.10.0'`".red
|
23
21
|
end
|
24
22
|
|
25
23
|
require_relative '../helper/prebuild_sandbox'
|
@@ -29,8 +27,8 @@ module Jxedt
|
|
29
27
|
|
30
28
|
# 获取原始的installer对象,必须先获取对象
|
31
29
|
original_installer = ObjectSpace.each_object(Pod::Installer).first
|
32
|
-
|
33
|
-
source_installer = Pod::Installer.new(
|
30
|
+
prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(@installer_context.sandbox)
|
31
|
+
source_installer = Pod::Installer.new(prebuild_sandbox, @installer_context.podfile, @installer_context.lockfile)
|
34
32
|
# 设置原始的installer携带的参数
|
35
33
|
source_installer.update = original_installer.update
|
36
34
|
source_installer.repo_update = original_installer.repo_update
|
@@ -38,18 +36,40 @@ module Jxedt
|
|
38
36
|
source_installer.install!
|
39
37
|
|
40
38
|
# 保存首次`pod install`的lockfile结果,用来验证二进制文件和后面做结果校验
|
41
|
-
@installer_context.sandbox.source_lockfile =
|
39
|
+
@installer_context.sandbox.source_lockfile = prebuild_sandbox.source_lockfile = source_installer.lockfile
|
42
40
|
|
43
41
|
require_relative '../helper/podfile_options'
|
44
42
|
require_relative '../prebuild'
|
45
43
|
|
44
|
+
# fetch cache and sync
|
45
|
+
if Jxedt.config.cache_repo_enabled? && Jxedt.config.auto_fetch?
|
46
|
+
log_section "🚗 Fetch git cache"
|
47
|
+
pods = prebuild_sandbox.source_lockfile.internal_data["SPEC CHECKSUMS"].keys
|
48
|
+
binary_hash = pods.reduce({}) do |hash, name|
|
49
|
+
checksum = prebuild_sandbox.source_lockfile.spec_checksums_hash_key(name)
|
50
|
+
hash.update(name => checksum) unless checksum.nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
require 'cocoapods-jxedt/git_helper/cache_fetcher'
|
54
|
+
binary_dir = @installer_context.sandbox.root + Jxedt.config.binary_dir
|
55
|
+
Jxedt::CacheFetcher.sync(binary_hash, binary_dir)
|
56
|
+
end
|
57
|
+
|
46
58
|
# prebuild_job
|
47
|
-
|
59
|
+
prebuild_sandbox.link_source_project!
|
48
60
|
if Jxedt.config.prebuild_job?
|
49
61
|
log_section "🚀 Prebuild frameworks"
|
50
|
-
Jxedt::Prebuild.new(source_installer).build
|
62
|
+
build_targets = Jxedt::Prebuild.new(source_installer).build
|
63
|
+
|
64
|
+
# cache push
|
65
|
+
if Jxedt.config.cache_repo_enabled? && Jxedt.config.auto_push? && build_targets && build_targets.size > 0
|
66
|
+
log_section "🚄 Push git cache"
|
67
|
+
require 'cocoapods-jxedt/git_helper/cache_pucher'
|
68
|
+
output_dir = prebuild_sandbox.root + Jxedt.config.binary_dir
|
69
|
+
Jxedt::CachePucher.push(output_dir, build_targets, false)
|
70
|
+
end
|
51
71
|
end
|
52
|
-
|
72
|
+
prebuild_sandbox.clean_source_project!
|
53
73
|
|
54
74
|
log_section "🤖 Resume pod installation"
|
55
75
|
require_relative '../targets/pod_target'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module StaticFramework
|
2
|
+
class Tree
|
3
|
+
attr_reader :headers_path
|
4
|
+
attr_reader :private_headers_path
|
5
|
+
attr_reader :module_map_path
|
6
|
+
attr_reader :root_path
|
7
|
+
attr_reader :fwk_path
|
8
|
+
|
9
|
+
def initialize(name, at_path)
|
10
|
+
@name = name
|
11
|
+
@at_path = at_path
|
12
|
+
make
|
13
|
+
end
|
14
|
+
|
15
|
+
def make
|
16
|
+
make_root
|
17
|
+
make_framework
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def make_framework
|
22
|
+
@fwk_path = @root_path + Pathname.new(@name + '.framework')
|
23
|
+
@fwk_path.rmtree if @fwk_path.exist?
|
24
|
+
@fwk_path.mkdir
|
25
|
+
|
26
|
+
@module_map_path = @fwk_path + Pathname.new('Modules')
|
27
|
+
|
28
|
+
@headers_path = @fwk_path + Pathname.new('Headers')
|
29
|
+
@headers_path.mkpath unless @headers_path.exist?
|
30
|
+
|
31
|
+
@private_headers_path = @fwk_path + Pathname.new('PrivateHeaders')
|
32
|
+
end
|
33
|
+
|
34
|
+
def make_root
|
35
|
+
@root_path = Pathname.new(@at_path)
|
36
|
+
@root_path.mkpath unless @root_path.exist?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -19,9 +19,15 @@ module Jxedt
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def run
|
22
|
-
sdks.each { |sdk|
|
22
|
+
sdks.each { |sdk|
|
23
|
+
build_for_sdk(sdk)
|
24
|
+
@options[:clean_build] = false # 如果需要编译真机和模拟器,那么第二次编译的时候不能clean
|
25
|
+
}
|
23
26
|
|
24
27
|
targets.each do |target|
|
28
|
+
# create static framework with library
|
29
|
+
create_framework_from_library(target) if target.build_as_library?
|
30
|
+
|
25
31
|
if Jxedt.config.xcframework?
|
26
32
|
create_xcframework(target)
|
27
33
|
elsif sdks.count > 1
|
@@ -83,10 +89,78 @@ module Jxedt
|
|
83
89
|
sdk: sdk,
|
84
90
|
deployment_target: targets.map { |t| t.platform.deployment_target }.max.to_s,
|
85
91
|
log_path: log_path(sdk),
|
92
|
+
clean_build: clean_build?,
|
86
93
|
args: sdk == simulator ? @build_args[:simulator] : @build_args[:device]
|
87
94
|
)
|
88
95
|
end
|
89
96
|
|
97
|
+
def create_framework_from_library(target)
|
98
|
+
require_relative 'framework'
|
99
|
+
|
100
|
+
sdks.each do |sdk|
|
101
|
+
procuct_dir = Pathname.new(target_products_dir_of(target, sdk))
|
102
|
+
# make static framework
|
103
|
+
fwk = StaticFramework::Tree.new(target.product_module_name, procuct_dir.to_s)
|
104
|
+
|
105
|
+
# copy library
|
106
|
+
lib_output = fwk.fwk_path + target.product_module_name
|
107
|
+
lib_file = procuct_dir + "lib#{target.name}.a"
|
108
|
+
`lipo -create -output #{lib_output} #{lib_file}` if lib_file.exist?
|
109
|
+
|
110
|
+
# copy public headers
|
111
|
+
headers_source = target.sandbox.headers_root + 'Public' + target.product_module_name
|
112
|
+
Dir.glob("#{headers_source}/**/*.h").each { |h| `ditto #{h} #{fwk.headers_path}/#{File.basename(h)}` }
|
113
|
+
|
114
|
+
# target support module
|
115
|
+
if target.defines_module?
|
116
|
+
# create modulemap path
|
117
|
+
fwk.module_map_path.mkpath unless fwk.module_map_path.exist?
|
118
|
+
|
119
|
+
# check and copy umbrella headers
|
120
|
+
umbrella_headers = Dir.glob("#{procuct_dir}/*-umbrella.h")
|
121
|
+
umbrella_headers.each { |h| FileUtils.cp_r(h.to_s, fwk.headers_path) }
|
122
|
+
|
123
|
+
# check and copy swift headers
|
124
|
+
swift_headers = Dir.glob("#{procuct_dir}/*/*-Swift.h")
|
125
|
+
swift_headers.each { |h| FileUtils.cp_r(h.to_s, fwk.headers_path) }
|
126
|
+
|
127
|
+
# check and copy swiftmodule files
|
128
|
+
swiftmodule_path = procuct_dir + "#{target.product_module_name}.swiftmodule"
|
129
|
+
FileUtils.cp_r(swiftmodule_path, fwk.module_map_path) if swiftmodule_path.exist?
|
130
|
+
|
131
|
+
# umbrella header name
|
132
|
+
header_name = "#{target.name}"
|
133
|
+
header_name = "#{target.name}-umbrella" if File.exist? "#{fwk.headers_path}/#{target.name}-umbrella.h"
|
134
|
+
|
135
|
+
# make modulemap
|
136
|
+
if File.exist?("#{fwk.headers_path}/#{header_name}.h")
|
137
|
+
module_map = <<MODULE_MAP
|
138
|
+
framework module #{target.product_module_name} {
|
139
|
+
umbrella header "#{header_name}.h"
|
140
|
+
|
141
|
+
export *
|
142
|
+
module * { export * }
|
143
|
+
}
|
144
|
+
MODULE_MAP
|
145
|
+
unless swift_headers.empty?
|
146
|
+
module_map << swift_module_map = <<SWIFT_MODULE_MAP
|
147
|
+
module #{target.product_module_name}.Swift {
|
148
|
+
header "#{target.product_module_name}-Swift.h"
|
149
|
+
requires objc
|
150
|
+
}
|
151
|
+
SWIFT_MODULE_MAP
|
152
|
+
end
|
153
|
+
File.write("#{fwk.module_map_path}/module.modulemap", module_map) unless module_map.nil?
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# remove library product
|
158
|
+
procuct_dir.children.each do |child|
|
159
|
+
FileUtils.rm_rf(child) if ['.h', '.modulemap', '.a', '.swiftmodule'].include?(child.extname) || "#{child.basename}" == 'Swift Compatibility Header'
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
90
164
|
def create_xcframework(target)
|
91
165
|
non_framework_paths = Dir[target_products_dir_of(target, preferred_sdk) + "/*"] \
|
92
166
|
- [framework_path_of(target, preferred_sdk)] \
|
@@ -261,5 +335,9 @@ module Jxedt
|
|
261
335
|
def log_path(sdk)
|
262
336
|
@options[:log_path].nil? ? nil : "#{@options[:log_path]}_#{sdk}"
|
263
337
|
end
|
338
|
+
|
339
|
+
def clean_build?
|
340
|
+
@options[:clean_build]
|
341
|
+
end
|
264
342
|
end
|
265
343
|
end
|
@@ -22,12 +22,19 @@ module Jxedt
|
|
22
22
|
return [] if @sandbox_path.nil?
|
23
23
|
return [] unless binary_dir.exist?
|
24
24
|
return [] if @sandbox.source_lockfile.nil?
|
25
|
-
@targets ||=
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
@targets ||= begin
|
26
|
+
prebuild_targets = binary_dir.children().map do |target_path|
|
27
|
+
if target_path.directory? && (not target_path.children.empty?)
|
28
|
+
hash_key = @sandbox.source_lockfile.spec_checksums_hash_key(target_path.basename.to_s)
|
29
|
+
next if hash_key.nil?
|
30
|
+
|
31
|
+
checksum_files = target_path.children().select { |path| path.extname == '.checksum' }
|
32
|
+
checksum_exists = (target_path + "#{hash_key}.checksum").exist?
|
33
|
+
target_path if checksum_files.count == 1 && checksum_exists
|
34
|
+
end
|
35
|
+
end.reject(&:nil?).uniq
|
36
|
+
prebuild_targets
|
37
|
+
end
|
31
38
|
@targets
|
32
39
|
end
|
33
40
|
|
@@ -80,21 +87,44 @@ module Jxedt
|
|
80
87
|
target.target_definition.reject_prebuild_pod_names
|
81
88
|
}.uniq
|
82
89
|
|
90
|
+
targets = all_supports_targets.select { |target|
|
91
|
+
next if reject_prebuild_pod_names.include?(target.pod_name)
|
92
|
+
explicit_prebuild_pod_names.include?(target.pod_name) || Jxedt.config.all_binary_enabled?
|
93
|
+
}
|
94
|
+
targets
|
95
|
+
end
|
96
|
+
|
97
|
+
def all_supports_targets
|
83
98
|
targets = @source_installer.pod_targets.select { |target|
|
99
|
+
# 排除不需要编译
|
84
100
|
next unless target.should_build?
|
101
|
+
# 排除target name和pod name不一致的(有两种情况)
|
102
|
+
# 1. 同一个pod,在两个target下使用了不同的subspec
|
103
|
+
# 2. 同一个pod,在两个不同ios版本的target种引用
|
85
104
|
next unless target.name == target.pod_name
|
86
|
-
|
87
|
-
explicit_prebuild_pod_names.include?(target.pod_name) || Jxedt.config.all_binary_enabled?
|
105
|
+
true
|
88
106
|
}
|
107
|
+
# 排除本地pod
|
89
108
|
targets.reject! { |target| @source_installer.sandbox.local?(target.pod_name) } unless Jxedt.config.dev_pods_enabled?
|
109
|
+
# 配置中排除的pods
|
90
110
|
targets.reject! { |target| Jxedt.config.excluded_pods.include?(target.pod_name) }
|
111
|
+
# target中可能存在需要编译的resource文件
|
112
|
+
Jxedt.config.disable_resource_compilable_pods? && targets.reject! { |target|
|
113
|
+
# 因为编译library静态库会把需要编译的文件拷贝到宿主工程编译,后面我们要把静态库组装成framework,所以需要过滤掉
|
114
|
+
resource_extension_compilable = false
|
115
|
+
target.resource_paths.each {|name, resources|
|
116
|
+
resources.each {|resource_file|
|
117
|
+
resource_extname = Pathname.new(resource_file).basename.extname
|
118
|
+
resource_extension_compilable = target.class.resource_extension_compilable?(resource_extname)
|
119
|
+
break if resource_extension_compilable
|
120
|
+
}
|
121
|
+
break if resource_extension_compilable
|
122
|
+
}
|
123
|
+
resource_extension_compilable
|
124
|
+
}
|
91
125
|
targets
|
92
126
|
end
|
93
127
|
|
94
|
-
def pods_to_prebuild
|
95
|
-
targets_to_prebuild.map(&:name).to_a
|
96
|
-
end
|
97
|
-
|
98
128
|
def build
|
99
129
|
check_sandbox = Jxedt::Sandbox.from_sandbox(@source_installer.sandbox)
|
100
130
|
existed_target_names = check_sandbox.target_paths.map { |pair| pair.basename.to_s }
|
@@ -102,7 +132,7 @@ module Jxedt
|
|
102
132
|
|
103
133
|
Pod::UI.puts "Prebuild total count: #{targets.size}"
|
104
134
|
Pod::UI.puts "Prebuild targets: #{ targets.map(&:name)}"
|
105
|
-
return if targets.empty?
|
135
|
+
return [] if targets.empty?
|
106
136
|
|
107
137
|
require_relative 'pod-room/xcodebuild_command'
|
108
138
|
|
@@ -135,15 +165,63 @@ module Jxedt
|
|
135
165
|
|
136
166
|
make_prebuild(targets)
|
137
167
|
clear_output_path
|
168
|
+
|
169
|
+
targets.map(&:pod_name).to_a
|
170
|
+
end
|
171
|
+
|
172
|
+
def build_targets(names: nil, binary_output: nil)
|
173
|
+
targets = all_supports_targets
|
174
|
+
targets.select! { |target| names.include?(target.pod_name) } if names && names.is_a?(Array) && names.size > 0
|
175
|
+
|
176
|
+
Pod::UI.puts "Prebuild total count: #{targets.size}"
|
177
|
+
Pod::UI.puts "Prebuild targets: #{ targets.map(&:name)}"
|
178
|
+
return [] if targets.empty?
|
179
|
+
|
180
|
+
require_relative 'pod-room/xcodebuild_command'
|
181
|
+
|
182
|
+
clear_output_path
|
183
|
+
case targets[0].platform.name
|
184
|
+
when :ios, :tvos, :watchos
|
185
|
+
Jxedt.config.support_configurations.each do |configuration|
|
186
|
+
Pod::UI.puts "Prebuild configuration: #{configuration}"
|
187
|
+
options = make_options
|
188
|
+
options[:configuration] = configuration
|
189
|
+
options[:targets] = targets
|
190
|
+
options[:output_path] = output_path + configuration
|
191
|
+
Jxedt::XcodebuildCommand.new(options).run
|
192
|
+
end
|
193
|
+
when :osx
|
194
|
+
Jxedt.config.support_configurations.each do |configuration|
|
195
|
+
Pod::UI.puts "Prebuild configuration: #{configuration}"
|
196
|
+
options = make_options
|
197
|
+
xcodebuild(
|
198
|
+
sandbox: options[:sandbox],
|
199
|
+
targets: targets,
|
200
|
+
configuration: configuration,
|
201
|
+
sdk: "macosx",
|
202
|
+
clean_build: Jxedt.config.clean_build?,
|
203
|
+
args: options[:args]
|
204
|
+
)
|
205
|
+
end
|
206
|
+
else
|
207
|
+
raise "Unsupported platform for '#{targets[0].name}': '#{targets[0].platform.name}'"
|
208
|
+
end
|
209
|
+
|
210
|
+
binary_output = Pathname.new(binary_output)
|
211
|
+
make_prebuild(targets, binary_output)
|
212
|
+
clear_output_path
|
213
|
+
|
214
|
+
targets.map(&:pod_name).to_a
|
138
215
|
end
|
139
216
|
|
140
|
-
def make_prebuild(targets)
|
217
|
+
def make_prebuild(targets, binary_output=nil)
|
141
218
|
lockfile = @source_installer.lockfile
|
142
219
|
checksums = lockfile.internal_data["SPEC CHECKSUMS"] || {}
|
143
220
|
checkout_options = lockfile.internal_data["CHECKOUT OPTIONS"] || {}
|
144
221
|
|
145
222
|
# 目标binary路径
|
146
223
|
binary_path = output_path.parent
|
224
|
+
binary_path = binary_output if binary_output && binary_output.parent.exist?
|
147
225
|
prebuild_targets = targets.map(&:name).to_a
|
148
226
|
prebuild_targets.map {|target_name|
|
149
227
|
target_path = binary_path + target_name
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'command/statistics'
|
2
|
+
require_relative 'command/build'
|
3
|
+
require_relative 'command/fetch'
|
4
|
+
require_relative 'command/push'
|
5
|
+
require_relative 'command/clean'
|
6
|
+
|
7
|
+
module Pod
|
8
|
+
class Command
|
9
|
+
class JxedtCommand < Command
|
10
|
+
class Binary < JxedtCommand
|
11
|
+
self.summary = '二进制相关操作,二进制build、fetch、clean、statistics'
|
12
|
+
self.description = <<-DESC
|
13
|
+
二进制相关操作,二进制build、fetch、push、statistics
|
14
|
+
DESC
|
15
|
+
self.command = 'binary'
|
16
|
+
self.abstract_command = true
|
17
|
+
|
18
|
+
self.arguments = [
|
19
|
+
]
|
20
|
+
def self.options
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
def initialize(argv)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate!
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|