cocoapods-bb-bin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,295 @@
1
+ require 'fileutils'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Code < Bin
7
+ self.summary = '通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。'
8
+
9
+ self.description = <<-DESC
10
+ 通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。
11
+ 在不删除二进制的情况下为某个组件添加源码调试能力,多个组件名称用空格分隔
12
+ DESC
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('NAME', false)
16
+ ]
17
+ def self.options
18
+ [
19
+ ['--all-clean', '删除所有已经下载的源码'],
20
+ ['--clean', '删除所有指定下载的源码'],
21
+ ['--list', '展示所有一级下载的源码以及其大小'],
22
+ ['--source', '源码路径,本地路径,会去自动链接本地源码'],
23
+ ['--simulator', '是否模拟器架构,xcframework需要'],# 是否模拟器,默认NO,xcframework需要使用
24
+ ]
25
+ end
26
+
27
+ def initialize(argv)
28
+ @codeSource = argv.option('source') || nil
29
+ @names = argv.arguments! unless argv.arguments.empty?
30
+ @list = argv.flag?('list', false )
31
+ @all_clean = argv.flag?('all-clean', false )
32
+ @clean = argv.flag?('clean', false )
33
+ @simulator = argv.flag?('simulator', false )
34
+
35
+ @config = Pod::Config.instance
36
+
37
+ super
38
+ end
39
+
40
+
41
+ def run
42
+
43
+ podfile_lock = File.join(Pathname.pwd,"Podfile.lock")
44
+ raise "podfile.lock,不存在,请先pod install/update" unless File.exist?(podfile_lock)
45
+ @lockfile ||= Lockfile.from_file(Pathname.new(podfile_lock) )
46
+
47
+ if @list
48
+ list
49
+ elsif @clean
50
+ clean
51
+ elsif @all_clean
52
+ all_clean
53
+ elsif @names
54
+ add
55
+ end
56
+
57
+ if @list && @clean && @names
58
+ raise "请选择您要执行的命令。"
59
+ end
60
+ end
61
+
62
+ #==========================begin add ==============
63
+
64
+ def add
65
+ if @names == nil
66
+ raise "请输入要调试组件名,多个组件名称用空格分隔"
67
+ end
68
+
69
+ @names.each do |name|
70
+ lib_file = get_lib_path(name)
71
+ unless File.exist?(lib_file)
72
+ raise "找不到 #{lib_file}"
73
+ end
74
+ UI.puts "#{lib_file}"
75
+
76
+ target_path = @codeSource || download_source(name)
77
+ puts "====add lib_file: #{lib_file} target_path: #{target_path} name: #{name}"
78
+ link(lib_file,target_path,name)
79
+ end
80
+ end
81
+
82
+ #下载源码到本地
83
+ def download_source(name)
84
+ target_path = File.join(source_root, name)
85
+ UI.puts target_path
86
+ FileUtils.rm_rf(target_path)
87
+
88
+ find_dependency = find_dependency(name)
89
+
90
+ spec = fetch_external_source(find_dependency, @config.podfile,@config.lockfile, @config.sandbox,true )
91
+
92
+ download_request = Pod::Downloader::Request.new(:name => name, :spec => spec)
93
+ Downloader.download(download_request, Pathname.new(target_path), :can_cache => true)
94
+
95
+ target_path
96
+ end
97
+
98
+ #找出依赖
99
+ def find_dependency (name)
100
+ find_dependency = nil
101
+ @config.podfile.dependencies.each do |dependency|
102
+ if dependency.root_name.downcase == name.downcase
103
+ find_dependency = dependency
104
+ break
105
+ end
106
+ end
107
+ find_dependency
108
+ end
109
+
110
+ # 获取external_source 下的仓库
111
+ # @return spec
112
+ def fetch_external_source(dependency ,podfile , lockfile, sandbox,use_lockfile_options)
113
+ source = ExternalSources.from_dependency(dependency, podfile.defined_in_file, true)
114
+ source.fetch(sandbox)
115
+ end
116
+
117
+
118
+ #==========================link begin ==============
119
+
120
+ #链接,.a文件位置, 源码目录,工程名=IMYFoundation
121
+ def link(lib_file,target_path,basename)
122
+ print <<EOF
123
+ link 源码
124
+ `dwarfdump "#{lib_file}" | grep "AT_comp_dir" | head -1 | cut -d \\" -f2 `
125
+ EOF
126
+ dir = (`dwarfdump "#{lib_file}" | grep "AT_comp_dir" | head -1 | cut -d \\" -f2 `)
127
+ UI.puts "dwarfdump dir = #{dir}"
128
+ # if Pathname.new(lib_file).extname == ".a"
129
+ # sub_path = "#{basename}/bin-archive/#{basename}"
130
+ # else
131
+ # sub_path = "#{basename}"
132
+ # end
133
+ sub_path = "#{basename}/bin-archive/#{basename}"
134
+ dir = dir.gsub(sub_path, "").chomp
135
+ UI.puts "Binary dir = #{dir}"
136
+
137
+ unless File.exist?(dir)
138
+ # UI.puts "不存在 = #{dir}"
139
+ begin
140
+ FileUtils.mkdir_p(dir) unless File.exists?(dir) # require 'fileutils'
141
+ rescue SystemCallError
142
+ # mkdir: _fzzfm3x4y17bm6psx9yhbs00000gn: Permission denied
143
+ unless File.exist?(dir)
144
+ user_name_array = Dir.home.split('/') # Dir.home = /Users/xx,xx表示当前用户名称
145
+ user_name = "501"
146
+ user_name_array.each do |name|
147
+ user_name = name
148
+ end
149
+ UI.puts "user_name = #{user_name}".yellow
150
+ `sudo mkdir -p #{dir} && sudo chown -R #{user_name}:wheel #{dir}`
151
+ end
152
+ #判断用户目录是否存在
153
+ array = dir.split('/')
154
+ if array.length > 5
155
+ root_path = '/' + array[1] + '/' + array[2] + '/' + array[3] + '/' + array[4]
156
+ UI.puts "root_path = #{root_path}"
157
+ unless File.exist?(root_path)
158
+ raise "由于权限不足,请手动创建#{root_path} 后重试"
159
+ end
160
+ end
161
+ end
162
+ end
163
+ unless File.exist?(dir)
164
+ raise Informative, "【切换源码】由于权限不足,请手动创建目录: #{dir} 授权mobile权限后重试"
165
+ end
166
+
167
+ if Pathname.new(lib_file).extname == ".a"
168
+ FileUtils.rm_rf(File.join(dir,basename))
169
+ `ln -s #{target_path} #{dir}`
170
+ else
171
+ FileUtils.rm_rf(File.join(dir,basename))
172
+ `ln -s #{target_path} #{dir}/#{basename}`
173
+ end
174
+
175
+ check(lib_file,dir,basename)
176
+ end
177
+
178
+ def check(lib_file,dir,basename)
179
+ print <<EOF
180
+ check 源码
181
+ `dwarfdump "#{lib_file}" | grep -E "DW_AT_decl_file.*#{basename}.*\\.m|\\.c" | head -1 | cut -d \\" -f2`
182
+ EOF
183
+ file = `dwarfdump "#{lib_file}" | grep -E "DW_AT_decl_file.*#{basename}.*\\.m|\\.c" | head -1 | cut -d \\" -f2`
184
+ if File.exist?(file)
185
+ raise Informative, "#{file} 不存在 请检测代码源是否正确~"
186
+ end
187
+ UI.puts "library file: #{lib_file} dwarfdump file: #{file}"
188
+ UI.puts "link successfully!".yellow
189
+ UI.puts "view linked source at path: #{dir}".yellow
190
+ end
191
+
192
+ def get_lib_path(name)
193
+ dir = Pathname.new(File.join(Pathname.pwd,"Pods",name))
194
+ # 遍历组件目录判断
195
+ Dir.foreach(dir) do |filename|
196
+ if filename != "." and filename != ".."
197
+ filepath = File.join(dir,"#{filename}")
198
+ if File.file?(filepath)
199
+ if File.extname(filepath) == '.a' # .a库
200
+ return filepath
201
+ end
202
+ else
203
+ if File.extname(filepath) == '.framework' # .framework库
204
+ return File.join(filepath,name)
205
+ end
206
+ if File.extname(filepath) == '.xcframework' # .xcframework库
207
+
208
+ print <<EOF
209
+ 获取xcframework架构 ls -al "#{filepath}"
210
+ EOF
211
+ # 构建xcframework架构需要根据实际二进制文件进行条件判断
212
+ arm_name = ""
213
+ if @simulator
214
+ arm_name = "ios-arm64_i386_x86_64-simulator"
215
+ else
216
+ arm_name = "ios-arm64_armv7"
217
+ end
218
+ temp_name = "#{arm_name}/#{name}.framework/#{name}"
219
+ return File.join(filepath,temp_name) # TYSecKit.xcframework/ios-arm64_armv7/TYSecKit.framework/TYSecKit
220
+ end
221
+ end
222
+ end
223
+ end
224
+ # 兼容作者代码,默认取.a文件
225
+ lib_name = "lib#{name}.a"
226
+ lib_path = File.join(dir,lib_name)
227
+
228
+ unless File.exist?(lib_path)
229
+ lib_path = File.join(dir.children.first,lib_name)
230
+ end
231
+
232
+ lib_path
233
+ end
234
+
235
+ #源码地址
236
+ # def get_gitlib_iOS_path(name)
237
+ # "git@gitlab.xxx.com:iOS/#{name}.git"
238
+ # end
239
+ #要转换的地址,Github-iOS默认都是静态库
240
+ # def git_gitlib_iOS_path
241
+ # 'git@gitlab.xxx.com:Github-iOS/'
242
+ # end
243
+
244
+
245
+ #要转换的地址,Github-iOS默认都是静态库
246
+ # def http_gitlib_GitHub_iOS_path
247
+ # 'https://gitlab.xxx.com/Github-iOS/'
248
+ # end
249
+
250
+ #要转换的地址,iOS默认都是静态库
251
+ # def http_gitlib_iOS_path
252
+ # 'https://gitlab.xxx.com/iOS/'
253
+ # end
254
+
255
+ #==========================list begin ==============
256
+
257
+ def list
258
+ Dir.entries(source_root).each do |sub|
259
+ UI.puts "- #{sub}" unless sub.include?('.')
260
+ end
261
+ UI.puts "加载完成"
262
+ end
263
+
264
+
265
+ #==========================clean begin ==============
266
+ def all_clean
267
+ FileUtils.rm_rf(source_root) if File.directory?(source_root)
268
+ UI.puts "清理完成 #{source_root}"
269
+ end
270
+
271
+ def clean
272
+ raise "请输入要删除的组件库" if @names.nil?
273
+ @names.each do |name|
274
+ full_path = File.join(source_root,name)
275
+ if File.directory?(full_path)
276
+ FileUtils.rm_rf(full_path)
277
+ else
278
+ UI.puts "找不到 #{full_path}".yellow
279
+ end
280
+ end
281
+ UI.puts "清理完成 #{@names.to_s}"
282
+ end
283
+
284
+ private
285
+
286
+ def source_root
287
+ dir = File.join(@config.cache_root,"Source")
288
+ FileUtils.mkdir_p(dir) unless File.exist? dir
289
+ dir
290
+ end
291
+
292
+ end
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,78 @@
1
+ require 'cocoapods'
2
+ require 'cocoapods/target/pod_target'
3
+
4
+ module Pod
5
+ class Command
6
+ class Bin < Command
7
+ class Dup < Bin
8
+ self.summary = '在Podfile目录下,查找Pods下同名资源名'
9
+
10
+ self.description = <<-DESC
11
+ 在Podfile目录下,查找Pods下同名资源名
12
+ DESC
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('NAME', false)
16
+ ]
17
+ def self.options
18
+ [
19
+ ['--all-clean', '删除所有已经下载的源码'],
20
+ ['--clean', '删除所有指定下载的源码'],
21
+ ['--list', '展示所有一级下载的源码以及其大小'],
22
+ ['--source', '源码路径,本地路径,会去自动链接本地源码']
23
+ ]
24
+ end
25
+
26
+ def initialize(argv)
27
+ @codeSource = argv.option('source') || nil
28
+
29
+ @config = Pod::Config.instance
30
+
31
+ super
32
+ end
33
+
34
+
35
+ def run
36
+ target_definition = Pod::Config.instance.podfile.target_definition_list[1]
37
+
38
+ user_build_configurations = target_definition.build_configurations || Target::DEFAULT_BUILD_CONFIGURATIONS
39
+ aggregateTarget = AggregateTarget.new(Pod::Config.instance.sandbox,
40
+ target_definition.uses_frameworks?,
41
+ user_build_configurations ,
42
+ nil,
43
+ target_definition.platform,
44
+ target_definition,
45
+ Pod::Config.instance.installation_root,
46
+ nil,
47
+ nil ,
48
+ user_build_configurations)
49
+ input_file = aggregateTarget.copy_resources_script_path
50
+ output_pods_suffix_txt = File.join(Pod::Config.instance.project_root,"output_pods_suffix.txt")
51
+ output_pods_uniq_txt = File.join(Pod::Config.instance.project_root,"output_pods_uniq.txt")
52
+ ignore_array = ["bundle","mp3"]
53
+ resources_path = File.join(File.dirname(File.dirname(File.dirname(__FILE__))),"resources")
54
+ shell_file = File.join(resources_path,"Pods-check-deduplication-resources.sh")
55
+ #ruby 调用shell 文件、命令传入
56
+ # stdout shell 脚本输出的文本
57
+ # status 退出的状态
58
+ stdout, status = Open3.capture2('/bin/sh',
59
+ "#{shell_file}",
60
+ "#{input_file}",
61
+ "#{output_pods_suffix_txt}",
62
+ "#{output_pods_uniq_txt}",
63
+ "#{ignore_array}")
64
+
65
+ #重复资源 抛出异常
66
+ if status.to_i != 0
67
+ raise "由于权限不足,请手动创建 后重试"
68
+ else #重复资源,警告
69
+ raise "由于权限不足,请手动创建 后重试"
70
+
71
+ end
72
+ end
73
+
74
+
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,46 @@
1
+ require 'cocoapods-bb-bin/config/config_hot_key_asker'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Imy < Bin
7
+ self.summary = '快捷键'
8
+ self.description = <<-DESC
9
+ 创建 文件,在其中保存插件需要的配置信息,
10
+ 如二进制私有源地址、源码私有源地址等。
11
+ DESC
12
+
13
+ self.arguments = [
14
+ CLAide::Argument.new('1', false)
15
+ ]
16
+
17
+ def self.options
18
+ [
19
+ ].concat(super)
20
+ end
21
+
22
+ def initialize(argv)
23
+ @hot_key = argv.shift_argument || '1'
24
+ super
25
+ end
26
+
27
+ def run
28
+ CBin.config_hot_key.set_hot_key_index(@hot_key)
29
+ UI.puts "cd #{CBin.config_hot_key.hot_key_dir}".yellow
30
+
31
+ if Dir.exist?(CBin.config_hot_key.hot_key_dir)
32
+ Dir.chdir(CBin.config_hot_key.hot_key_dir) do
33
+ UI.puts " #{CBin.config_hot_key.hot_key_cmd}".yellow
34
+ system CBin.config_hot_key.hot_key_cmd
35
+ end
36
+ else
37
+ raise "配置项中文件目录不存在 #{CBin.config_hot_key.hot_key_dir}"
38
+ end
39
+
40
+
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,69 @@
1
+ require 'cocoapods-bb-bin/config/config_asker'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Init < Bin
7
+ self.summary = '初始化插件的快捷键.'
8
+ self.description = <<-DESC
9
+ 创建 文件,在其中保存插件需要的配置信息,
10
+ 如快捷键1 快捷键2 所对应执行的命令
11
+ DESC
12
+
13
+ def self.options
14
+ [
15
+ ['--bin-url=URL', '配置文件地址,直接从此地址下载配置文件']
16
+ ].concat(super)
17
+ end
18
+
19
+ def initialize(argv)
20
+ @bin_url = argv.option('bin-url')
21
+ super
22
+ end
23
+
24
+ def run
25
+ if @bin_url.nil?
26
+ config_with_asker
27
+ else
28
+ config_with_url(@bin_url)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def config_with_url(url)
35
+ require 'open-uri'
36
+
37
+ UI.puts "开始下载配置文件...\n"
38
+ file = open(url)
39
+ contents = YAML.safe_load(file.read)
40
+
41
+ UI.puts "开始同步配置文件...\n"
42
+ CBin.config.sync_config(contents.to_hash)
43
+ UI.puts "设置完成.\n".green
44
+ rescue Errno::ENOENT => e
45
+ raise Informative, "配置文件路径 #{url} 无效,请确认后重试."
46
+ end
47
+
48
+ def config_with_asker
49
+ asker = CBin::Config::Asker.new
50
+ asker.wellcome_message
51
+
52
+ config = {}
53
+ template_hash = CBin.config.template_hash
54
+ template_hash.each do |k, v|
55
+ default = begin
56
+ CBin.config.send(k)
57
+ rescue StandardError
58
+ nil
59
+ end
60
+ config[k] = asker.ask_with_answer(v[:description], default, v[:selection])
61
+ end
62
+
63
+ CBin.config.sync_config(config)
64
+ asker.done_message
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,70 @@
1
+
2
+ require 'cocoapods-bb-bin/config/config_hot_key_asker'
3
+
4
+ module Pod
5
+ class Command
6
+ class Bin < Command
7
+ class Inithk < Bin
8
+ self.summary = '初始化快捷键配置.'
9
+ self.description = <<-DESC
10
+ 创建 文件,在其中保存插件需要的配置信息,
11
+ 如二进制私有源地址、源码私有源地址等。
12
+ DESC
13
+
14
+ def self.options
15
+ [
16
+ ['--bin-url=URL', '配置文件地址,直接从此地址下载配置文件']
17
+ ].concat(super)
18
+ end
19
+
20
+ def initialize(argv)
21
+ @bin_url = argv.option('bin-url')
22
+ super
23
+ end
24
+
25
+ def run
26
+ if @bin_url.nil?
27
+ config_with_asker
28
+ else
29
+ config_with_url(@bin_url)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def config_with_url(url)
36
+ require 'open-uri'
37
+
38
+ UI.puts "开始下载配置文件...\n"
39
+ file = open(url)
40
+ contents = YAML.safe_load(file.read)
41
+
42
+ UI.puts "开始同步配置文件...\n"
43
+ CBin.config_hot_key.sync_config(contents.to_hash)
44
+ UI.puts "设置完成.\n".green
45
+ rescue Errno::ENOENT => e
46
+ raise Informative, "配置文件路径 #{url} 无效,请确认后重试."
47
+ end
48
+
49
+ def config_with_asker
50
+ asker = CBin::Config_Hot_Key::Asker.new
51
+ asker.wellcome_message
52
+
53
+ config = {}
54
+ template_hash = CBin.config_hot_key.template_hash
55
+ template_hash.each do |k, v|
56
+ default = begin
57
+ CBin.config_hot_key.send(k)
58
+ rescue StandardError
59
+ nil
60
+ end
61
+ config[k] = asker.ask_with_answer(v[:description], default, v[:selection])
62
+ end
63
+
64
+ CBin.config_hot_key.sync_config(config)
65
+ asker.done_message
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,44 @@
1
+
2
+ require 'cocoapods-bb-bin/command/bin/update'
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Install < Bin
7
+ include Pod
8
+
9
+ self.summary = 'pod install 拦截器,会加载本地Podfile_local文件,DSL加载到原始Podfile文件中。'
10
+
11
+ self.description = <<-DESC
12
+ pod install 拦截器,会加载本地Podfile_local文件
13
+ 会通过DSL加载到原始Podfile文件中
14
+ 支持 pod 'xxx' 各种写法
15
+ 支持 post_install/pre_install钩子,采用覆盖做法
16
+ DESC
17
+ def self.options
18
+ [
19
+ ['--repo-update', 'Force running `pod repo update` before install'],
20
+ ['--deployment', 'Disallow any changes to the Podfile or the Podfile.lock during installation'],
21
+ ['--clean-install', 'Ignore the contents of the project cache and force a full pod installation. This only ' \
22
+ 'applies to projects that have enabled incremental installation']
23
+ ].concat(super).reject { |(name, _)| name == '--no-repo-update' }
24
+ end
25
+
26
+ def initialize(argv)
27
+ @update = argv.flag?('update')
28
+ super
29
+ @additional_args = argv.remainder!
30
+ end
31
+
32
+ def run
33
+ Update.load_local_podfile
34
+ argvs = [
35
+ *@additional_args
36
+ ]
37
+ gen = Pod::Command::Install.new(CLAide::ARGV.new(argvs))
38
+ gen.validate!
39
+ gen.run
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,69 @@
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 Lib < Bin
8
+ class Lint < Lib
9
+ self.summary = 'lint 组件.'
10
+ self.description = <<-DESC
11
+ lint 二进制组件 / 源码组件
12
+ DESC
13
+
14
+ self.arguments = [
15
+ CLAide::Argument.new('NAME.podspec', false)
16
+ ]
17
+
18
+ # lib lint 不会下载 source,所以不能进行二进制 lint
19
+ # 要 lint 二进制版本,需要进行 spec lint,此 lint 会去下载 source
20
+ def self.options
21
+ [
22
+ ['--code-dependencies', '使用源码依赖进行 lint'],
23
+ ['--loose-options', '添加宽松的 options, 包括 --use-libraries (可能会造成 entry point (start) undefined)'],
24
+ ['--allow-prerelease', '允许使用 prerelease 的版本 lint']
25
+ ].concat(Pod::Command::Lib::Lint.options).concat(super).uniq
26
+ end
27
+
28
+ def initialize(argv)
29
+ @loose_options = argv.flag?('loose-options')
30
+ @code_dependencies = argv.flag?('code-dependencies')
31
+ @sources = argv.option('sources') || []
32
+ @allow_prerelease = argv.flag?('allow-prerelease')
33
+ @podspec = argv.shift_argument
34
+ super
35
+
36
+ @additional_args = argv.remainder!
37
+ end
38
+
39
+ def run
40
+ Podfile.execute_with_bin_plugin do
41
+ Podfile.execute_with_allow_prerelease(@allow_prerelease) do
42
+ Podfile.execute_with_use_binaries(!@code_dependencies) do
43
+ argvs = [
44
+ @podspec || code_spec_files.first,
45
+ "--sources=#{sources_option(@code_dependencies, @sources)}",
46
+ *@additional_args
47
+ ]
48
+
49
+ if @loose_options
50
+ argvs << '--allow-warnings'
51
+ if code_spec&.all_dependencies&.any?
52
+ argvs << '--use-libraries'
53
+ end
54
+ end
55
+
56
+ lint = Pod::Command::Lib::Lint.new(CLAide::ARGV.new(argvs))
57
+ lint.validate!
58
+ lint.run
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end