cocoapods-meitu-bin 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +56 -0
  4. data/lib/cocoapods-meitu-bin/command/bin/archive.rb +206 -0
  5. data/lib/cocoapods-meitu-bin/command/bin/auto.rb +212 -0
  6. data/lib/cocoapods-meitu-bin/command/bin/build_all.rb +345 -0
  7. data/lib/cocoapods-meitu-bin/command/bin/header_files_specifications.rb +262 -0
  8. data/lib/cocoapods-meitu-bin/command/bin/init.rb +72 -0
  9. data/lib/cocoapods-meitu-bin/command/bin/install.rb +44 -0
  10. data/lib/cocoapods-meitu-bin/command/bin/lib/lint.rb +67 -0
  11. data/lib/cocoapods-meitu-bin/command/bin/lock/dependency.rb +89 -0
  12. data/lib/cocoapods-meitu-bin/command/bin/lock/spec_repo.rb +105 -0
  13. data/lib/cocoapods-meitu-bin/command/bin/lock/version.rb +68 -0
  14. data/lib/cocoapods-meitu-bin/command/bin/lock.rb +36 -0
  15. data/lib/cocoapods-meitu-bin/command/bin/output_source.rb +146 -0
  16. data/lib/cocoapods-meitu-bin/command/bin/repo/push.rb +88 -0
  17. data/lib/cocoapods-meitu-bin/command/bin/repo/update.rb +42 -0
  18. data/lib/cocoapods-meitu-bin/command/bin/repo.rb +14 -0
  19. data/lib/cocoapods-meitu-bin/command/bin/source/add.rb +148 -0
  20. data/lib/cocoapods-meitu-bin/command/bin/source/delete.rb +59 -0
  21. data/lib/cocoapods-meitu-bin/command/bin/source/list.rb +46 -0
  22. data/lib/cocoapods-meitu-bin/command/bin/source.rb +30 -0
  23. data/lib/cocoapods-meitu-bin/command/bin/spec/create.rb +73 -0
  24. data/lib/cocoapods-meitu-bin/command/bin/spec/lint.rb +109 -0
  25. data/lib/cocoapods-meitu-bin/command/bin/spec.rb +13 -0
  26. data/lib/cocoapods-meitu-bin/command/bin/update.rb +154 -0
  27. data/lib/cocoapods-meitu-bin/command/bin/upload.rb +175 -0
  28. data/lib/cocoapods-meitu-bin/command/bin.rb +69 -0
  29. data/lib/cocoapods-meitu-bin/command.rb +1 -0
  30. data/lib/cocoapods-meitu-bin/config/config.rb +149 -0
  31. data/lib/cocoapods-meitu-bin/config/config_asker.rb +57 -0
  32. data/lib/cocoapods-meitu-bin/config/config_builder.rb +216 -0
  33. data/lib/cocoapods-meitu-bin/gem_version.rb +9 -0
  34. data/lib/cocoapods-meitu-bin/helpers/Info.plist +0 -0
  35. data/lib/cocoapods-meitu-bin/helpers/buildAll/bin_helper.rb +97 -0
  36. data/lib/cocoapods-meitu-bin/helpers/buildAll/builder.rb +434 -0
  37. data/lib/cocoapods-meitu-bin/helpers/buildAll/podspec_util.rb +140 -0
  38. data/lib/cocoapods-meitu-bin/helpers/buildAll/zip_file_helper.rb +87 -0
  39. data/lib/cocoapods-meitu-bin/helpers/build_helper.rb +167 -0
  40. data/lib/cocoapods-meitu-bin/helpers/build_utils.rb +64 -0
  41. data/lib/cocoapods-meitu-bin/helpers/framework.rb +86 -0
  42. data/lib/cocoapods-meitu-bin/helpers/framework_builder.rb +551 -0
  43. data/lib/cocoapods-meitu-bin/helpers/library.rb +54 -0
  44. data/lib/cocoapods-meitu-bin/helpers/library_builder.rb +90 -0
  45. data/lib/cocoapods-meitu-bin/helpers/pod_size_helper.rb +54 -0
  46. data/lib/cocoapods-meitu-bin/helpers/sources_helper.rb +35 -0
  47. data/lib/cocoapods-meitu-bin/helpers/spec_creator.rb +170 -0
  48. data/lib/cocoapods-meitu-bin/helpers/spec_files_helper.rb +80 -0
  49. data/lib/cocoapods-meitu-bin/helpers/spec_source_creator.rb +304 -0
  50. data/lib/cocoapods-meitu-bin/helpers/upload_helper.rb +104 -0
  51. data/lib/cocoapods-meitu-bin/helpers.rb +5 -0
  52. data/lib/cocoapods-meitu-bin/native/acknowledgements.rb +27 -0
  53. data/lib/cocoapods-meitu-bin/native/analyzer.rb +109 -0
  54. data/lib/cocoapods-meitu-bin/native/file_accessor.rb +28 -0
  55. data/lib/cocoapods-meitu-bin/native/gen.rb +79 -0
  56. data/lib/cocoapods-meitu-bin/native/installation_options.rb +28 -0
  57. data/lib/cocoapods-meitu-bin/native/installer.rb +259 -0
  58. data/lib/cocoapods-meitu-bin/native/linter.rb +26 -0
  59. data/lib/cocoapods-meitu-bin/native/lockfile.rb +85 -0
  60. data/lib/cocoapods-meitu-bin/native/path_source.rb +33 -0
  61. data/lib/cocoapods-meitu-bin/native/pod_source_installer.rb +19 -0
  62. data/lib/cocoapods-meitu-bin/native/pod_target_installer.rb +87 -0
  63. data/lib/cocoapods-meitu-bin/native/podfile.rb +99 -0
  64. data/lib/cocoapods-meitu-bin/native/podfile_env.rb +38 -0
  65. data/lib/cocoapods-meitu-bin/native/podfile_generator.rb +201 -0
  66. data/lib/cocoapods-meitu-bin/native/podspec_finder.rb +25 -0
  67. data/lib/cocoapods-meitu-bin/native/resolver.rb +299 -0
  68. data/lib/cocoapods-meitu-bin/native/sandbox_analyzer.rb +34 -0
  69. data/lib/cocoapods-meitu-bin/native/source.rb +35 -0
  70. data/lib/cocoapods-meitu-bin/native/sources_manager.rb +21 -0
  71. data/lib/cocoapods-meitu-bin/native/specification.rb +31 -0
  72. data/lib/cocoapods-meitu-bin/native/target_validator.rb +41 -0
  73. data/lib/cocoapods-meitu-bin/native/validator.rb +40 -0
  74. data/lib/cocoapods-meitu-bin/native.rb +26 -0
  75. data/lib/cocoapods-meitu-bin/source_provider_hook.rb +68 -0
  76. data/lib/cocoapods-meitu-bin.rb +2 -0
  77. data/lib/cocoapods_plugin.rb +11 -0
  78. data/spec/command/bin_spec.rb +12 -0
  79. data/spec/spec_helper.rb +50 -0
  80. metadata +201 -0
@@ -0,0 +1,175 @@
1
+ require 'json'
2
+ require 'cocoapods-meitu-bin/helpers/buildAll/bin_helper'
3
+
4
+ module Pod
5
+ class Command
6
+ class Bin < Command
7
+ class Upload < Bin
8
+ include Pod
9
+
10
+ self.summary = "上传二进制文件及podspec"
11
+ self.description = <<-DESC
12
+ #{self.summary}
13
+
14
+ `NAME`: 库名【必填】\n
15
+ `VERSION`: 版本号【必填】\n
16
+ `FILE`: 需要压缩的二进制文件或目录【必填】\n
17
+ `REPO`: 上传podspec的仓库,可以通过`pod repo list`查看【必填】\n
18
+
19
+ e.g.:\n
20
+ pod bin upload Pod1 1.0.0 Pod1.framework mtxxspecs --spec=Pod1.podspec
21
+ DESC
22
+
23
+ self.arguments = [
24
+ CLAide::Argument.new('NAME', true ),
25
+ CLAide::Argument.new('VERSION', true),
26
+ CLAide::Argument.new('FILE', true),
27
+ CLAide::Argument.new('REPO', true)
28
+ ]
29
+
30
+ def self.options
31
+ [
32
+ %w[--spec=SPEC 指定podspec文件路径,如果不指定,将在当前目录下查找]
33
+ ].concat(super)
34
+ end
35
+
36
+ def initialize(argv)
37
+ @name = argv.shift_argument
38
+ @version = argv.shift_argument
39
+ @file = argv.shift_argument
40
+ @repo = argv.shift_argument
41
+ @spec = argv.option('spec', nil)
42
+ @xcode_version = CBin::BuildAll::BinHelper.xcode_version
43
+ super
44
+ end
45
+
46
+ def run
47
+ # 参数检查
48
+ argvsCheck
49
+ # 压缩文件
50
+ zip_file
51
+ # 上传文件
52
+ upload_zip_file
53
+ # 修改podspec
54
+ modify_spec
55
+ # 上传podspec
56
+ upload_spec
57
+ end
58
+
59
+ private
60
+
61
+ # 参数检查
62
+ def argvsCheck
63
+ raise Informative, "name不能为空" if @name.nil?
64
+ raise Informative, "version不能为空" if @version.nil?
65
+ raise Informative, "repo不能为空" if @repo.nil?
66
+ raise Informative, "未找到需要压缩的二进制文件" if @file.nil?
67
+ raise Informative, "未找到podspec文件" unless File.exist?(podspec)
68
+ end
69
+
70
+ # 压缩文件
71
+ def zip_file
72
+ UI.title "压缩二进制文件`#{zip_file_name}`".yellow do
73
+ output_zip_file = File.join(Dir.pwd, zip_file_name)
74
+ FileUtils.rm_f(output_zip_file) if File.exist?(output_zip_file)
75
+ command = "zip --symlinks -r #{zip_file_name} #{@file}"
76
+ UI.info "#{command}"
77
+ `#{command}`
78
+ raise Informative, "压缩二进制文件失败" unless File.exist?(output_zip_file)
79
+ end
80
+ end
81
+
82
+ # 压缩后的zip包名
83
+ def zip_file_name
84
+ @zip_file_name ||= begin
85
+ "#{@name}_#{@version}.zip"
86
+ end
87
+ end
88
+
89
+ # 上传文件
90
+ def upload_zip_file
91
+ UI.title "上传二进制文件`#{zip_file_name}`".yellow do
92
+ zip_file = File.join(Dir.pwd, zip_file_name)
93
+ raise Informative, "`#{@zip_file_name}`不存在" unless File.exist?(zip_file)
94
+ upload_url = CBin.config.binary_upload_url_str
95
+ command = "curl -F \"name=#{@name}\" -F \"version=#{@version}\" -F \"file=@#{zip_file}\" #{upload_url}"
96
+ UI.info "#{command}"
97
+ json = `#{command}`
98
+ UI.info json
99
+ begin
100
+ error_code = JSON.parse(json)["error_code"]
101
+ raise Informative, "`#{zip_file_name}`上传失败" unless error_code == 0
102
+ UI.info "`#{zip_file_name}`上传成功".green
103
+ rescue JSON::ParserError => e
104
+ raise Informative, "`#{zip_file_name}`上传失败\n#{e.to_s}"
105
+ end
106
+ end
107
+ end
108
+
109
+ # 修改podspec
110
+ def modify_spec
111
+ UI.title "修改podspec:`#{podspec}`".yellow do
112
+ spec = Specification.from_file(podspec)
113
+ spec_hash = spec.to_hash
114
+ spec_hash['version'] = @version
115
+ spec_hash['source'] = source
116
+ spec = Specification.from_hash(spec_hash)
117
+ write_podspec_json(spec)
118
+ end
119
+ end
120
+
121
+ # 写入podspec
122
+ def write_podspec_json(spec)
123
+ FileUtils.rm_f(podspec_json_file) if File.exist?(podspec_json_file)
124
+ File.open(podspec_json_file, "w+") do |f|
125
+ f.write(spec.to_pretty_json)
126
+ end
127
+ end
128
+
129
+ def source
130
+ url = "#{CBin.config.binary_download_url_str}/#{@xcode_version}/#{@name}/#{@version}/#{zip_file_name}"
131
+ { http: url, type: CBin.config.download_file_type }
132
+ end
133
+
134
+ # 上传podspec
135
+ def upload_spec
136
+ UI.title "推送podspec:`#{podspec_json_file_name}`".yellow do
137
+ raise Informative, "`#{podspec_json_file_name}`不存在" unless File.exist?(podspec_json_file)
138
+ argvs = %W[#{@repo} #{podspec_json_file} --skip-import-validation --use-libraries --allow-warnings --verbose]
139
+
140
+ begin
141
+ push = Pod::Command::Repo::Push.new(CLAide::ARGV.new(argvs))
142
+ push.validate!
143
+ push.run
144
+ rescue Pod::StandardError => e
145
+ raise Informative, "推送podspec:`#{podspec_json_file_name}失败\n#{e.to_s}"
146
+ end
147
+ # 上传完成后,清理工作目录
148
+ FileUtils.rm_f(podspec_json_file) if File.exist?(podspec_json_file)
149
+ FileUtils.rm_r('binary') if File.exist?('binary')
150
+ FileUtils.rm_f(zip_file_name) if File.exist?(zip_file_name)
151
+ end
152
+ end
153
+
154
+ def binary_dir
155
+ File.join(Dir.pwd, 'binary')
156
+ end
157
+
158
+ def podspec_json_file_name
159
+ "#{@name}.podspec.json"
160
+ end
161
+
162
+ def podspec_json_file
163
+ File.join(Dir.pwd, podspec_json_file_name)
164
+ end
165
+
166
+ def podspec
167
+ @spec ||= begin
168
+ "#{@name}.podspec"
169
+ end
170
+ end
171
+
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,69 @@
1
+ require 'cocoapods-meitu-bin/command/bin/init'
2
+ # require 'cocoapods-meitu-bin/command/bin/archive'
3
+ # require 'cocoapods-meitu-bin/command/bin/auto'
4
+ # require 'cocoapods-meitu-bin/command/bin/code'
5
+ # require 'cocoapods-meitu-bin/command/bin/update'
6
+ # require 'cocoapods-meitu-bin/command/bin/install'
7
+ require 'cocoapods-meitu-bin/command/bin/repo'
8
+ require 'cocoapods-meitu-bin/command/bin/spec'
9
+ require 'cocoapods-meitu-bin/command/bin/build_all'
10
+ require 'cocoapods-meitu-bin/command/bin/output_source'
11
+ require 'cocoapods-meitu-bin/command/bin/header_files_specifications'
12
+ require 'cocoapods-meitu-bin/command/bin/upload'
13
+ require 'cocoapods-meitu-bin/command/bin/lock'
14
+ require 'cocoapods-meitu-bin/command/bin/source'
15
+ require 'cocoapods-meitu-bin/helpers'
16
+ require 'cocoapods-meitu-bin/helpers/framework_builder'
17
+
18
+ module Pod
19
+ class Command
20
+ # This is an example of a cocoapods plugin adding a top-level subcommand
21
+ # to the 'pod' command.
22
+ #
23
+ # You can also create subcommands of existing or new commands. Say you
24
+ # wanted to add a subcommand to `list` to show newly deprecated pods,
25
+ # (e.g. `pod list deprecated`), there are a few things that would need
26
+ # to change.
27
+ #
28
+ # - move this file to `lib/pod/command/list/deprecated.rb` and update
29
+ # the class to exist in the the Pod::Command::List namespace
30
+ # - change this class to extend from `List` instead of `Command`. This
31
+ # tells the plugin system that it is a subcommand of `list`.
32
+ # - edit `lib/cocoapods_plugins.rb` to require this file
33
+ #
34
+ # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
35
+ # in the `plugins.json` file, once your plugin is released.
36
+ #
37
+ class Bin < Command
38
+ include CBin::SourcesHelper
39
+ include CBin::SpecFilesHelper
40
+
41
+ self.abstract_command = true
42
+
43
+ # self.default_subcommand = 'open'
44
+ self.summary = '组件二进制化插件'
45
+ # self.description = <<-DESC.strip_heredoc
46
+ # 组件二进制化插件
47
+ #
48
+ # 利用源码私有源与二进制私有源实现对组件依赖类型的切换
49
+ # DESC
50
+
51
+ def initialize(argv)
52
+ # !!! 下面这个require必须放在这里,不能放到文件顶部,切记 !!!
53
+ require 'cocoapods-meitu-bin/native'
54
+
55
+ # @help = argv.flag?('help')
56
+ super
57
+ # @env = argv.option('env') || 'dev'
58
+ # CBin.config.set_configuration_env(@env)
59
+ # msg = "cocoapods-meitu-bin #{CBin::VERSION} 版本 #{@env} 环境"
60
+ # UI.info "\033[44;30m#{msg}\033[0m\n"
61
+ end
62
+
63
+ # def validate!
64
+ # super
65
+ # banner! if @help
66
+ # end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1 @@
1
+ require 'cocoapods-meitu-bin/command/bin'
@@ -0,0 +1,149 @@
1
+ require 'yaml'
2
+ require 'cocoapods-meitu-bin/native/podfile'
3
+ require 'cocoapods-meitu-bin/native/podfile_env'
4
+ require 'cocoapods/generate'
5
+
6
+ module CBin
7
+ class Config
8
+ def config_file
9
+ config_file_with_configuration_env(configuration_env)
10
+ end
11
+
12
+ def template_hash
13
+ {
14
+ 'configuration_env' => { description: '编译环境', default: 'dev', selection: %w[dev debug_iphoneos release_iphoneos] },
15
+ 'binary_repo_url' => { description: '二进制podspec私有源地址', default: 'git@github.com:Zhangyanshen/example-private-spec-bin.git' },
16
+ 'binary_upload_url' => { description: '二进制文件上传地址', default: 'http://localhost:8080/frameworks' },
17
+ 'binary_download_url' => { description: '二进制文件下载地址,后面会依次传入Xcode版本、configuration、组件名称与组件版本', default: 'http://localhost:8080/frameworks' },
18
+ 'download_file_type' => { description: '二进制文件类型', default: 'zip', selection: %w[zip tgz tar tbz txz dmg] }
19
+ }
20
+ end
21
+
22
+ def config_file_with_configuration_env(configuration_env)
23
+ file = config_dev_file
24
+ if configuration_env == "release_iphoneos"
25
+ file = config_release_iphoneos_file
26
+ elsif configuration_env == "debug_iphoneos"
27
+ file = config_debug_iphoneos_file
28
+ elsif configuration_env == "dev"
29
+ file = config_dev_file
30
+ else
31
+ raise "===== #{configuration_env} %w[dev debug_iphoneos release_iphoneos]===="
32
+ end
33
+
34
+ File.expand_path("#{Pod::Config.instance.project_root}/#{file}")
35
+ end
36
+
37
+ def configuration_env
38
+ #如果是dev 再去 podfile的配置文件中获取,确保是正确的, pod update时会用到
39
+ if @configuration_env == "dev" || @configuration_env == nil
40
+ if Pod::Config.instance.podfile
41
+ configuration_env ||= Pod::Config.instance.podfile.configuration_env
42
+ end
43
+ configuration_env ||= "dev"
44
+ @configuration_env = configuration_env
45
+ end
46
+ @configuration_env
47
+ end
48
+
49
+ # 上传二进制的url
50
+ def binary_upload_url_str
51
+ CBin.config.binary_upload_url
52
+ end
53
+
54
+ # 下载二进制的url
55
+ def binary_download_url_str
56
+ CBin.config.binary_download_url
57
+ end
58
+
59
+ def set_configuration_env(env)
60
+ @configuration_env = env
61
+ end
62
+
63
+ #包含arm64 armv7架构,xcodebuild 是Debug模式
64
+ def config_debug_iphoneos_file
65
+ ".bin_debug_iphoneos.yml"
66
+ end
67
+ #包含arm64 armv7架构,xcodebuild 是Release模式
68
+ def config_release_iphoneos_file
69
+ ".bin_release_iphoneos.yml"
70
+ end
71
+ #包含x86 arm64 armv7架构,xcodebuild 是Release模式
72
+ def config_dev_file
73
+ ".bin_dev.yml"
74
+ end
75
+
76
+ # 配置信息写入文件
77
+ def sync_config(config)
78
+ File.open(config_file_with_configuration_env(config['configuration_env']), 'w+') do |f|
79
+ f.write(config.to_yaml)
80
+ end
81
+ end
82
+
83
+ # def sync_config_code_repo_url_list(config)
84
+ # File.open(config_file_with_configuration_env_list(config['code_repo_url_list']), 'w+') do |f|
85
+ # f.write(config.to_yaml)
86
+ # end
87
+ # end
88
+
89
+ def default_config
90
+ @default_config ||= Hash[template_hash.map { |k, v| [k, v[:default]] }]
91
+ end
92
+
93
+ private
94
+
95
+ def load_config
96
+ if File.exist?(config_file)
97
+ YAML.load_file(config_file)
98
+ else
99
+ default_config
100
+ end
101
+ end
102
+
103
+ def config
104
+ @config ||= begin
105
+ @config = OpenStruct.new load_config
106
+ validate!
107
+ @config
108
+ end
109
+ end
110
+
111
+ def validate!
112
+ template_hash.each do |k, v|
113
+ selection = v[:selection]
114
+ next if !selection || selection.empty?
115
+
116
+ config_value = @config.send(k)
117
+ next unless config_value
118
+ unless selection.include?(config_value)
119
+ raise Pod::Informative, "#{k} 字段的值必须限定在可选值 [ #{selection.join(' / ')} ] 内".red
120
+ end
121
+ end
122
+ end
123
+
124
+ def respond_to_missing?(method, include_private = false)
125
+ config.respond_to?(method) || super
126
+ end
127
+
128
+ def method_missing(method, *args, &block)
129
+ if config.respond_to?(method)
130
+ config.send(method, *args)
131
+ elsif template_hash.keys.include?(method.to_s)
132
+ raise Pod::Informative, "#{method} 字段必须在配置文件 #{config_file} 中设置, 请执行 init 命令配置或手动修改配置文件".red
133
+ else
134
+ super
135
+ end
136
+ end
137
+
138
+ public
139
+
140
+ # 判断配置文件是否存在
141
+ def config_file_exist?
142
+ raise Pod::Informative, "当前目录下没有配置文件,请先执行`pod bin init`" unless File.exist?(config_file)
143
+ end
144
+ end
145
+
146
+ def self.config
147
+ @config ||= Config.new
148
+ end
149
+ end
@@ -0,0 +1,57 @@
1
+ require 'yaml'
2
+ require 'cocoapods-meitu-bin/config/config'
3
+
4
+ module CBin
5
+ class Config
6
+ class Asker
7
+ def show_prompt
8
+ print ' > '.green
9
+ end
10
+
11
+ def ask_with_answer(question, pre_answer, selection)
12
+ print "\n#{question}\n"
13
+
14
+ print_selection_info = lambda {
15
+ print "可选值:[ #{selection.join(' / ')} ]\n" if selection
16
+ }
17
+ print_selection_info.call
18
+ print "旧值:#{pre_answer}\n" unless pre_answer.nil?
19
+
20
+ answer = ''
21
+ loop do
22
+ show_prompt
23
+ answer = STDIN.gets.chomp.strip
24
+
25
+ if answer == '' && !pre_answer.nil?
26
+ answer = pre_answer
27
+ print answer.yellow
28
+ print "\n"
29
+ end
30
+
31
+ next if answer.empty?
32
+ break if !selection || selection.include?(answer)
33
+
34
+ print_selection_info.call
35
+ end
36
+
37
+ answer
38
+ end
39
+
40
+ def welcome_message
41
+ print <<~EOF
42
+
43
+ 设置插件配置信息.
44
+ 所有的信息都会保存在 #{CBin.config.config_file} 文件中.
45
+ 你可以在对应目录下手动添加编辑该文件.
46
+ 文件包含的配置信息样式如下:
47
+
48
+ #{CBin.config.default_config.to_yaml}
49
+ EOF
50
+ end
51
+
52
+ def done_message
53
+ print "\n设置完成.\n".green
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,216 @@
1
+ require 'yaml'
2
+
3
+ module CBin
4
+ class Config
5
+ class Builder
6
+
7
+ include Pod
8
+
9
+ def self.instance
10
+ @instance ||= new
11
+ end
12
+
13
+ def initialize
14
+ load_build_config
15
+ # clean
16
+ end
17
+
18
+ # 加载配置项
19
+ def load_build_config
20
+ @white_pod_list = []
21
+ @ignore_git_list = []
22
+ project_root = Pod::Config.instance.project_root
23
+ path = File.join(project_root.to_s, 'BinArchive.json')
24
+
25
+ if File.exist?(path)
26
+ config = JSON.parse(File.read(path))
27
+ @white_pod_list = config['archive-white-pod-list']
28
+ UI.warn "====== archive-white-pod-list = #{@white_pod_list}" if @white_pod_list
29
+ @ignore_git_list = config['ignore-git-list']
30
+ UI.warn "====== ignore_git_list = #{@ignore_git_list}" if @ignore_git_list
31
+ @ignore_http_list = config['ignore-http-list']
32
+
33
+ @xcode_build_name = config['xcode_build_path']
34
+ @root_dir = config['root_dir'] unless config['root_dir'].nil?
35
+ end
36
+
37
+ end
38
+
39
+ def clean
40
+ #清除之前的缓存
41
+ FileUtils.rm_rf(Dir.glob("#{zip_dir}/*")) if File.exist?(zip_dir)
42
+ FileUtils.rm_rf(Dir.glob("#{binary_json_dir}/*")) if File.exist?(binary_json_dir)
43
+ FileUtils.rm_rf(Dir.glob("#{local_psec_dir}/*")) if File.exist?(local_psec_dir)
44
+ end
45
+
46
+ # 制作二进制打包 工程目录
47
+ def gen_name
48
+ 'bin-archive'
49
+ end
50
+
51
+ # 制作二进制打包 工程目录
52
+ def gen_dir
53
+ @gen_dir ||= begin
54
+ dir = File.join(root_dir,gen_name)
55
+ Dir.mkdir(dir) unless File.exist?dir
56
+ Pathname.new(dir)
57
+ end
58
+ end
59
+
60
+
61
+ def framework_name(spec)
62
+ "#{spec.module_name}.framework"
63
+ end
64
+
65
+ def framework_name_version(spec)
66
+ "#{spec.module_name}.framework_#{spec.version}"
67
+ end
68
+
69
+ def framework_zip_file(spec)
70
+ File.join(zip_dir_name, framework_name_version(spec))
71
+ end
72
+
73
+ def framework_file(spec)
74
+ File.join(zip_dir_name, framework_name(spec))
75
+ end
76
+
77
+ def library_name(spec)
78
+ library_name_version(spec.name, spec.version)
79
+ end
80
+
81
+ def library_name_version(name,version)
82
+ "bin_#{name}_#{version}"
83
+ end
84
+ def library_file(spec)
85
+ File.join(zip_dir_name, library_name(spec))
86
+ end
87
+
88
+ def zip_dir_name
89
+ "bin-zip"
90
+ end
91
+
92
+ def zip_dir
93
+ @zip_dir ||= begin
94
+ dir = File.join(root_dir,zip_dir_name)
95
+ Dir.mkdir(dir) unless File.exist?dir
96
+ Pathname.new(dir)
97
+ end
98
+ end
99
+
100
+ #本地
101
+ def local_spec_dir_name
102
+ "bin-spec"
103
+ end
104
+
105
+ def local_psec_dir
106
+ @local_psec_dir ||= begin
107
+ dir = File.join(root_dir,local_spec_dir_name)
108
+ Dir.mkdir(dir) unless File.exist?dir
109
+ Pathname.new(dir)
110
+ end
111
+ end
112
+
113
+ def binary_json_dir_name
114
+ "bin-json"
115
+ end
116
+
117
+ def binary_json_dir
118
+ @binary_json_dir ||= begin
119
+ dir = File.join(root_dir,binary_json_dir_name)
120
+ Dir.mkdir(dir) unless File.exist?dir
121
+ Pathname.new(dir)
122
+ end
123
+ end
124
+
125
+
126
+
127
+ #编译target名,如 seeyou
128
+ def target_name
129
+ @target_name ||= begin
130
+ target_name_str = Pod::Config.instance.podfile.root_target_definitions.first.children.first.to_s
131
+ target_name_str[5,target_name_str.length]
132
+ end
133
+ end
134
+
135
+ #编译缓存文件目录,如Xcodebuild的编译缓存目录
136
+ # 如果有配置, 配置完整路径,会使用
137
+ def xcode_build_name
138
+ @xcode_build_name ||= begin
139
+ project_root = Pod::Config.instance.project_root
140
+ path = File.join(project_root.to_s, 'BinArchive.json')
141
+
142
+ if File.exist?(path)
143
+ config = JSON.parse(File.read(path))
144
+ @xcode_build_name = config['xcode_build_path']
145
+ end
146
+ #默认值,在美柚上使用默认
147
+ if @xcode_build_name.nil? || Dir.exist?(@xcode_build_name)
148
+ @xcode_build_name = "xcode-build/Build/Intermediates.noindex/ArchiveIntermediates/#{target_name}/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/"
149
+ end
150
+ puts @xcode_build_name
151
+ @xcode_build_name
152
+ end
153
+ end
154
+
155
+
156
+ #完整的xcodebuild 输出路径
157
+ def xcode_build_dir
158
+ @xcode_build_dir ||= begin
159
+ temp_xcode_build_name = xcode_build_name
160
+ if File.exist?(temp_xcode_build_name)
161
+ Pathname.new(temp_xcode_build_name)
162
+ else
163
+ dir = File.join(root_dir,xcode_build_name)
164
+ Pathname.new(dir)
165
+ end
166
+ end
167
+ end
168
+ #完整的xcodebuild BuildProductsPath输出路径,
169
+ def xcode_BuildProductsPath_dir
170
+ @xcode_BuildProductsPath_dir ||= begin
171
+ temp_xcode_BuildProductsPath_dir = "xcode-build/Build/Intermediates.noindex/ArchiveIntermediates/#{target_name}/BuildProductsPath/"
172
+ full_path = File.join(root_dir, temp_xcode_BuildProductsPath_dir)
173
+
174
+ if (File.exist?(full_path))
175
+ Dir.chdir(full_path) do
176
+ iphoneos = Dir.glob('*-iphoneos')
177
+ if iphoneos.length > 0
178
+ full_path = File.join(full_path,iphoneos.first)
179
+ else
180
+ UI.warn "====== 找不到 *-iphoneos @xcode_BuildProductsPath_dir = #{@xcode_BuildProductsPath_dir}"
181
+ end
182
+ end
183
+ end
184
+ Pathname.new(full_path)
185
+ end
186
+ end
187
+
188
+
189
+ #处理编译产物后存储根目录,会存放spec、 json、zip的父目录,默认是工程的同级目录下,"#{basename}-build-temp"
190
+ def root_dir
191
+ @root_dir ||= begin
192
+ basename = File.basename(Pod::Config.instance.installation_root)
193
+ parent_dir = File.dirname(Pod::Config.instance.installation_root)
194
+ root_name = File.join(parent_dir,"#{basename}-build-temp")
195
+ Dir.mkdir(root_name) unless File.exist?root_name
196
+ Pathname.new(root_name)
197
+ end
198
+
199
+ end
200
+
201
+ #制作二进制 白名单
202
+ def white_pod_list
203
+ @white_pod_list
204
+ end
205
+ #忽略制作二进制组件的 git
206
+ def ignore_git_list
207
+ @ignore_git_list
208
+ end
209
+
210
+ def ignore_http_list
211
+ @ignore_http_list
212
+ end
213
+
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,9 @@
1
+ module CBin
2
+ VERSION = "1.0.0"
3
+ end
4
+
5
+ module Pod
6
+ def self.match_version?(*version)
7
+ Gem::Dependency.new('', *version).match?('', Pod::VERSION)
8
+ end
9
+ end