cocoapods-bb-bin 0.1.0

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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +19 -0
  3. data/README.md +68 -0
  4. data/lib/cocoapods-bb-bin/command/bin/archive.rb +234 -0
  5. data/lib/cocoapods-bb-bin/command/bin/auto.rb +226 -0
  6. data/lib/cocoapods-bb-bin/command/bin/code.rb +295 -0
  7. data/lib/cocoapods-bb-bin/command/bin/dup.rb +78 -0
  8. data/lib/cocoapods-bb-bin/command/bin/imy.rb +46 -0
  9. data/lib/cocoapods-bb-bin/command/bin/init.rb +69 -0
  10. data/lib/cocoapods-bb-bin/command/bin/initHotKey.rb +70 -0
  11. data/lib/cocoapods-bb-bin/command/bin/install.rb +44 -0
  12. data/lib/cocoapods-bb-bin/command/bin/lib/lint.rb +69 -0
  13. data/lib/cocoapods-bb-bin/command/bin/repo/update.rb +43 -0
  14. data/lib/cocoapods-bb-bin/command/bin/spec/create.rb +73 -0
  15. data/lib/cocoapods-bb-bin/command/bin/spec/push.rb +114 -0
  16. data/lib/cocoapods-bb-bin/command/bin/update.rb +154 -0
  17. data/lib/cocoapods-bb-bin/command/bin.rb +59 -0
  18. data/lib/cocoapods-bb-bin/command.rb +2 -0
  19. data/lib/cocoapods-bb-bin/config/config.rb +136 -0
  20. data/lib/cocoapods-bb-bin/config/config_asker.rb +57 -0
  21. data/lib/cocoapods-bb-bin/config/config_builder.rb +234 -0
  22. data/lib/cocoapods-bb-bin/config/config_hot_key.rb +102 -0
  23. data/lib/cocoapods-bb-bin/config/config_hot_key_asker.rb +57 -0
  24. data/lib/cocoapods-bb-bin/gem_version.rb +10 -0
  25. data/lib/cocoapods-bb-bin/helpers/Info.plist +0 -0
  26. data/lib/cocoapods-bb-bin/helpers/build_helper.rb +217 -0
  27. data/lib/cocoapods-bb-bin/helpers/build_utils.rb +63 -0
  28. data/lib/cocoapods-bb-bin/helpers/framework.rb +85 -0
  29. data/lib/cocoapods-bb-bin/helpers/framework_builder.rb +446 -0
  30. data/lib/cocoapods-bb-bin/helpers/library.rb +54 -0
  31. data/lib/cocoapods-bb-bin/helpers/library_builder.rb +90 -0
  32. data/lib/cocoapods-bb-bin/helpers/sources_helper.rb +36 -0
  33. data/lib/cocoapods-bb-bin/helpers/spec_creator.rb +170 -0
  34. data/lib/cocoapods-bb-bin/helpers/spec_files_helper.rb +77 -0
  35. data/lib/cocoapods-bb-bin/helpers/spec_source_creator.rb +227 -0
  36. data/lib/cocoapods-bb-bin/helpers/upload_helper.rb +96 -0
  37. data/lib/cocoapods-bb-bin/helpers/xcframework_builder.rb +77 -0
  38. data/lib/cocoapods-bb-bin/helpers.rb +5 -0
  39. data/lib/cocoapods-bb-bin/native/acknowledgements.rb +27 -0
  40. data/lib/cocoapods-bb-bin/native/analyzer.rb +55 -0
  41. data/lib/cocoapods-bb-bin/native/file_accessor.rb +28 -0
  42. data/lib/cocoapods-bb-bin/native/installation_options.rb +25 -0
  43. data/lib/cocoapods-bb-bin/native/installer.rb +135 -0
  44. data/lib/cocoapods-bb-bin/native/linter.rb +26 -0
  45. data/lib/cocoapods-bb-bin/native/path_source.rb +33 -0
  46. data/lib/cocoapods-bb-bin/native/pod_source_installer.rb +19 -0
  47. data/lib/cocoapods-bb-bin/native/pod_target_installer.rb +94 -0
  48. data/lib/cocoapods-bb-bin/native/podfile.rb +91 -0
  49. data/lib/cocoapods-bb-bin/native/podfile_env.rb +37 -0
  50. data/lib/cocoapods-bb-bin/native/podfile_generator.rb +199 -0
  51. data/lib/cocoapods-bb-bin/native/podspec_finder.rb +25 -0
  52. data/lib/cocoapods-bb-bin/native/resolver.rb +230 -0
  53. data/lib/cocoapods-bb-bin/native/sandbox_analyzer.rb +34 -0
  54. data/lib/cocoapods-bb-bin/native/source.rb +35 -0
  55. data/lib/cocoapods-bb-bin/native/sources_manager.rb +20 -0
  56. data/lib/cocoapods-bb-bin/native/specification.rb +31 -0
  57. data/lib/cocoapods-bb-bin/native/target_validator.rb +41 -0
  58. data/lib/cocoapods-bb-bin/native/validator.rb +40 -0
  59. data/lib/cocoapods-bb-bin/native.rb +23 -0
  60. data/lib/cocoapods-bb-bin/source_provider_hook.rb +66 -0
  61. data/lib/cocoapods-bb-bin.rb +2 -0
  62. data/lib/cocoapods_plugin.rb +3 -0
  63. data/spec/command/bin_spec.rb +12 -0
  64. data/spec/spec_helper.rb +51 -0
  65. metadata +200 -0
@@ -0,0 +1,43 @@
1
+ require 'parallel'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Repo < Bin
7
+ class Update < Repo
8
+ self.summary = '更新私有源'
9
+
10
+ self.arguments = [
11
+ CLAide::Argument.new('NAME', false)
12
+ ]
13
+
14
+ def self.options
15
+ [
16
+ ['--all', '更新所有私有源,默认只更新二进制相关私有源']
17
+ ].concat(super)
18
+ end
19
+
20
+ def initialize(argv)
21
+ @all = argv.flag?('all')
22
+ @name = argv.shift_argument
23
+ super
24
+ end
25
+
26
+ def run
27
+ show_output = !config.silent?
28
+ if @name || @all
29
+ config.sources_manager.update(@name, show_output)
30
+ else
31
+ Parallel.each(valid_sources, in_threads: 4) do |source|
32
+ UI.puts "更新私有源仓库 #{source.to_s}".yellow
33
+ source.update(show_output)
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,73 @@
1
+ require 'cocoapods-bb-bin/helpers'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Spec < Bin
7
+ class Create < Spec
8
+ self.summary = '创建二进制 spec.'
9
+ self.description = <<-DESC
10
+ 根据源码 podspec 文件,创建对应的二进制 podspec 文件.
11
+ DESC
12
+
13
+ def self.options
14
+ [
15
+ ['--platforms=ios', '生成二进制 spec 支持的平台'],
16
+ ['--template-podspec=A.binary-template.podspec', '生成拥有 subspec 的二进制 spec 需要的模版 podspec, 插件会更改 version 和 source'],
17
+ ['--no-overwrite', '不允许覆盖']
18
+ ].concat(super)
19
+ end
20
+
21
+ def initialize(argv)
22
+ @platforms = argv.option('platforms', 'ios')
23
+ @allow_overwrite = argv.flag?('overwrite', true)
24
+ @template_podspec = argv.option('template-podspec')
25
+ @podspec = argv.shift_argument
26
+ super
27
+ end
28
+
29
+ def run
30
+ UI.puts "开始读取 podspec 文件...\n"
31
+
32
+ code_spec = Pod::Specification.from_file(spec_file)
33
+ if template_spec_file
34
+ template_spec = Pod::Specification.from_file(template_spec_file)
35
+ end
36
+
37
+ if binary_spec && !@allow_overwrite
38
+ UI.warn "二进制 podspec 文件 #{binary_spec_files.first} 已存在.\n"
39
+ else
40
+ UI.puts "开始生成二进制 podspec 文件...\n"
41
+ spec_file = create_binary_spec_file(code_spec, template_spec)
42
+ UI.puts "创建二进制 podspec 文件 #{spec_file} 成功.\n".green
43
+ end
44
+ end
45
+
46
+ def template_spec_file
47
+ @template_spec_file ||= begin
48
+ if @template_podspec
49
+ find_spec_file(@template_podspec)
50
+ else
51
+ binary_template_spec_file
52
+ end
53
+ end
54
+ end
55
+
56
+ def spec_file
57
+ @spec_file ||= begin
58
+ if @podspec
59
+ find_spec_file(@podspec)
60
+ else
61
+ if code_spec_files.empty?
62
+ raise Informative, '当前目录下没有找到可用源码 podspec.'
63
+ end
64
+
65
+ code_spec_files.first
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,114 @@
1
+ require 'cocoapods-bb-bin/config/config'
2
+ require 'cocoapods-bb-bin/native/podfile'
3
+
4
+ module Pod
5
+ class Command
6
+ class Bin < Command
7
+ class Repo < Bin
8
+ class Push < Repo
9
+ self.summary = '发布组件.'
10
+ self.description = <<-DESC
11
+ 发布二进制组件 / 源码组件
12
+ DESC
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('NAME.podspec', false)
16
+ ]
17
+
18
+ def self.options
19
+ [
20
+ ['--binary', '发布组件的二进制版本'],
21
+ ['--template-podspec=A.binary-template.podspec', '生成拥有 subspec 的二进制 spec 需要的模版 podspec, 插件会更改 version 和 source'],
22
+ ['--reserve-created-spec', '保留生成的二进制 spec 文件'],
23
+ ['--code-dependencies', '使用源码依赖进行 lint'],
24
+ ['--loose-options', '添加宽松的 options, 包括 --use-libraries (可能会造成 entry point (start) undefined)'],
25
+ ['--allow-prerelease', '允许使用 prerelease 的版本 lint']
26
+ ].concat(Pod::Command::Repo::Push.options).concat(super).uniq
27
+ end
28
+
29
+ def initialize(argv)
30
+ @podspec = argv.shift_argument
31
+ @binary = argv.flag?('binary')
32
+ @loose_options = argv.flag?('loose-options')
33
+ @code_dependencies = argv.flag?('code-dependencies')
34
+ @sources = argv.option('sources') || []
35
+ @reserve_created_spec = argv.flag?('reserve-created-spec')
36
+ @template_podspec = argv.option('template-podspec')
37
+ @allow_prerelease = argv.flag?('allow-prerelease')
38
+ super
39
+
40
+ @additional_args = argv.remainder!
41
+ end
42
+
43
+ def run
44
+ Podfile.execute_with_bin_plugin do
45
+ Podfile.execute_with_allow_prerelease(@allow_prerelease) do
46
+ Podfile.execute_with_use_binaries(!@code_dependencies) do
47
+ argvs = [
48
+ repo,
49
+ "--sources=#{sources_option(@code_dependencies, @sources)}",
50
+ *@additional_args
51
+ ]
52
+
53
+ argvs << spec_file if spec_file
54
+
55
+ if @loose_options
56
+ argvs += ['--allow-warnings', '--use-json']
57
+ if code_spec&.all_dependencies&.any?
58
+ argvs << '--use-libraries'
59
+ end
60
+ end
61
+
62
+ push = Pod::Command::Repo::Push.new(CLAide::ARGV.new(argvs))
63
+ push.validate!
64
+ push.run
65
+ end
66
+ end
67
+ end
68
+ ensure
69
+ clear_binary_spec_file_if_needed unless @reserve_created_spec
70
+ end
71
+
72
+ private
73
+
74
+ def template_spec_file
75
+ @template_spec_file ||= begin
76
+ if @template_podspec
77
+ find_spec_file(@template_podspec)
78
+ else
79
+ binary_template_spec_file
80
+ end
81
+ end
82
+ end
83
+
84
+ def spec_file
85
+ @spec_file ||= begin
86
+ if @podspec
87
+ find_spec_file(@podspec)
88
+ else
89
+ if code_spec_files.empty?
90
+ raise Informative, '当前目录下没有找到可用源码 podspec.'
91
+ end
92
+
93
+ spec_file = if @binary
94
+ code_spec = Pod::Specification.from_file(code_spec_files.first)
95
+ if template_spec_file
96
+ template_spec = Pod::Specification.from_file(template_spec_file)
97
+ end
98
+ create_binary_spec_file(code_spec, template_spec)
99
+ else
100
+ code_spec_files.first
101
+ end
102
+ spec_file
103
+ end
104
+ end
105
+ end
106
+
107
+ def repo
108
+ @binary ? binary_source.name : code_source.name
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,154 @@
1
+
2
+ require 'cocoapods'
3
+ require 'cocoapods-bb-bin/native/podfile_env'
4
+ require 'cocoapods-bb-bin/native/podfile'
5
+
6
+ module Pod
7
+ class Command
8
+ class Bin < Command
9
+ class Update < Bin
10
+ include Pod
11
+ include Pod::Podfile::DSL
12
+
13
+ self.summary = 'pod update 拦截器,会加载本地Podfile_local文件,DSL加载到原始Podfile文件中。'
14
+
15
+ self.description = <<-DESC
16
+ pod update 拦截器,会加载本地Podfile_local文件
17
+ 会通过DSL加载到原始Podfile文件中
18
+ 支持 pod 'xxx' 各种写法
19
+ 支持 post_install/pre_install钩子,采用覆盖做法
20
+ DESC
21
+ def self.options
22
+ [
23
+ ["--sources=#{Pod::TrunkSource::TRUNK_REPO_URL}", 'The sources from which to update dependent pods. ' \
24
+ 'Multiple sources must be comma-delimited'],
25
+ ['--exclude-pods=podName', 'Pods to exclude during update. Multiple pods must be comma-delimited'],
26
+ ['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
27
+ 'applies to projects that have enabled incremental installation'],
28
+ ['--project-directory=/project/dir/', 'The path to the root of the project directory'],
29
+ ['--no-repo-update', 'Skip running `pod repo update` before install']
30
+ ].concat(super)
31
+ end
32
+
33
+ def initialize(argv)
34
+ @update = argv.flag?('update')
35
+ super
36
+ @additional_args = argv.remainder!
37
+ end
38
+
39
+ def run
40
+ Update.load_local_podfile
41
+
42
+ argvs = [
43
+ *@additional_args
44
+ ]
45
+
46
+ gen = Pod::Command::Update.new(CLAide::ARGV.new(argvs))
47
+ gen.validate!
48
+ gen.run
49
+ end
50
+
51
+ def self.load_local_podfile
52
+ # 同步 Podfile_local 文件
53
+ project_root = Pod::Config.instance.project_root
54
+ path = File.join(project_root.to_s, 'Podfile_local')
55
+ unless File.exist?(path)
56
+ path = File.join(project_root.to_s, 'Podfile_local')
57
+ end
58
+
59
+ if File.exist?(path)
60
+ contents = File.open(path, 'r:utf-8', &:read)
61
+
62
+ podfile = Pod::Config.instance.podfile
63
+ local_podfile = Podfile.from_file(path)
64
+
65
+ if local_podfile
66
+ local_pre_install_callback = nil
67
+ local_post_install_callback = nil
68
+ local_podfile.instance_eval do
69
+ local_pre_install_callback = @pre_install_callback
70
+ local_post_install_callback = @post_install_callback
71
+ end
72
+ end
73
+
74
+ podfile.instance_eval do
75
+ begin
76
+
77
+ # podfile HASH_KEYS才有plugins字段,否则会被限制
78
+ if local_podfile.plugins.any?
79
+ hash_plugins = podfile.plugins || {}
80
+ hash_plugins = hash_plugins.merge(local_podfile.plugins)
81
+ set_hash_value(%w[plugins].first, hash_plugins)
82
+
83
+ # 加入源码白名单,避免本地库被二进制了
84
+ podfile.set_use_source_pods(local_podfile.use_source_pods) if local_podfile.use_source_pods
85
+ podfile.use_binaries!(local_podfile.use_binaries?)
86
+ end
87
+
88
+ # 在target把local-target中到dependencies值删除了,再设置
89
+ # 把本地和原始到dependencies 合并,设置dependencies
90
+ local_podfile&.target_definition_list&.each do |local_target|
91
+ next if local_target.name == 'Pods'
92
+
93
+ target_definition_list.each do |target|
94
+
95
+ unless target.name == local_target.name &&
96
+ (local_target.to_hash['dependencies'] &&local_target.to_hash['dependencies'].any?)
97
+ next
98
+ end
99
+
100
+
101
+
102
+ target.instance_exec do
103
+ # 在target把local-target中到dependencies值删除了,再设置
104
+
105
+ local_dependencies = local_target.to_hash['dependencies']
106
+ target_dependencies = target.to_hash['dependencies']
107
+
108
+ local_dependencies.each do |local_dependency|
109
+ unless local_dependency.is_a?(Hash) && local_dependency.keys.first
110
+ next
111
+ end
112
+
113
+ target_dependencies.each do |target_dependency|
114
+ next unless target_dependency.is_a?(Hash) &&
115
+ target_dependency.keys.first &&
116
+ target_dependency.keys.first == local_dependency.keys.first
117
+
118
+ target_dependencies.delete target_dependency
119
+ break
120
+ end
121
+ end
122
+ # 把本地和原始到dependencies 合并,设置dependencies
123
+ local_dependencies.each do |d|
124
+ UI.message "Development Pod #{d.to_yaml}"
125
+ if podfile.plugins.keys.include?('cocoapods-bb-bin')
126
+ podfile.set_use_source_pods(d.keys.first) if (d.is_a?(Hash) && d.keys.first)
127
+ end
128
+ end
129
+ new_dependencies = target_dependencies + local_dependencies
130
+ set_hash_value(%w[dependencies].first, new_dependencies)
131
+
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ if local_pre_install_callback
138
+ @pre_install_callback = local_pre_install_callback
139
+ end
140
+ if local_post_install_callback
141
+ @post_install_callback = local_post_install_callback
142
+ end
143
+ rescue Exception => e
144
+ message = "Invalid `#{path}` file: #{e.message}"
145
+ raise Pod::DSLError.new(message, path, e, contents)
146
+ end
147
+ end
148
+
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,59 @@
1
+
2
+ require 'cocoapods-bb-bin/command/bin/initHotKey'
3
+ require 'cocoapods-bb-bin/command/bin/init'
4
+ require 'cocoapods-bb-bin/command/bin/archive'
5
+ require 'cocoapods-bb-bin/command/bin/auto'
6
+ require 'cocoapods-bb-bin/command/bin/code'
7
+ require 'cocoapods-bb-bin/command/bin/update'
8
+ require 'cocoapods-bb-bin/command/bin/install'
9
+ require 'cocoapods-bb-bin/command/bin/imy'
10
+
11
+ require 'cocoapods-bb-bin/helpers'
12
+
13
+ module Pod
14
+ class Command
15
+ # This is an example of a cocoapods plugin adding a top-level subcommand
16
+ # to the 'pod' command.
17
+ #
18
+ # You can also create subcommands of existing or new commands. Say you
19
+ # wanted to add a subcommand to `list` to show newly deprecated pods,
20
+ # (e.g. `pod list deprecated`), there are a few things that would need
21
+ # to change.
22
+ #
23
+ # - move this file to `lib/pod/command/list/deprecated.rb` and update
24
+ # the class to exist in the the Pod::Command::List namespace
25
+ # - change this class to extend from `List` instead of `Command`. This
26
+ # tells the plugin system that it is a subcommand of `list`.
27
+ # - edit `lib/cocoapods_plugins.rb` to require this file
28
+ #
29
+ # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
30
+ # in the `plugins.json` file, once your plugin is released.
31
+ #
32
+ class Bin < Command
33
+ include CBin::SourcesHelper
34
+ include CBin::SpecFilesHelper
35
+
36
+ self.abstract_command = true
37
+
38
+ self.default_subcommand = 'open'
39
+ self.summary = '组件二进制化插件.'
40
+ self.description = <<-DESC
41
+ 组件二进制化插件。利用源码私有源与二进制私有源实现对组件依赖类型的切换。
42
+ DESC
43
+
44
+ def initialize(argv)
45
+ require 'cocoapods-bb-bin/native'
46
+
47
+ @help = argv.flag?('help')
48
+ super
49
+ end
50
+
51
+ def validate!
52
+ super
53
+ # 这里由于 --help 是在 validate! 方法中提取的,会导致 --help 失效
54
+ # pod lib create 也有这个问题
55
+ banner! if @help
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,2 @@
1
+
2
+ require 'cocoapods-bb-bin/command/bin'
@@ -0,0 +1,136 @@
1
+ require 'yaml'
2
+ require 'cocoapods-bb-bin/native/podfile'
3
+ require 'cocoapods-bb-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
+ 'code_repo_url' => { description: '源码私有源 Git 地址', default: 'https://github.com/CocoaPods/Specs.git' },
16
+ 'binary_repo_url' => { description: '二进制私有源 Git 地址', default: 'https://github.com/CocoaPods/Specs.git' },
17
+ 'binary_download_url' => { description: '二进制下载地址,内部会依次传入组件名称与版本,替换字符串中的 %s ', default: 'http://localhost:8080/frameworks/%s/%s/zip' },
18
+ # 'binary_type' => { description: '二进制打包类型', default: 'framework', selection: %w[framework library] },
19
+ 'download_file_type' => { description: '下载二进制文件类型', default: 'zip', selection: %w[zip tgz tar tbz txz dmg] }
20
+ }
21
+ end
22
+
23
+ def config_file_with_configuration_env(configuration_env)
24
+ file = config_dev_file
25
+ if configuration_env == "release_iphoneos"
26
+ file = config_release_iphoneos_file
27
+ puts "\n====== #{configuration_env} 环境 ========"
28
+ elsif configuration_env == "debug_iphoneos"
29
+ file = config_debug_iphoneos_file
30
+ puts "\n====== #{configuration_env} 环境 ========"
31
+ elsif configuration_env == "dev"
32
+ puts "\n====== #{configuration_env} 环境 ========"
33
+ else
34
+ raise "\n===== #{configuration_env} 参数有误,请检查%w[dev debug_iphoneos release_iphoneos]===="
35
+ end
36
+
37
+ File.expand_path("#{Pod::Config.instance.home_dir}/#{file}")
38
+ end
39
+
40
+ def configuration_env
41
+ #如果是dev 再去 podfile的配置文件中获取,确保是正确的, pod update时会用到
42
+ if @configuration_env == "dev" || @configuration_env == nil
43
+ if Pod::Config.instance.podfile
44
+ configuration_env ||= Pod::Config.instance.podfile.configuration_env
45
+ end
46
+ configuration_env ||= "dev"
47
+ @configuration_env = configuration_env
48
+ end
49
+ @configuration_env
50
+ end
51
+
52
+ #上传的url
53
+ def binary_upload_url
54
+ cut_string = "/%s/%s/zip"
55
+ binary_download_url[0,binary_download_url.length - cut_string.length]
56
+ end
57
+
58
+ def set_configuration_env(env)
59
+ @configuration_env = env
60
+ end
61
+
62
+ #包含arm64 armv7架构,xcodebuild 是Debug模式
63
+ def config_debug_iphoneos_file
64
+ "bin_debug_iphoneos.yml"
65
+ end
66
+ #包含arm64 armv7架构,xcodebuild 是Release模式
67
+ def config_release_iphoneos_file
68
+ "bin_release_iphoneos.yml"
69
+ end
70
+ #包含x86 arm64 armv7架构,xcodebuild 是Release模式
71
+ def config_dev_file
72
+ "bin_dev.yml"
73
+ end
74
+
75
+ def sync_config(config)
76
+ File.open(config_file_with_configuration_env(config['configuration_env']), 'w+') do |f|
77
+ f.write(config.to_yaml)
78
+ end
79
+ end
80
+
81
+ def default_config
82
+ @default_config ||= Hash[template_hash.map { |k, v| [k, v[:default]] }]
83
+ end
84
+
85
+ private
86
+
87
+ def load_config
88
+ if File.exist?(config_file)
89
+ YAML.load_file(config_file)
90
+ else
91
+ default_config
92
+ end
93
+ end
94
+
95
+ def config
96
+ @config ||= begin
97
+ @config = OpenStruct.new load_config
98
+ validate!
99
+ @config
100
+ end
101
+ end
102
+
103
+ def validate!
104
+ template_hash.each do |k, v|
105
+ selection = v[:selection]
106
+ next if !selection || selection.empty?
107
+
108
+ config_value = @config.send(k)
109
+ next unless config_value
110
+ unless selection.include?(config_value)
111
+ raise Pod::Informative, "#{k} 字段的值必须限定在可选值 [ #{selection.join(' / ')} ] 内".red
112
+ end
113
+ end
114
+ end
115
+
116
+ def respond_to_missing?(method, include_private = false)
117
+ config.respond_to?(method) || super
118
+ end
119
+
120
+ def method_missing(method, *args, &block)
121
+ if config.respond_to?(method)
122
+ config.send(method, *args)
123
+ elsif template_hash.keys.include?(method.to_s)
124
+ raise Pod::Informative, "#{method} 字段必须在配置文件 #{config_file} 中设置, 请执行 init 命令配置或手动修改配置文件".red
125
+ else
126
+ super
127
+ end
128
+ end
129
+ end
130
+
131
+ def self.config
132
+ @config ||= Config.new
133
+ end
134
+
135
+
136
+ end
@@ -0,0 +1,57 @@
1
+ require 'yaml'
2
+ require 'cocoapods-bb-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 wellcome_message
41
+ print <<~EOF
42
+
43
+ 开始设置二进制化初始信息.
44
+ 所有的信息都会保存在 #{CBin.config.config_file} 文件中.
45
+ %w[bin_dev.yml bin_debug_iphoneos.yml bin_release_iphoneos.yml]
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