cocoapods-lhj-bin 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +11 -0
  4. data/lib/cocoapods-lhj-bin.rb +2 -0
  5. data/lib/cocoapods-lhj-bin/command.rb +1 -0
  6. data/lib/cocoapods-lhj-bin/command/bin.rb +59 -0
  7. data/lib/cocoapods-lhj-bin/command/bin/archive.rb +233 -0
  8. data/lib/cocoapods-lhj-bin/command/bin/auto.rb +198 -0
  9. data/lib/cocoapods-lhj-bin/command/bin/code.rb +232 -0
  10. data/lib/cocoapods-lhj-bin/command/bin/dup.rb +78 -0
  11. data/lib/cocoapods-lhj-bin/command/bin/init.rb +69 -0
  12. data/lib/cocoapods-lhj-bin/command/bin/initHotKey.rb +70 -0
  13. data/lib/cocoapods-lhj-bin/command/bin/install.rb +44 -0
  14. data/lib/cocoapods-lhj-bin/command/bin/lhj.rb +46 -0
  15. data/lib/cocoapods-lhj-bin/command/bin/lib/lint.rb +69 -0
  16. data/lib/cocoapods-lhj-bin/command/bin/repo/update.rb +43 -0
  17. data/lib/cocoapods-lhj-bin/command/bin/spec/create.rb +73 -0
  18. data/lib/cocoapods-lhj-bin/command/bin/spec/push.rb +115 -0
  19. data/lib/cocoapods-lhj-bin/command/bin/update.rb +153 -0
  20. data/lib/cocoapods-lhj-bin/config/config.rb +137 -0
  21. data/lib/cocoapods-lhj-bin/config/config_asker.rb +57 -0
  22. data/lib/cocoapods-lhj-bin/config/config_builder.rb +216 -0
  23. data/lib/cocoapods-lhj-bin/config/config_hot_key.rb +103 -0
  24. data/lib/cocoapods-lhj-bin/config/config_hot_key_asker.rb +57 -0
  25. data/lib/cocoapods-lhj-bin/gem_version.rb +9 -0
  26. data/lib/cocoapods-lhj-bin/helpers.rb +5 -0
  27. data/lib/cocoapods-lhj-bin/helpers/Info.plist +0 -0
  28. data/lib/cocoapods-lhj-bin/helpers/build_helper.rb +158 -0
  29. data/lib/cocoapods-lhj-bin/helpers/build_utils.rb +93 -0
  30. data/lib/cocoapods-lhj-bin/helpers/framework.rb +85 -0
  31. data/lib/cocoapods-lhj-bin/helpers/framework_builder.rb +444 -0
  32. data/lib/cocoapods-lhj-bin/helpers/library.rb +54 -0
  33. data/lib/cocoapods-lhj-bin/helpers/library_builder.rb +90 -0
  34. data/lib/cocoapods-lhj-bin/helpers/sources_helper.rb +36 -0
  35. data/lib/cocoapods-lhj-bin/helpers/spec_creator.rb +168 -0
  36. data/lib/cocoapods-lhj-bin/helpers/spec_files_helper.rb +75 -0
  37. data/lib/cocoapods-lhj-bin/helpers/spec_source_creator.rb +227 -0
  38. data/lib/cocoapods-lhj-bin/helpers/upload_helper.rb +87 -0
  39. data/lib/cocoapods-lhj-bin/native.rb +19 -0
  40. data/lib/cocoapods-lhj-bin/native/acknowledgements.rb +27 -0
  41. data/lib/cocoapods-lhj-bin/native/analyzer.rb +55 -0
  42. data/lib/cocoapods-lhj-bin/native/file_accessor.rb +28 -0
  43. data/lib/cocoapods-lhj-bin/native/installation_options.rb +25 -0
  44. data/lib/cocoapods-lhj-bin/native/installer.rb +135 -0
  45. data/lib/cocoapods-lhj-bin/native/linter.rb +26 -0
  46. data/lib/cocoapods-lhj-bin/native/path_source.rb +33 -0
  47. data/lib/cocoapods-lhj-bin/native/pod_source_installer.rb +19 -0
  48. data/lib/cocoapods-lhj-bin/native/pod_target_installer.rb +94 -0
  49. data/lib/cocoapods-lhj-bin/native/podfile.rb +91 -0
  50. data/lib/cocoapods-lhj-bin/native/podfile_env.rb +37 -0
  51. data/lib/cocoapods-lhj-bin/native/podfile_generator.rb +199 -0
  52. data/lib/cocoapods-lhj-bin/native/podspec_finder.rb +25 -0
  53. data/lib/cocoapods-lhj-bin/native/resolver.rb +230 -0
  54. data/lib/cocoapods-lhj-bin/native/sandbox_analyzer.rb +34 -0
  55. data/lib/cocoapods-lhj-bin/native/source.rb +35 -0
  56. data/lib/cocoapods-lhj-bin/native/sources_manager.rb +20 -0
  57. data/lib/cocoapods-lhj-bin/native/specification.rb +31 -0
  58. data/lib/cocoapods-lhj-bin/native/target_validator.rb +41 -0
  59. data/lib/cocoapods-lhj-bin/native/validator.rb +40 -0
  60. data/lib/cocoapods-lhj-bin/source_provider_hook.rb +66 -0
  61. data/lib/cocoapods_plugin.rb +2 -0
  62. data/spec/command/bin_spec.rb +12 -0
  63. data/spec/spec_helper.rb +50 -0
  64. metadata +177 -0
@@ -0,0 +1,54 @@
1
+ # copy from https://github.com/CocoaPods/cocoapods-packager
2
+
3
+ module CBin
4
+ class Library
5
+ attr_reader :headers_path
6
+ attr_reader :resources_path
7
+ attr_reader :root_path
8
+ attr_reader :versions_path
9
+ attr_reader :name_path
10
+
11
+ def initialize(name, platform, version)
12
+ @name = name
13
+ @platform = platform
14
+ @version = version
15
+ end
16
+
17
+ def make
18
+ make_root
19
+ make_library
20
+ make_headers
21
+ make_resources
22
+ end
23
+
24
+ def delete_resources
25
+ Pathname.new(@resources_path).rmtree
26
+ (Pathname.new(@fwk_path) + Pathname.new('Resources')).delete
27
+ end
28
+
29
+ private
30
+
31
+ def make_library
32
+ @name_path = CBin::Config::Builder.instance.library_name_version(@name,@version)
33
+ @fwk_path = @root_path + Pathname.new(@name_path)
34
+ @fwk_path.mkdir unless @fwk_path.exist?
35
+
36
+ @versions_path = @fwk_path
37
+ end
38
+
39
+ def make_headers
40
+ @headers_path = @versions_path + Pathname.new('Headers')
41
+ @headers_path.mkpath unless @headers_path.exist?
42
+ end
43
+
44
+ def make_resources
45
+ @resources_path = @versions_path + Pathname.new('Resources')
46
+ @resources_path.mkpath unless @resources_path.exist?
47
+ end
48
+
49
+ def make_root
50
+ @root_path = Pathname.new(@platform)
51
+ @root_path.mkpath unless @root_path.exist?
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,90 @@
1
+
2
+ # copy from https://github.com/CocoaPods/cocoapods-packager
3
+
4
+ require 'cocoapods-lhj-bin/helpers/framework.rb'
5
+ require 'cocoapods-lhj-bin/helpers/library.rb'
6
+
7
+ require 'English'
8
+
9
+ module CBin
10
+ class Library
11
+ class Builder
12
+ include Pod
13
+
14
+ def initialize(spec, file_accessor, platform, source_dir,framework_path)
15
+ @spec = spec
16
+ @source_dir = source_dir
17
+ @file_accessor = file_accessor
18
+ @platform = platform
19
+ @framework = framework_path
20
+ @source_files = "#{@source_dir}/#{library.name_path}"
21
+ @source_zip_file = "#{@source_files}.zip"
22
+ end
23
+
24
+ def build
25
+ UI.section("Building static library #{@spec}") do
26
+
27
+ clean_source_dir
28
+
29
+ copy_headers
30
+ copy_library
31
+ copy_resources
32
+
33
+ cp_to_source_dir
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def clean_source_dir
40
+ FileUtils.rm_rf(@source_files) if File.exist?(@source_files)
41
+ FileUtils.rm_rf(@source_zip_file) if File.exist?(@source_zip_file)
42
+ end
43
+
44
+ def cp_to_source_dir
45
+ target_dir = library.versions_path
46
+ dest_file = "#{@source_dir}/#{library.name_path}"
47
+ FileUtils.rm_rf(dest_file) if File.exist?(dest_file)
48
+
49
+ `cp -fa #{target_dir} #{dest_file}/`
50
+ end
51
+
52
+ def copy_headers
53
+ FileUtils.cp_r(framework.headers_path,library.versions_path) if File.exist?(framework.headers_path)
54
+ end
55
+
56
+ def copy_library
57
+ src_file = "#{framework.versions_path}/#{@spec.name}"
58
+ unless File.exist?(src_file)
59
+ raise Informative, "framework没有文件:#{src_file}"
60
+ end
61
+
62
+ dest_file = "#{library.versions_path}/#{@spec.name}"
63
+ rename_dest_file = "#{library.versions_path}/lib#{@spec.name}.a"
64
+ FileUtils.cp_r(src_file,dest_file)
65
+ File.rename(dest_file, rename_dest_file ) if File.exist?(dest_file)
66
+ end
67
+
68
+ def copy_resources
69
+ FileUtils.cp_r(framework.resources_path,library.versions_path) if File.exist?(framework.resources_path)
70
+ end
71
+
72
+
73
+ def framework
74
+ @framework ||= begin
75
+ framework = Framework.new(@spec.name, @platform.name.to_s)
76
+ framework.make
77
+ framework
78
+ end
79
+ end
80
+
81
+ def library
82
+ @library ||= begin
83
+ library = Library.new(@spec.name, @platform.name.to_s,@spec.version)
84
+ library.make
85
+ library
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,36 @@
1
+
2
+
3
+ require 'cocoapods-lhj-bin/native/sources_manager.rb'
4
+
5
+ module CBin
6
+ module SourcesHelper
7
+ def sources_manager
8
+ Pod::Config.instance.sources_manager
9
+ end
10
+
11
+ def binary_source
12
+ sources_manager.binary_source
13
+ end
14
+
15
+ def code_source
16
+ sources_manager.code_source
17
+ end
18
+
19
+ # 优先采用对应依赖的 source
20
+ # cocoapods 内部会先匹配前面符合的 specification
21
+ # 只允许二进制的 specification subspec 比源码的 specification subspec 多
22
+ #
23
+ def valid_sources(code_dependencies = false)
24
+ sources = [code_source]
25
+ unless code_dependencies
26
+ sources << binary_source
27
+ sources.reverse!
28
+ end
29
+ sources
30
+ end
31
+
32
+ def sources_option(code_dependencies, additional_sources)
33
+ (valid_sources(code_dependencies).map(&:url) + Array(additional_sources)).join(',')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,168 @@
1
+ require 'cocoapods'
2
+ require 'cocoapods-lhj-bin/config/config'
3
+
4
+ module CBin
5
+ class Specification
6
+ class Creator
7
+ attr_reader :code_spec
8
+ attr_reader :template_spec
9
+ attr_reader :spec
10
+
11
+ def initialize(code_spec, template_spec, platforms = 'ios')
12
+ @code_spec = code_spec
13
+ @template_spec = template_spec
14
+ @platforms = Array(platforms)
15
+ validate!
16
+ end
17
+
18
+ def validate!
19
+ raise Pod::Informative, '源码 podspec 不能为空 .' unless code_spec
20
+ if code_spec.subspecs.any? && template_spec.nil?
21
+ raise Pod::Informative, "不支持自动生成存在 subspec 的二进制 podspec , 需要提供模版文件 #{code_spec.name}.binary.podspec.template ."
22
+ end
23
+ end
24
+
25
+ def create
26
+ spec = template_spec ? create_from_code_spec_and_template_spec : create_from_code_spec
27
+
28
+ Pod::UI.message '生成二进制 podspec 内容: '
29
+ spec.to_pretty_json.split("\n").each do |text|
30
+ Pod::UI.message text
31
+ end
32
+
33
+ spec
34
+ end
35
+
36
+ def write_spec_file(file = filename)
37
+ create unless spec
38
+
39
+ File.open(file, 'w+') do |f|
40
+ f.write(spec.to_pretty_json)
41
+ end
42
+
43
+ @filename = file
44
+ end
45
+
46
+ def clear_spec_file
47
+ File.delete(filename) if File.exist?(filename)
48
+ end
49
+
50
+ def filename
51
+ @filename ||= "#{spec.name}.binary.podspec.json"
52
+ end
53
+
54
+ private
55
+
56
+ def create_from_code_spec
57
+ @spec = code_spec.dup
58
+ # vendored_frameworks | resources | source | source_files | public_header_files
59
+ # license | resource_bundles | vendored_libraries
60
+
61
+ # Project Linkin
62
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
63
+
64
+ # Resources
65
+ extnames = []
66
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
67
+ if code_spec_consumer.resources.any?
68
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
69
+ end
70
+ if extnames.any?
71
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
72
+ end
73
+
74
+ # Source Location
75
+ @spec.source = binary_source
76
+
77
+ # Source Code
78
+ @spec.source_files = framework_contents('Headers/*')
79
+ @spec.public_header_files = framework_contents('Headers/*')
80
+
81
+ # Unused for binary
82
+ spec_hash = @spec.to_hash
83
+ # spec_hash.delete('license')
84
+ spec_hash.delete('resource_bundles')
85
+ spec_hash.delete('exclude_files')
86
+ spec_hash.delete('preserve_paths')
87
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
88
+ # 如果是静态库的话,需要移除,否则就不移除
89
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
90
+ # 这里统一只对命名后缀 .a 文件做处理
91
+ # spec_hash.delete('vendored_libraries')
92
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
93
+ spec_hash.delete('vendored_libraries')
94
+ spec_hash['vendored_libraries'] = binary_vendored_libraries
95
+
96
+ # vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
97
+ # if vendored_libraries.any?
98
+ # spec_hash['vendored_libraries'] = vendored_libraries
99
+ # end
100
+
101
+ # Filter platforms
102
+ platforms = spec_hash['platforms']
103
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
104
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
105
+
106
+ @spec = Pod::Specification.from_hash(spec_hash)
107
+ @spec
108
+ end
109
+
110
+ def create_from_code_spec_and_template_spec
111
+ @spec = template_spec.dup
112
+
113
+ @spec.version = code_spec.version
114
+ @spec.source = binary_source
115
+
116
+ @spec.source_files = binary_source_files
117
+ @spec.public_header_files = binary_public_header_files
118
+ @spec.vendored_libraries = binary_vendored_libraries
119
+
120
+ @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
121
+
122
+
123
+
124
+ @spec
125
+ end
126
+
127
+ def binary_source
128
+ { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
129
+ end
130
+
131
+ def code_spec_consumer(_platform = :ios)
132
+ code_spec.consumer(:ios)
133
+ end
134
+
135
+ def framework_contents(name)
136
+ ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
137
+ end
138
+
139
+ def binary_source_files
140
+ { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
141
+ end
142
+
143
+ def binary_source_files
144
+ "bin_#{code_spec.name}_#{code_spec.version}/Headers/*"
145
+ end
146
+
147
+ def binary_public_header_files
148
+ "bin_#{code_spec.name}_#{code_spec.version}/Headers/*.h"
149
+ end
150
+
151
+ def binary_vendored_libraries
152
+ "bin_#{code_spec.name}_#{code_spec.version}/*.a"
153
+ end
154
+
155
+ def binary_resources
156
+ "bin_#{code_spec.name}_#{code_spec.version}/Resources/*"
157
+ end
158
+
159
+ end
160
+ end
161
+ end
162
+ #模板框架begin
163
+ # s.source_files = "bin_#{s.name}_#{s.version}/Headers/*"
164
+ # s.public_header_files = "bin_#{s.name}_#{s.version}/Headers/*.h"
165
+ # s.vendored_libraries = "bin_#{s.name}_#{s.version}/*.a"
166
+ #有图片资源的,要带上
167
+ #s.resources = 'bin_#{s.name}_#{s.version}/Resources/*.{json,png,jpg,gif,js,xib,eot,svg,ttf,woff,db,sqlite,mp3,bundle}'
168
+ #模板框架end
@@ -0,0 +1,75 @@
1
+ require 'cocoapods-lhj-bin/native/sources_manager'
2
+ require 'cocoapods-lhj-bin/helpers/spec_creator'
3
+
4
+ module CBin
5
+ module SpecFilesHelper
6
+ def spec_files
7
+ @spec_files ||= Pathname.glob('*.podspec{,.json}')
8
+ end
9
+
10
+ def binary_spec_files
11
+ @binary_spec_files ||= Pathname.glob('*.binary.podspec{,.json}')
12
+ end
13
+
14
+ def binary_template_spec_files
15
+ @binary_spec_template_files ||= Pathname.glob('*.binary-template.podspec{,.json}')
16
+ end
17
+
18
+ def binary_template_spec_file
19
+ @binary_spec_template_file ||= binary_template_spec_files.first
20
+ end
21
+
22
+ def code_spec_files
23
+ @code_spec_files ||= spec_files - binary_spec_files - binary_template_spec_files
24
+ end
25
+
26
+ def code_spec
27
+ if code_spec_files.first
28
+ Pod::Specification.from_file(code_spec_files.first)
29
+ end
30
+ end
31
+
32
+ def binary_spec
33
+ if binary_spec_files.first
34
+ Pod::Specification.from_file(binary_spec_files.first)
35
+ end
36
+ end
37
+
38
+ def binary_template_spec
39
+ if binary_template_spec_file
40
+ Pod::Specification.from_file(binary_template_spec_file)
41
+ end
42
+ end
43
+
44
+ def find_spec_file(podspec)
45
+ path = Pathname(podspec)
46
+ raise Pod::Informative, "无法找到 #{podspec}" unless path.exist?
47
+
48
+ path
49
+ end
50
+
51
+ def create_binary_spec_file(code_spec, template_spec)
52
+ # 1. code spec 是否有 subpsec
53
+ # 1.1 有,查找 template spec,并生成
54
+ # 1.2 没有,是否有 template spec
55
+ # 1.2.1 有,根据 template spec 生成
56
+ # 1.2.2 没有,根据 code spec 生成
57
+
58
+ unless code_spec
59
+ raise Pod::Informative, '没有二进制 podspec 的情况下,必须要提供源码 podspec.'
60
+ end
61
+ if code_spec.subspecs.any? && template_spec.nil?
62
+ raise Pod::Informative, '拥有 subspec 的组件,在生成二进制 podspec 时,必须要提供模版 podspec.'
63
+ end
64
+
65
+ @spec_creator = CBin::Specification::Creator.new(code_spec, template_spec)
66
+ @spec_creator.create
67
+ @spec_creator.write_spec_file
68
+ @spec_creator.filename
69
+ end
70
+
71
+ def clear_binary_spec_file_if_needed
72
+ @spec_creator&.clear_spec_file
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,227 @@
1
+
2
+
3
+ require 'cocoapods'
4
+ require 'cocoapods-lhj-bin/config/config'
5
+
6
+ module CBin
7
+ class SpecificationSource
8
+ class Creator
9
+ attr_reader :code_spec
10
+ attr_reader :spec
11
+
12
+ def initialize(code_spec, platforms = 'ios')
13
+ @code_spec = code_spec
14
+ @platforms = Array(platforms)
15
+ validate!
16
+ end
17
+
18
+ def validate!
19
+ raise Pod::Informative, '源码 podspec 不能为空 .' unless code_spec
20
+ end
21
+
22
+ def create
23
+ # spec = nil
24
+ if CBin::Build::Utils.is_framework(@code_spec)
25
+ spec = create_framework_from_code_spec
26
+ else
27
+ spec = create_from_code_spec
28
+ end
29
+
30
+ spec
31
+ end
32
+
33
+ def write_spec_file(file = filename)
34
+ create unless spec
35
+
36
+ FileUtils.mkdir_p(CBin::Config::Builder.instance.binary_json_dir) unless File.exist?(CBin::Config::Builder.instance.binary_json_dir)
37
+ FileUtils.rm_rf(file) if File.exist?(file)
38
+
39
+ File.open(file, 'w+') do |f|
40
+ f.write(spec.to_pretty_json)
41
+ end
42
+
43
+ @filename = file
44
+ end
45
+
46
+ def clear_spec_file
47
+ File.delete(filename) if File.exist?(filename)
48
+ end
49
+
50
+ def filename
51
+ @filename ||= "#{CBin::Config::Builder.instance.binary_json_dir_name}/#{spec.name}.binary.podspec.json"
52
+ end
53
+
54
+ private
55
+
56
+ def create_from_code_spec
57
+ @spec = code_spec.dup
58
+ # vendored_frameworks | resources | source | source_files | public_header_files
59
+ # license | resource_bundles | vendored_libraries
60
+
61
+ # Project Linkin
62
+ # @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
63
+
64
+ # Resources
65
+ extnames = []
66
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
67
+ if code_spec_consumer.resources.any?
68
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
69
+ end
70
+ if extnames.any?
71
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
72
+ end
73
+
74
+ # Source Location
75
+ @spec.source = binary_source
76
+
77
+ # Source Code
78
+ # @spec.source_files = framework_contents('Headers/*')
79
+ # @spec.public_header_files = framework_contents('Headers/*')
80
+
81
+ # Unused for binary
82
+ spec_hash = @spec.to_hash
83
+ # spec_hash.delete('license')
84
+ spec_hash.delete('resource_bundles')
85
+ spec_hash.delete('exclude_files')
86
+ spec_hash.delete('preserve_paths')
87
+
88
+ spec_hash.delete('subspecs')
89
+ spec_hash.delete('default_subspecs')
90
+ spec_hash.delete('default_subspec')
91
+ spec_hash.delete('vendored_frameworks')
92
+ spec_hash.delete('vendored_framework')
93
+
94
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
95
+ # 如果是静态库的话,需要移除,否则就不移除
96
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
97
+ # 这里统一只对命名后缀 .a 文件做处理
98
+ # spec_hash.delete('vendored_libraries')
99
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
100
+ spec_hash.delete('vendored_libraries')
101
+
102
+ # vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
103
+ # if vendored_libraries.any?
104
+ # spec_hash['vendored_libraries'] = vendored_libraries
105
+ # end
106
+
107
+ # Filter platforms
108
+ platforms = spec_hash['platforms']
109
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
110
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
111
+
112
+ @spec = Pod::Specification.from_hash(spec_hash)
113
+
114
+ #把命令 prepare_command 移除掉,如ReactiveCocoa会执行修改重命令的脚步
115
+ @spec.prepare_command = "" if @spec.prepare_command
116
+ @spec.version = code_spec.version
117
+ @spec.source = binary_source
118
+ @spec.source_files = binary_source_files
119
+ @spec.public_header_files = binary_public_header_files
120
+ @spec.vendored_libraries = binary_vendored_libraries
121
+ @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
122
+ @spec.description = <<-EOF
123
+ 「 converted automatically by plugin cocoapods-lhj-bin 」
124
+ #{@spec.description}
125
+ EOF
126
+ @spec
127
+ end
128
+
129
+ def create_framework_from_code_spec
130
+ @spec = code_spec.dup
131
+ # vendored_frameworks | resources | source | source_files | public_header_files
132
+ # license | resource_bundles | vendored_libraries
133
+
134
+ # Project Linkin
135
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
136
+
137
+ # Resources
138
+ extnames = []
139
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
140
+ if code_spec_consumer.resources.any?
141
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
142
+ end
143
+ if extnames.any?
144
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
145
+ end
146
+
147
+ # Source Location
148
+ @spec.source = binary_source
149
+
150
+ # Source Code
151
+ # @spec.source_files = framework_contents('Headers/*')
152
+ # @spec.public_header_files = framework_contents('Headers/*')
153
+
154
+ # Unused for binary
155
+ spec_hash = @spec.to_hash
156
+ # spec_hash.delete('license')
157
+ spec_hash.delete('resource_bundles')
158
+ spec_hash.delete('exclude_files')
159
+ spec_hash.delete('preserve_paths')
160
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
161
+ # 如果是静态库的话,需要移除,否则就不移除
162
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
163
+ # 这里统一只对命名后缀 .a 文件做处理
164
+ # spec_hash.delete('vendored_libraries')
165
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
166
+ vendored_libraries = spec_hash.delete('vendored_libraries')
167
+ vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
168
+ if vendored_libraries.any?
169
+ spec_hash['vendored_libraries'] = vendored_libraries
170
+ end
171
+
172
+ # Filter platforms
173
+ platforms = spec_hash['platforms']
174
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
175
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
176
+
177
+ @spec = Pod::Specification.from_hash(spec_hash)
178
+ @spec.description = <<-EOF
179
+ 「 converted automatically by plugin cocoapods-lhj-bin 」
180
+ #{@spec.description}
181
+ EOF
182
+ @spec
183
+ end
184
+
185
+
186
+ def binary_source
187
+ { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
188
+ end
189
+
190
+ def code_spec_consumer(_platform = :ios)
191
+ code_spec.consumer(:ios)
192
+ end
193
+
194
+ def framework_contents(name)
195
+ ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
196
+ end
197
+
198
+ def binary_source_files
199
+ { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
200
+ end
201
+
202
+ def binary_source_files
203
+ "bin_#{code_spec.name}_#{code_spec.version}/Headers/*"
204
+ end
205
+
206
+ def binary_public_header_files
207
+ "bin_#{code_spec.name}_#{code_spec.version}/Headers/*.h"
208
+ end
209
+
210
+ def binary_vendored_libraries
211
+ "bin_#{code_spec.name}_#{code_spec.version}/*.a"
212
+ end
213
+
214
+ def binary_resources
215
+ "bin_#{code_spec.name}_#{code_spec.version}/Resources/*"
216
+ end
217
+
218
+ end
219
+ end
220
+ end
221
+ #模板框架begin
222
+ # s.source_files = "bin_#{s.name}_#{s.version}/Headers/*"
223
+ # s.public_header_files = "bin_#{s.name}_#{s.version}/Headers/*.h"
224
+ # s.vendored_libraries = "bin_#{s.name}_#{s.version}/*.a"
225
+ #有图片资源的,要带上
226
+ #s.resources = 'bin_#{s.name}_#{s.version}/Resources/*.{json,png,jpg,gif,js,xib,eot,svg,ttf,woff,db,sqlite,mp3,bundle}'
227
+ #模板框架end