cocoapods-xcframework 0.0.7 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5f82bd06f313889e45d18abb7d66ff2ee78516575754c09a41edc700d52aba1
4
- data.tar.gz: 8828713c3735d4af8ad194e96e80cab0e9705b527921cf542b536a1248cc9ba7
3
+ metadata.gz: ff3c1aebde9549b0113050ae273c3a3734d58861aff9cf3a7f7a599a1971e008
4
+ data.tar.gz: 439607a9462c3c4ba1c4b98401b37c18e23348ef31f0aae9fcc67344f6081bb1
5
5
  SHA512:
6
- metadata.gz: 94f8739a2e0ef78df20f5475e860b400909295dff8393ecbe12dfded326d9c38016dd50cb2c665c26afb0de8e297bbec7f9c3d74782409358d36d6c2fb8362bc
7
- data.tar.gz: 3324b859a452d8461f89666b9da4529e942cd30de79352fb09eb5b26de6335518236b4eadb7e8f072f079814b7b2eca0071e031df1dc1824b962a4333064e7fe
6
+ metadata.gz: 2d3718b1cf29d43aae97250f8eecf97bd8731127dbd22c63a896332021c7fedce56ecca046db192d756644e0fc9e602bf3e3b3ed6590deb2afd46629a5b222a1
7
+ data.tar.gz: d54fb38728e40737e76fd1ce73b6ae7c4b1497a53e7246926525a090a2dce426d75266235e4e4db0de3dfe848d3b037812119858ced9556185fc3edd77c276e6
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Example/*
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = CocoapodsFramework::VERSION
9
9
  spec.authors = ['戴易超']
10
10
  spec.email = ['daiyichao@corp.netease.com']
11
- spec.description = %q{A short description of cocoapods-xcframework.}
12
- spec.summary = %q{A longer description of cocoapods-xcframework.}
11
+ spec.description = %q{把podspec打包成xcframework的小工具。packager pod to a xcframework}
12
+ spec.summary = %q{把podspec打包成xcframework的小工具。packager pod to a xcframework}
13
13
  spec.homepage = 'https://github.com/TyrantDante/cocoapods-framework'
14
14
  spec.license = 'MIT'
15
15
 
@@ -1 +1,2 @@
1
1
  require 'cocoapods-framework/command/framework'
2
+ require 'cocoapods-framework/command/muti_framework'
@@ -31,7 +31,9 @@ module Pod
31
31
  ['--configuration', 'Build the specified configuration (e.g. Debug). Defaults to Release'],
32
32
  ['--spec-sources=private,https://github.com/CocoaPods/Specs.git', 'The sources to pull dependent pods from (defaults to https://github.com/CocoaPods/Specs.git)'],
33
33
  ['--subspecs', 'Only include the given subspecs'],
34
- ['--use-modular-headers', 'pakcage uses modular headers during packaging']
34
+ ['--use-modular-headers', 'pakcage uses modular headers during packaging'],
35
+ ['--no-static-library', 'package not use static library'],
36
+ ['--enable-bitcode', 'package enable bitcode']
35
37
  ].concat super
36
38
  end
37
39
 
@@ -44,6 +46,9 @@ module Pod
44
46
  @configuration = argv.option('configuration', 'Release')
45
47
  @use_modular_headers = argv.option('use-modular-headers', true)
46
48
  @force = argv.flag?('force', true)
49
+ @use_static_library = argv.flag?('static-library',true)
50
+ @enable_bitcode = argv.flag?('enable-bitcode',false)
51
+ config.static_library_enable = @use_static_library
47
52
  super
48
53
  end
49
54
 
@@ -53,7 +58,7 @@ module Pod
53
58
  end
54
59
 
55
60
  def run
56
- frameworker = Frameworker.new(@name, @source, @spec_sources, @subspecs, @configuration, @force, @use_modular_headers)
61
+ frameworker = Frameworker.new(@name, @source, @spec_sources, @subspecs, @configuration, @force, @use_modular_headers, @enable_bitcode)
57
62
  frameworker.run
58
63
  end
59
64
  end
@@ -0,0 +1,61 @@
1
+ module Pod
2
+ class Command
3
+ # This is an example of a cocoapods plugin adding a top-level subcommand
4
+ # to the 'pod' command.
5
+ #
6
+ # You can also create subcommands of existing or new commands. Say you
7
+ # wanted to add a subcommand to `list` to show newly deprecated pods,
8
+ # (e.g. `pod list deprecated`), there are a few things that would need
9
+ # to change.
10
+ #
11
+ # - move this file to `lib/pod/command/list/deprecated.rb` and update
12
+ # the class to exist in the the Pod::Command::List namespace
13
+ # - change this class to extend from `List` instead of `Command`. This
14
+ # tells the plugin system that it is a subcommand of `list`.
15
+ # - edit `lib/cocoapods_plugins.rb` to require this file
16
+ #
17
+ # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
18
+ # in the `plugins.json` file, once your plugin is released.
19
+ #
20
+ class MutiFramework < Command
21
+ self.summary = 'Package some podspec into a xcframework.'
22
+ self.arguments = [
23
+ CLAide::Argument.new('NAME', true),
24
+ CLAide::Argument.new('SOURCE', false)
25
+ ]
26
+ include Config::Mixin
27
+
28
+ def self.options
29
+ [
30
+ ['--no-force', 'Overwrite existing files.'],
31
+ ['--configuration', 'Build the specified configuration (e.g. Debug). Defaults to Release'],
32
+ ['--spec-sources=private,https://github.com/CocoaPods/Specs.git', 'The sources to pull dependent pods from (defaults to https://github.com/CocoaPods/Specs.git)'],
33
+ ['--use-modular-headers', 'pakcage uses modular headers during packaging'],
34
+ ['--no-static-library', 'package not use static library']
35
+ ].concat super
36
+ end
37
+
38
+ def initialize(argv)
39
+ @name = argv.shift_argument
40
+ @source = argv.shift_argument
41
+ @spec_sources = argv.option('spec-sources', 'https://github.com/CocoaPods/Specs.git').split(',')
42
+ @configuration = argv.option('configuration', 'Release')
43
+ @use_modular_headers = argv.option('use-modular-headers', true)
44
+ @force = argv.flag?('force', true)
45
+ @use_static_library = argv.flag?('static-library', true)
46
+ config.static_library_enable = @use_static_library
47
+ super
48
+ end
49
+
50
+ def validate!
51
+ super
52
+ help! 'A file written some pods need package is needed' unless @name
53
+ end
54
+
55
+ def run
56
+ frameworker = MutiFrameworker.new(@name, @source, @spec_sources, @configuration, @force, @use_modular_headers)
57
+ frameworker.run
58
+ end
59
+ end
60
+ end
61
+ end
@@ -2,5 +2,7 @@ module Pod
2
2
  class Config
3
3
  attr_accessor :xcframework_enable
4
4
  alias_method :xcframework_enable?, :xcframework_enable
5
+ attr_accessor :static_library_enable
6
+ alias_method :static_library_enable?, :static_library_enable
5
7
  end
6
8
  end
@@ -3,7 +3,7 @@ module Pod
3
3
  include PodUtil
4
4
  include DirUtil
5
5
  include Config::Mixin
6
- def initialize(name, source, spec_sources, subspecs, configuration, force, use_modular_headers)
6
+ def initialize(name, source, spec_sources, subspecs, configuration, force, use_modular_headers, enable_bitcode)
7
7
  @name = name
8
8
  @source = source
9
9
  @spec_sources = spec_sources
@@ -11,6 +11,7 @@ module Pod
11
11
  @configuration = configuration
12
12
  @force = force
13
13
  @use_modular_headers = use_modular_headers
14
+ @enable_bitcode = enable_bitcode
14
15
  end
15
16
 
16
17
  def run
@@ -36,7 +37,9 @@ module Pod
36
37
  spec,
37
38
  @subspecs,
38
39
  @spec_sources,
39
- @use_modular_headers
40
+ true,
41
+ @use_modular_headers,
42
+ @enable_bitcode
40
43
  )
41
44
 
42
45
  perform_build(
@@ -1,3 +1,3 @@
1
1
  module CocoapodsFramework
2
- VERSION = "0.0.7"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -0,0 +1,57 @@
1
+ module Pod
2
+ class MutiFrameworker
3
+ include Pod::PodUtil
4
+ include Pod::GitUtil
5
+ include Pod::DirUtil
6
+ include Config::Mixin
7
+ def initialize(name, source, spec_sources, configuration, force, use_modular_headers)
8
+ @name = name
9
+ @source = source
10
+ @spec_sources = spec_sources
11
+ @configuration = configuration
12
+ @force = force
13
+ @use_modular_headers = use_modular_headers
14
+ end
15
+
16
+ def run
17
+ configs = muti_config_with_file @name
18
+ target_dir, work_dir = create_working_directory_by_spec "xcframeworks", @force
19
+ prepare_git_with_configs configs, work_dir
20
+ build_frameworks configs, work_dir, target_dir
21
+ end
22
+
23
+ def build_frameworks configs, work_dir, target_dir
24
+ config.installation_root = Pathname.new work_dir
25
+ config.sandbox_root = "#{work_dir}/Pods"
26
+ sandbox = build_static_sandbox
27
+
28
+ sandbox_installer = installation_root_muti(
29
+ sandbox,
30
+ configs,
31
+ @spec_sources,
32
+ @use_modular_headers
33
+ )
34
+ perform_build(
35
+ sandbox,
36
+ sandbox_installer,
37
+ configs,
38
+ target_dir
39
+ )
40
+ end
41
+
42
+ def perform_build sandbox, installer, configs, target_dir
43
+ sandbox_root = config.sandbox_root.to_s
44
+ builder = Pod::XBuilder.new(
45
+ installer,
46
+ Dir.pwd,
47
+ sandbox_root,
48
+ configs,
49
+ @configuration
50
+ )
51
+ builder.build
52
+ builder.outputs_muti target_dir
53
+ end
54
+
55
+
56
+ end
57
+ end
@@ -1,3 +1,5 @@
1
1
  require 'cocoapods-framework/util/error_util'
2
+ require 'cocoapods-framework/util/cmd'
3
+ require 'cocoapods-framework/util/git_util'
2
4
  require 'cocoapods-framework/util/pod_util'
3
5
  require 'cocoapods-framework/util/dir_util'
@@ -0,0 +1,24 @@
1
+ module Pod
2
+ class Cmmd
3
+ class << self
4
+ def sh! command
5
+ UI.puts command
6
+ output = `#{command}`.lines.to_a
7
+ if $?.exitstatus != 0
8
+ Pod::ErrorUtil.error_report command,output
9
+ Process.exit -1
10
+ end
11
+ output
12
+ end
13
+
14
+ def sh? command
15
+ UI.puts command
16
+ output = `#{command}`.lines.to_a
17
+ if $?.exitstatus != 0
18
+ Pod::ErrorUtil.error_report command,output
19
+ end
20
+ output
21
+ end
22
+ end
23
+ end
24
+ end
@@ -14,6 +14,9 @@ module Pod
14
14
  end
15
15
 
16
16
  def create_working_directory_by_spec spec,force
17
+ if spec.is_a? String
18
+ return create_working_directory_by_name spec,force
19
+ end
17
20
  target_dir = create_target_directory_path_by_spec spec,force
18
21
  # Pathname.new(target_dir).mkdir
19
22
  work_dir = Dir.tmpdir + '/frameworks-' + Array.new(8) { rand(36).to_s(36) }.join
@@ -21,5 +24,27 @@ module Pod
21
24
  Pathname.new(work_dir).mkdir
22
25
  [target_dir, work_dir]
23
26
  end
27
+
28
+ def create_target_directory_path_by_name name, force
29
+ target_dir = "#{Dir.pwd}/#{name}-muti"
30
+
31
+ if File.exist? target_dir
32
+ if @force
33
+ Pathname.new(target_dir).rmtree
34
+ else
35
+ UI.warn "Target directory '#{target_dir}' already exists."
36
+ end
37
+ end
38
+ target_dir
39
+ end
40
+
41
+ def create_working_directory_by_name name, force
42
+ target_dir = create_target_directory_path_by_name name,force
43
+ # Pathname.new(target_dir).mkdir
44
+ work_dir = Dir.tmpdir + '/frameworks-' + Array.new(8) { rand(36).to_s(36) }.join
45
+
46
+ Pathname.new(work_dir).mkdir
47
+ [target_dir, work_dir]
48
+ end
24
49
  end
25
50
  end
@@ -0,0 +1,14 @@
1
+ module Pod
2
+ module GitUtil
3
+ def prepare_git_with_configs configs, work_dir
4
+ index = 0
5
+ configs.each do |config|
6
+ name = config["name"]
7
+ git_url = config["git_url"]
8
+ git_branch = config["git_branch"]
9
+ command = "git clone #{git_url} -b #{git_branch} #{work_dir}/#{name}"
10
+ Cmmd.sh! command
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,35 @@
1
1
  module Pod
2
2
  module PodUtil
3
+ include Config::Mixin
4
+
5
+ def to_native_platform name
6
+ case name
7
+ when 'iphoneos' then 'ios'
8
+ when 'macOS' then 'osx'
9
+ when 'appletvos' then 'tvos'
10
+ when 'watchos' then 'watchos'
11
+ when 'ios' then 'ios'
12
+ when 'macos' then 'osx'
13
+ when 'tvos' then 'tvos'
14
+ else
15
+ name
16
+ end
17
+ end
18
+
19
+ def muti_config_with_file(path)
20
+ return nil if path.nil?
21
+ path = Pathname.new(path)
22
+ path = Pathname.new(Dir.pwd).join(path) unless path.absolute?
23
+ @path = path.expand_path
24
+ content = File.open(path, 'rb').read
25
+ result = JSON.parse content
26
+ if not result.is_a? Array
27
+ UI.error "#{path} format not support"
28
+ exit -1
29
+ end
30
+ result
31
+ end
32
+
3
33
  def spec_with_path(path)
4
34
  return if path.nil?
5
35
  path = Pathname.new(path)
@@ -33,7 +63,7 @@ module Pod
33
63
  Sandbox.new(config.sandbox_root)
34
64
  end
35
65
 
36
- def installation_root sandbox, spec, subspecs, sources,use_frameworks = true,use_modular_headers = true
66
+ def installation_root sandbox, spec, subspecs, sources,use_frameworks = true,use_modular_headers = true, enable_bitcode = false
37
67
  podfile = podfile_from_spec(
38
68
  @path,
39
69
  spec,
@@ -44,12 +74,54 @@ module Pod
44
74
  )
45
75
 
46
76
  installer = Installer.new(sandbox, podfile)
77
+ installer.repo_update = true
78
+ installer.install!
79
+
80
+ unless installer.nil?
81
+ installer.pods_project.targets.each do |target|
82
+ target.build_configurations.each do |configuration|
83
+ if enable_bitcode && configuration.name == "Release"
84
+ configuration.build_settings['ENABLE_BITCODE'] = 'YES'
85
+ configuration.build_settings['BITCODE_GENERATION_MODE'] = 'bitcode'
86
+ end
87
+ end
88
+ if target.name == spec.name
89
+ target.build_configurations.each do |configuration|
90
+ configuration.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
91
+ end
92
+ end
93
+ end
94
+ installer.pods_project.save
95
+ end
96
+ installer
97
+ end
98
+
99
+ def installation_root_muti sandbox, configs, sources, use_frameworks = true, use_modular_headers = true, enable_bitcode = false
100
+ podfile = podfile_from_muti_configs(
101
+ configs,
102
+ sources,
103
+ use_frameworks,
104
+ use_modular_headers
105
+ )
106
+ installer = Installer.new(sandbox, podfile)
107
+ installer.repo_update = true
47
108
  installer.install!
48
109
 
110
+ specs = configs.map do |cfg|
111
+ cfg["name"]
112
+ end
49
113
  unless installer.nil?
50
114
  installer.pods_project.targets.each do |target|
51
- target.build_configurations.each do |configuration|
52
- configuration.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
115
+ target.build_configurations.each do |configuration|
116
+ if enable_bitcode && configuration.name == "Release"
117
+ configuration.build_settings['ENABLE_BITCODE'] = 'YES'
118
+ configuration.build_settings['BITCODE_GENERATION_MODE'] = 'bitcode'
119
+ end
120
+ end
121
+ if specs.include? target.name
122
+ target.build_configurations.each do |configuration|
123
+ configuration.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO'
124
+ end
53
125
  end
54
126
  end
55
127
  installer.pods_project.save
@@ -58,10 +130,17 @@ module Pod
58
130
  end
59
131
 
60
132
  def podfile_from_spec path, spec, subspecs, sources, use_frameworks = true, use_modular_headers=true
61
- options = Hash.new
133
+ options = Hash.new
62
134
  options[:podspec] = path.to_s
135
+ options[:subspecs] = spec.subspecs.map do |sub|
136
+ sub.base_name
137
+ end
63
138
  options[:subspecs] = subspecs if subspecs
64
-
139
+ # 非常奇怪,如果传一个空的数组过去就会出问题!!
140
+ if options[:subspecs].length == 0
141
+ options[:subspecs] = nil
142
+ end
143
+ static_library_enable = config.static_library_enable?
65
144
  Pod::Podfile.new do
66
145
  sources.each {|s| source s}
67
146
  spec.available_platforms.each do |plt|
@@ -71,13 +150,59 @@ module Pod
71
150
  end
72
151
  end
73
152
 
153
+ install!('cocoapods',:integrate_targets => false,:deterministic_uuids => false)
154
+ if static_library_enable
155
+ use_frameworks! :linkage => :static if use_frameworks
156
+ else
157
+ use_frameworks! if use_frameworks
158
+ end
159
+ use_modular_headers! if use_modular_headers
160
+ end
161
+ end
162
+
163
+ def podfile_from_muti_configs configs, sources, use_frameworks = true, use_modular_headers = true
164
+ installation_root = config.installation_root.to_s
165
+ static_library_enable = config.static_library_enable?
166
+ Pod::Podfile.new do
167
+ sources.each {|s| source s}
168
+ configs.each do |cfg|
169
+ pod_spec_path = installation_root + "/#{cfg["name"]}/#{cfg["name"]}.podspec"
170
+ pod_spec_json_path = pod_spec_path + ".json"
171
+ (Pathname.glob(pod_spec_path) + Pathname.glob(pod_spec_json_path)).each do |real_path|
172
+ spec = Pod::Specification.from_file real_path.to_s
173
+ options = Hash.new
174
+ options[:podspec] = real_path.to_s
175
+ if cfg["subspecs"]
176
+ options[:subspecs] = cfg["subspecs"]
177
+ else
178
+ options[:subspecs] = spec.subspecs.map do |sub|
179
+ sub.base_name
180
+ end
181
+ end
182
+ # 非常奇怪,如果传一个空的数组过去就会出问题!!
183
+ if options[:subspecs].length == 0
184
+ options[:subspecs] = nil
185
+ end
186
+ spec.available_platforms.each do |plt|
187
+ target "#{spec.name}-#{plt.name}" do
188
+ puts "#{plt.name} #{spec.name} #{options}"
189
+ platform(plt.name, spec.deployment_target(plt.name))
190
+ pod(spec.name, options)
191
+ end
192
+ end
193
+ end
194
+ end
74
195
  install!('cocoapods',
75
196
  :integrate_targets => false,
76
197
  :deterministic_uuids => false)
77
198
 
78
- use_frameworks! if use_frameworks
199
+ if static_library_enable
200
+ use_frameworks! :linkage => :static if use_frameworks
201
+ else
202
+ use_frameworks! if use_frameworks
203
+ end
79
204
  use_modular_headers! if use_modular_headers
80
- end
205
+ end
81
206
  end
82
207
 
83
208
  def generic_new_podspec_hash spec
@@ -104,5 +229,28 @@ module Pod
104
229
  end
105
230
  spec_hash
106
231
  end
232
+
233
+ def fix_header_file spec_hash, xcframework_path
234
+ puts "Dir.glob(#{xcframework_path}/*/) : #{Dir.glob("#{xcframework_path}/*/")}"
235
+ Dir.glob("#{xcframework_path}/*/").each do |file|
236
+ ['ios','macos','tvos', 'watchos'].each do |prefix|
237
+ last_path = file.split("/").last
238
+ if last_path =~ /#{prefix}/ and not last_path =~ /simulator/
239
+ platform = to_native_platform prefix
240
+ if spec_hash[platform]
241
+ spec_hash[platform]["public_header_files"] = "#{spec_hash[:vendored_frameworks]}/#{last_path}/*/Headers/*.h"
242
+ spec_hash[platform]["source_files"] = "#{spec_hash[:vendored_frameworks]}/#{last_path}/*/Headers/*.h"
243
+ else
244
+ spec_hash[platform] = {
245
+ "public_header_files" => "#{spec_hash[:vendored_frameworks]}/#{last_path}/*/Headers/*.h",
246
+ "source_files" => "#{spec_hash[:vendored_frameworks]}/#{last_path}/*/Headers/*.h"
247
+ }
248
+ end
249
+ end
250
+ end
251
+ end
252
+ puts spec_hash.to_json
253
+ spec_hash
254
+ end
107
255
  end
108
256
  end
@@ -13,15 +13,19 @@ module Pod
13
13
  @source_dir = source_dir
14
14
  @sandbox_root = sandbox_root
15
15
  @spec = spec
16
+ @muti = @spec.is_a? Array
17
+ @configs = @spec if @muti
18
+ @spec = "muti" if @muti
19
+
16
20
  @configuration = configuration
17
- @outputs = {}
21
+ @outputs = Hash.new
18
22
  end
19
23
 
20
24
  def build
21
25
  UI.puts("Building framework #{@spec} with configuration #{@configuration}")
22
26
  UI.puts "Work dir is :#{@sandbox_root}"
23
- defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'"
24
-
27
+ # defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) PodsDummy_Pods_#{@spec.name}=PodsDummy_PodPackage_#{@spec.name}'"
28
+ defines = ""
25
29
  if @configuration == 'Debug'
26
30
  defines << 'GCC_GENERATE_DEBUGGING_SYMBOLS=YES ONLY_ACTIVE_ARCH=NO'
27
31
  else
@@ -36,15 +40,67 @@ module Pod
36
40
  end
37
41
 
38
42
  def collect_xc_frameworks
43
+ if @muti
44
+ collect_muti_xcframworks
45
+ else
46
+ collect_single_xcframeworks
47
+ end
48
+ end
49
+
50
+ def collect_muti_xcframworks
51
+ @outputs[:xcframework] = Hash.new
52
+ @configs.each do |cfg|
53
+ export_dir = "#{@sandbox_root}/export/**/#{cfg["name"]}.framework"
54
+ frameworks = Pathname.glob(export_dir)
55
+ @outputs[:xcframework][cfg["name"]] = create_xc_framework_by_frameworks frameworks, cfg["name"]
56
+ end
57
+ end
58
+
59
+ def collect_single_xcframeworks
39
60
  export_dir = "#{@sandbox_root}/export/**/#{@spec.name}.framework"
40
61
  frameworks = Pathname.glob(export_dir)
41
- @outputs[:xcframework] = create_xc_framework_by_frameworks frameworks
62
+ @outputs[:xcframework] = create_xc_framework_by_frameworks frameworks, @spec.name
42
63
  end
43
64
 
44
65
  def collect_bundles
45
- ["iphoneos","macOS","appletvos","watchos"].each do |plat|
46
- export_dir = "#{@sandbox_root}/export/*-#{plat}/**/#{@spec.name}.bundle"
66
+ if @muti
67
+ colelct_muti_bundles
68
+ else
69
+ collect_single_bundles
70
+ end
71
+ end
72
+
73
+ def colelct_muti_bundles
74
+ @outputs[:bundle] = Hash.new
75
+ @configs.each do |cfg|
76
+ # "" 这个是用来代表mac os的 macos 没有后缀奇怪吧
77
+ ["iphoneos","","appletvos","watchos"].each do |plat|
78
+ export_dir = "#{@sandbox_root}/export/*-#{plat}/**/#{cfg["name"]}.bundle/**"
79
+ Pathname.glob(export_dir).each do |bundle|
80
+ if bundle.to_s.include? "#{@spec.name}.bundle/Info.plist"
81
+ return
82
+ end
83
+ target_path = "#{@sandbox_root}/bundle/#{cfg["name"]}"
84
+ @outputs[:bundle][cfg["name"]] = target_path
85
+ native_platform = to_native_platform plat
86
+ path = Pathname.new "#{target_path}/#{native_platform}"
87
+ if not path.exist?
88
+ path.mkpath
89
+ end
90
+ FileUtils.cp_r(Dir["#{bundle}"],"#{path}")
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ def collect_single_bundles
97
+ # "" 这个是用来代表mac os的 macos 没有后缀奇怪吧
98
+ ["iphoneos","","appletvos","watchos"].each do |plat|
99
+ export_dir = "#{@sandbox_root}/export/*-#{plat}/**/#{@spec.name}.bundle/**"
47
100
  Pathname.glob(export_dir).each do |bundle|
101
+ if bundle.to_s.include? "#{@spec.name}.bundle/Info.plist"
102
+ return
103
+ end
48
104
  @outputs[:bundle] = "#{@sandbox_root}/bundle"
49
105
  native_platform = to_native_platform plat
50
106
  path = Pathname.new "#{@sandbox_root}/bundle/#{native_platform}"
@@ -56,18 +112,18 @@ module Pod
56
112
  end
57
113
  end
58
114
 
59
- def create_xc_framework_by_frameworks frameworks
115
+ def create_xc_framework_by_frameworks frameworks, spec_name
60
116
  command = 'xcodebuild -create-xcframework '
61
117
  frameworks.each do |framework|
62
118
  command << "-framework #{framework} "
63
119
  end
64
- command << "-output #{@sandbox_root}/#{@spec.name}.xcframework 2>&1"
120
+ command << "-output #{@sandbox_root}/#{spec_name}.xcframework 2>&1"
65
121
  output = `#{command}`.lines.to_a
66
122
  if $?.exitstatus != 0
67
123
  Pod::ErrorUtil.error_report command,output
68
124
  Process.exit -1
69
125
  end
70
- "#{@sandbox_root}/#{@spec.name}.xcframework"
126
+ "#{@sandbox_root}/#{spec_name}.xcframework"
71
127
  end
72
128
 
73
129
  def build_all_device defines
@@ -103,7 +159,16 @@ module Pod
103
159
  outputs_bundle target_dir
104
160
  new_spec_hash = generic_new_podspec_hash @spec
105
161
  new_spec_hash[:vendored_frameworks] = "#{@spec.name}.xcframework"
106
- new_spec_hash[:resource_bundles] = find_bundles target_dir
162
+ new_spec_hash = fix_header_file new_spec_hash, "#{target_dir}/#{@spec.name}.xcframework"
163
+ find_bundles(target_dir).each do |plat, value|
164
+ if new_spec_hash[plat]
165
+ new_spec_hash[plat]["resource_bundles"] = value
166
+ else
167
+ new_spec_hash[plat] = {
168
+ "resource_bundles" => value
169
+ }
170
+ end
171
+ end
107
172
  require 'json'
108
173
  spec_json = JSON.pretty_generate(new_spec_hash) << "\n"
109
174
  File.open("#{target_dir}/#{@spec.name}.podspec.json",'wb+') do |f|
@@ -115,13 +180,14 @@ module Pod
115
180
 
116
181
  def find_bundles target_dir
117
182
  bundle_root = "#{target_dir}/bundle/"
118
- bundle_name = "/#{@spec.name}.bundle"
119
- pattern = "#{bundle_root}*#{bundle_name}"
183
+ pattern = "#{bundle_root}*"
120
184
  result = {}
121
185
  Pathname.glob(pattern).each do |bundle|
122
186
  bundle_relative_path = bundle.to_s.gsub(bundle_root, "")
123
- plat = bundle_relative_path.gsub(bundle_name,"")
124
- result[plat] = "bundle/" + bundle_relative_path
187
+ plat = bundle_relative_path
188
+ result[plat] = {
189
+ "#{@spec.name}" => "bundle/" + bundle_relative_path + "/*"
190
+ }
125
191
  end
126
192
  result
127
193
  end
@@ -140,5 +206,61 @@ module Pod
140
206
  FileUtils.cp_r(Dir[@outputs[:bundle]],target_dir)
141
207
  end
142
208
  end
209
+
210
+ def outputs_muti target_dir
211
+ if not File.exist? target_dir
212
+ Pathname.new(target_dir).mkdir
213
+ end
214
+ outputs_xcframework_muti target_dir
215
+ outputs_bundle_muti target_dir
216
+ generic_new_podspec_hash_muti target_dir
217
+ end
218
+
219
+ def generic_new_podspec_hash_muti target_dir
220
+ work_dir = config.installation_root
221
+ @configs.map do |cfg|
222
+ podspec_path = "#{work_dir}/#{cfg["name"]}/#{cfg["name"]}.podspec"
223
+ if not File.exist? podspec_path
224
+ podspec_path = "#{podspec_path}.json"
225
+ end
226
+ podspec = Pod::Specification.from_file podspec_path
227
+ new_spec_hash = generic_new_podspec_hash podspec
228
+ new_spec_hash[:vendored_frameworks] = "#{podspec.name}.xcframework"
229
+ new_spec_hash = fix_header_file new_spec_hash, "#{target_dir}/#{@spec.name}.xcframework"
230
+ find_bundles("#{target_dir}/#{podspec.name}").each do |plat, value|
231
+ if new_spec_hash[plat]
232
+ new_spec_hash[plat]["resource_bundles"] = value
233
+ else
234
+ new_spec_hash[plat] = {
235
+ "resource_bundles" => value
236
+ }
237
+ end
238
+ end
239
+ require 'json'
240
+ spec_json = JSON.pretty_generate(new_spec_hash) << "\n"
241
+ File.open("#{target_dir}/#{podspec.name}/#{podspec.name}.podspec.json",'wb+') do |f|
242
+ f.write(spec_json)
243
+ end
244
+ UI.puts "result export at :#{target_dir}/#{podspec.name}"
245
+ "#{target_dir}/#{podspec.name}"
246
+ end
247
+ end
248
+
249
+ def outputs_xcframework_muti target_dir
250
+ @outputs[:xcframework].each do |name, path|
251
+ target_dir_path = "#{target_dir}/#{name}/"
252
+ Pathname.new(target_dir_path).mkpath
253
+ FileUtils.cp_r(path, target_dir_path)
254
+ end
255
+ end
256
+
257
+ def outputs_bundle_muti target_dir
258
+ @outputs[:bundle].each do |name, path|
259
+ target_dir_path = "#{target_dir}/#{name}/bundle/"
260
+ Pathname.new(target_dir_path).mkpath
261
+ FileUtils.cp_r(path, target_dir_path)
262
+ end
263
+ end
264
+
143
265
  end
144
266
  end
@@ -2,6 +2,7 @@ require 'xcodeproj'
2
2
  module Pod
3
3
  class XBuilder
4
4
  module XcodeProjHelper
5
+ include PodUtil
5
6
  def modify_xcode_project_sdk_to_simullator path
6
7
  sdks = xcode_sdks
7
8
  project = Xcodeproj::Project.open path
@@ -18,17 +19,6 @@ module Pod
18
19
  project.save
19
20
  end
20
21
 
21
- def to_native_platform name
22
- case name
23
- when 'iphoneos' then 'ios'
24
- when 'macOS' then 'osx'
25
- when 'appletvos' then 'tvos'
26
- when 'watchos' then 'watchos'
27
- else
28
- name
29
- end
30
- end
31
-
32
22
  private
33
23
  def xcode_sdks
34
24
  return @x_sdks if @x_sdks
@@ -3,6 +3,7 @@ require 'cocoapods-framework/config'
3
3
  require 'cocoapods-framework/util'
4
4
  require 'cocoapods-framework/xbuilder'
5
5
  require 'cocoapods-framework/frameworker'
6
+ require 'cocoapods-framework/muti_frameworker'
6
7
 
7
8
 
8
9
  #这个放在最后一个
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-xcframework
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 戴易超
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-14 00:00:00.000000000 Z
11
+ date: 2021-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -58,14 +58,17 @@ dependencies:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
- description: A short description of cocoapods-xcframework.
61
+ description: 把podspec打包成xcframework的小工具。packager pod to a xcframework
62
62
  email:
63
63
  - daiyichao@corp.netease.com
64
64
  executables: []
65
65
  extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
- - Gemfile
68
+ - ".gitignore"
69
+ - Example/Gemfile
70
+ - Example/Gemfile.lock
71
+ - Example/podfile.package
69
72
  - LICENSE.txt
70
73
  - README.md
71
74
  - Rakefile
@@ -73,23 +76,22 @@ files:
73
76
  - lib/cocoapods-framework.rb
74
77
  - lib/cocoapods-framework/command.rb
75
78
  - lib/cocoapods-framework/command/framework.rb
79
+ - lib/cocoapods-framework/command/muti_framework.rb
76
80
  - lib/cocoapods-framework/config.rb
77
81
  - lib/cocoapods-framework/frameworker.rb
78
82
  - lib/cocoapods-framework/gem_version.rb
83
+ - lib/cocoapods-framework/muti_frameworker.rb
79
84
  - lib/cocoapods-framework/util.rb
85
+ - lib/cocoapods-framework/util/cmd.rb
80
86
  - lib/cocoapods-framework/util/dir_util.rb
81
87
  - lib/cocoapods-framework/util/error_util.rb
88
+ - lib/cocoapods-framework/util/git_util.rb
82
89
  - lib/cocoapods-framework/util/pod_util.rb
83
90
  - lib/cocoapods-framework/xbuilder.rb
84
91
  - lib/cocoapods-framework/xbuilder/xcode_xbuild.rb
85
92
  - lib/cocoapods-framework/xbuilder/xcodeproj_helper.rb
86
93
  - lib/cocoapods_plugin.rb
87
94
  - pic/allplatform.png
88
- - pkg/cocoapods-framework-0.0.1.gem
89
- - pkg/cocoapods-framework-0.0.2.gem
90
- - pkg/cocoapods-framework-0.0.3.gem
91
- - pkg/cocoapods-xcframework-0.0.4.gem
92
- - pkg/cocoapods-xcframework-0.0.6.gem
93
95
  - spec/command/framework_spec.rb
94
96
  - spec/spec_helper.rb
95
97
  homepage: https://github.com/TyrantDante/cocoapods-framework
@@ -114,7 +116,7 @@ requirements: []
114
116
  rubygems_version: 3.0.3
115
117
  signing_key:
116
118
  specification_version: 4
117
- summary: A longer description of cocoapods-xcframework.
119
+ summary: 把podspec打包成xcframework的小工具。packager pod to a xcframework
118
120
  test_files:
119
121
  - spec/command/framework_spec.rb
120
122
  - spec/spec_helper.rb
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in cocoapods-framework.gemspec
4
- gemspec
5
-
6
- group :development do
7
- gem 'cocoapods'
8
-
9
- gem 'mocha'
10
- gem 'bacon'
11
- gem 'mocha-on-bacon'
12
- gem 'prettybacon'
13
- end
Binary file
Binary file
Binary file
Binary file
Binary file