cocoapods-imy-bin 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +541 -0
  4. data/lib/cocoapods-imy-bin.rb +2 -0
  5. data/lib/cocoapods-imy-bin/command.rb +2 -0
  6. data/lib/cocoapods-imy-bin/command/bin.rb +60 -0
  7. data/lib/cocoapods-imy-bin/command/bin/archive.rb +184 -0
  8. data/lib/cocoapods-imy-bin/command/bin/auto.rb +188 -0
  9. data/lib/cocoapods-imy-bin/command/bin/code.rb +237 -0
  10. data/lib/cocoapods-imy-bin/command/bin/imy.rb +46 -0
  11. data/lib/cocoapods-imy-bin/command/bin/init.rb +69 -0
  12. data/lib/cocoapods-imy-bin/command/bin/initHotKey.rb +70 -0
  13. data/lib/cocoapods-imy-bin/command/bin/install.rb +44 -0
  14. data/lib/cocoapods-imy-bin/command/bin/lib/lint.rb +69 -0
  15. data/lib/cocoapods-imy-bin/command/bin/local.rb +156 -0
  16. data/lib/cocoapods-imy-bin/command/bin/repo/update.rb +43 -0
  17. data/lib/cocoapods-imy-bin/command/bin/spec/create.rb +73 -0
  18. data/lib/cocoapods-imy-bin/command/bin/spec/push.rb +114 -0
  19. data/lib/cocoapods-imy-bin/command/bin/update.rb +148 -0
  20. data/lib/cocoapods-imy-bin/config/config.rb +137 -0
  21. data/lib/cocoapods-imy-bin/config/config_asker.rb +57 -0
  22. data/lib/cocoapods-imy-bin/config/config_builder.rb +179 -0
  23. data/lib/cocoapods-imy-bin/config/config_hot_key.rb +103 -0
  24. data/lib/cocoapods-imy-bin/config/config_hot_key_asker.rb +57 -0
  25. data/lib/cocoapods-imy-bin/gem_version.rb +10 -0
  26. data/lib/cocoapods-imy-bin/helpers.rb +4 -0
  27. data/lib/cocoapods-imy-bin/helpers/build_helper.rb +150 -0
  28. data/lib/cocoapods-imy-bin/helpers/framework.rb +62 -0
  29. data/lib/cocoapods-imy-bin/helpers/framework_builder.rb +307 -0
  30. data/lib/cocoapods-imy-bin/helpers/library.rb +54 -0
  31. data/lib/cocoapods-imy-bin/helpers/library_builder.rb +90 -0
  32. data/lib/cocoapods-imy-bin/helpers/local/loca_llibrary.rb +57 -0
  33. data/lib/cocoapods-imy-bin/helpers/local/local_build_helper.rb +146 -0
  34. data/lib/cocoapods-imy-bin/helpers/local/local_framework.rb +65 -0
  35. data/lib/cocoapods-imy-bin/helpers/local/local_framework_builder.rb +174 -0
  36. data/lib/cocoapods-imy-bin/helpers/local/local_library_builder.rb +92 -0
  37. data/lib/cocoapods-imy-bin/helpers/sources_helper.rb +33 -0
  38. data/lib/cocoapods-imy-bin/helpers/spec_creator.rb +170 -0
  39. data/lib/cocoapods-imy-bin/helpers/spec_files_helper.rb +77 -0
  40. data/lib/cocoapods-imy-bin/helpers/spec_source_creator.rb +171 -0
  41. data/lib/cocoapods-imy-bin/helpers/upload_helper.rb +84 -0
  42. data/lib/cocoapods-imy-bin/native.rb +19 -0
  43. data/lib/cocoapods-imy-bin/native/acknowledgements.rb +27 -0
  44. data/lib/cocoapods-imy-bin/native/analyzer.rb +53 -0
  45. data/lib/cocoapods-imy-bin/native/installation_options.rb +25 -0
  46. data/lib/cocoapods-imy-bin/native/installer.rb +115 -0
  47. data/lib/cocoapods-imy-bin/native/linter.rb +26 -0
  48. data/lib/cocoapods-imy-bin/native/path_source.rb +33 -0
  49. data/lib/cocoapods-imy-bin/native/pod_source_installer.rb +19 -0
  50. data/lib/cocoapods-imy-bin/native/podfile.rb +91 -0
  51. data/lib/cocoapods-imy-bin/native/podfile_env.rb +37 -0
  52. data/lib/cocoapods-imy-bin/native/podfile_generator.rb +190 -0
  53. data/lib/cocoapods-imy-bin/native/podspec_finder.rb +25 -0
  54. data/lib/cocoapods-imy-bin/native/resolver.rb +230 -0
  55. data/lib/cocoapods-imy-bin/native/sandbox_analyzer.rb +34 -0
  56. data/lib/cocoapods-imy-bin/native/source.rb +35 -0
  57. data/lib/cocoapods-imy-bin/native/sources_manager.rb +20 -0
  58. data/lib/cocoapods-imy-bin/native/specification.rb +31 -0
  59. data/lib/cocoapods-imy-bin/native/validator.rb +77 -0
  60. data/lib/cocoapods-imy-bin/source_provider_hook.rb +54 -0
  61. data/lib/cocoapods_plugin.rb +3 -0
  62. data/spec/command/bin_spec.rb +12 -0
  63. data/spec/spec_helper.rb +50 -0
  64. metadata +180 -0
@@ -0,0 +1,2 @@
1
+ require 'cocoapods-imy-bin/gem_version'
2
+ require 'cocoapods-imy-bin/native/sources_manager'
@@ -0,0 +1,2 @@
1
+
2
+ require 'cocoapods-imy-bin/command/bin'
@@ -0,0 +1,60 @@
1
+
2
+ require 'cocoapods-imy-bin/command/bin/initHotKey'
3
+ require 'cocoapods-imy-bin/command/bin/init'
4
+ require 'cocoapods-imy-bin/command/bin/archive'
5
+ require 'cocoapods-imy-bin/command/bin/auto'
6
+ require 'cocoapods-imy-bin/command/bin/code'
7
+ require 'cocoapods-imy-bin/command/bin/local'
8
+ require 'cocoapods-imy-bin/command/bin/update'
9
+ require 'cocoapods-imy-bin/command/bin/install'
10
+ require 'cocoapods-imy-bin/command/bin/imy'
11
+
12
+ require 'cocoapods-imy-bin/helpers'
13
+
14
+ module Pod
15
+ class Command
16
+ # This is an example of a cocoapods plugin adding a top-level subcommand
17
+ # to the 'pod' command.
18
+ #
19
+ # You can also create subcommands of existing or new commands. Say you
20
+ # wanted to add a subcommand to `list` to show newly deprecated pods,
21
+ # (e.g. `pod list deprecated`), there are a few things that would need
22
+ # to change.
23
+ #
24
+ # - move this file to `lib/pod/command/list/deprecated.rb` and update
25
+ # the class to exist in the the Pod::Command::List namespace
26
+ # - change this class to extend from `List` instead of `Command`. This
27
+ # tells the plugin system that it is a subcommand of `list`.
28
+ # - edit `lib/cocoapods_plugins.rb` to require this file
29
+ #
30
+ # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
31
+ # in the `plugins.json` file, once your plugin is released.
32
+ #
33
+ class Bin < Command
34
+ include CBin::SourcesHelper
35
+ include CBin::SpecFilesHelper
36
+
37
+ self.abstract_command = true
38
+
39
+ self.default_subcommand = 'open'
40
+ self.summary = '组件二进制化插件.'
41
+ self.description = <<-DESC
42
+ 组件二进制化插件。利用源码私有源与二进制私有源实现对组件依赖类型的切换。
43
+ DESC
44
+
45
+ def initialize(argv)
46
+ require 'cocoapods-imy-bin/native'
47
+
48
+ @help = argv.flag?('help')
49
+ super
50
+ end
51
+
52
+ def validate!
53
+ super
54
+ # 这里由于 --help 是在 validate! 方法中提取的,会导致 --help 失效
55
+ # pod lib create 也有这个问题
56
+ banner! if @help
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,184 @@
1
+ require 'cocoapods-imy-bin/native/podfile'
2
+ require 'cocoapods/command/gen'
3
+ require 'cocoapods/generate'
4
+ require 'cocoapods-imy-bin/helpers/framework_builder'
5
+ require 'cocoapods-imy-bin/helpers/library_builder'
6
+ require 'cocoapods-imy-bin/helpers/build_helper'
7
+ require 'cocoapods-imy-bin/helpers/spec_source_creator'
8
+ require 'cocoapods-imy-bin/config/config_builder'
9
+ require 'cocoapods-imy-bin/command/bin/lib/lint'
10
+
11
+ module Pod
12
+ class Command
13
+ class Bin < Command
14
+ class Archive < Bin
15
+
16
+ @@missing_binary_specs = []
17
+
18
+ self.summary = '将组件归档为静态库 .a.'
19
+ self.description = <<-DESC
20
+ 将组件归档为静态库 framework,仅支持 iOS 平台
21
+ 此静态 framework 不包含依赖组件的 symbol
22
+ DESC
23
+
24
+ def self.options
25
+ [
26
+ ['--all-make', '对该组件的依赖库,全部制作为二进制组件'],
27
+ ['--code-dependencies', '使用源码依赖'],
28
+ ['--no-clean', '保留构建中间产物'],
29
+ ['--sources', '私有源地址,多个用分号区分'],
30
+ ['--framework-output', '输出framework文件'],
31
+ ['--no-zip', '不压缩静态库 为 zip'],
32
+ ['--env', "该组件上传的环境 %w[dev debug_iphoneos release_iphoneos]"]
33
+ ].concat(Pod::Command::Gen.options).concat(super).uniq
34
+ end
35
+
36
+ self.arguments = [
37
+ CLAide::Argument.new('NAME.podspec', false)
38
+ ]
39
+
40
+ def initialize(argv)
41
+ @env = argv.option('env') || 'dev'
42
+ CBin.config.set_configuration_env(@env)
43
+ UI.warn "====== cocoapods-imy-bin #{CBin::VERSION} 版本 ======== \n "
44
+ UI.warn "====== #{@env} 环境 ======== \n "
45
+
46
+ @code_dependencies = argv.flag?('code-dependencies')
47
+ @framework_output = argv.flag?('framework-output', false )
48
+ @clean = argv.flag?('no-clean', false)
49
+ @zip = argv.flag?('zip', true)
50
+ @all_make = argv.flag?('all-make', false )
51
+ @sources = argv.option('sources') || []
52
+ @platform = Platform.new(:ios)
53
+
54
+ @framework_path
55
+ super
56
+
57
+ @additional_args = argv.remainder!
58
+ @build_finshed = false
59
+ end
60
+
61
+ def run
62
+ #清除之前的缓存
63
+ zip_dir = CBin::Config::Builder.instance.zip_dir
64
+ FileUtils.rm_rf(zip_dir) if File.exist?(zip_dir)
65
+
66
+ @spec = Specification.from_file(spec_file)
67
+ generate_project
68
+
69
+ build_root_spec
70
+
71
+ sources_sepc = Array.new
72
+ sources_sepc << @spec
73
+ sources_sepc.concat(build_dependencies) if @all_make
74
+
75
+ sources_sepc
76
+ end
77
+
78
+ def build_root_spec
79
+ builder = CBin::Build::Helper.new(@spec,
80
+ @platform,
81
+ @framework_output,
82
+ @zip,
83
+ @spec,
84
+ CBin::Config::Builder.instance.white_pod_list.include?(@spec.name))
85
+ builder.build
86
+ builder.clean_workspace if @clean && !@all_make
87
+ end
88
+
89
+ def build_dependencies
90
+ @build_finshed = true
91
+ #如果没要求,就清空依赖库数据
92
+ sources_sepc = []
93
+ @@missing_binary_specs.uniq.each do |spec|
94
+ next if spec.name.include?('/')
95
+ next if spec.name == @spec.name
96
+ #过滤白名单
97
+ next if CBin::Config::Builder.instance.white_pod_list.include?(spec.name)
98
+ #过滤 git
99
+ if spec.source[:git] && spec.source[:git]
100
+ spec_git = spec.source[:git]
101
+ spec_git_res = false
102
+ CBin::Config::Builder.instance.ignore_git_list.each do |ignore_git|
103
+ spec_git_res = spec_git.include?(ignore_git)
104
+ break if spec_git_res
105
+ end
106
+ next if spec_git_res
107
+ end
108
+ UI.warn "#{spec.name}.podspec 带有 vendored_frameworks 字段,请检查是否有效!!!" if spec.attributes_hash['vendored_frameworks']
109
+ next if spec.attributes_hash['vendored_frameworks'] && @spec.name != spec.name #过滤带有vendored_frameworks的
110
+ next if spec.attributes_hash['ios.vendored_frameworks'] && @spec.name != spec.name #过滤带有vendored_frameworks的
111
+ #获取没有制作二进制版本的spec集合
112
+ sources_sepc << spec
113
+ end
114
+
115
+ fail_build_specs = []
116
+ sources_sepc.uniq.each do |spec|
117
+ begin
118
+ builder = CBin::Build::Helper.new(spec,
119
+ @platform,
120
+ @framework_output,
121
+ @zip,
122
+ @spec)
123
+ builder.build
124
+ rescue
125
+ fail_build_specs << spec
126
+ end
127
+ end
128
+
129
+ if fail_build_specs.any?
130
+ fail_build_specs.uniq.each do |spec|
131
+ UI.warn "【#{spec.name} | #{spec.version}】组件二进制版本编译失败 ."
132
+ end
133
+ end
134
+ sources_sepc - fail_build_specs
135
+ end
136
+
137
+ # 解析器传过来的
138
+ def Archive.missing_binary_specs(missing_binary_specs)
139
+ @@missing_binary_specs = missing_binary_specs unless @build_finshed
140
+ end
141
+
142
+ private
143
+
144
+ def generate_project
145
+ Podfile.execute_with_bin_plugin do
146
+ Podfile.execute_with_use_binaries(!@code_dependencies) do
147
+ argvs = [
148
+ "--sources=#{sources_option(@code_dependencies, @sources)}",
149
+ "--gen-directory=#{CBin::Config::Builder.instance.gen_dir}",
150
+ '--clean',
151
+ *@additional_args
152
+ ]
153
+
154
+ argvs << spec_file if spec_file
155
+
156
+ gen = Pod::Command::Gen.new(CLAide::ARGV.new(argvs))
157
+ gen.validate!
158
+ gen.run
159
+ end
160
+ end
161
+ end
162
+
163
+
164
+ def spec_file
165
+ @spec_file ||= begin
166
+ if @podspec
167
+ find_spec_file(@podspec)
168
+ else
169
+ if code_spec_files.empty?
170
+ raise Informative, '当前目录下没有找到可用源码 podspec.'
171
+ end
172
+
173
+ spec_file = code_spec_files.first
174
+ spec_file
175
+ end
176
+ end
177
+ end
178
+
179
+
180
+
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,188 @@
1
+
2
+ require 'cocoapods-imy-bin/command/bin/auto'
3
+ require 'cocoapods-imy-bin/helpers/upload_helper'
4
+
5
+ module Pod
6
+ class Command
7
+ class Bin < Command
8
+ class Auto < Bin
9
+ self.summary = '打开 workspace 工程.'
10
+
11
+ self.arguments = [
12
+ CLAide::Argument.new('NAME.podspec', false)
13
+ ]
14
+ def self.options
15
+ [
16
+ ['--code-dependencies', '使用源码依赖'],
17
+ ['--allow-prerelease', '允许使用 prerelease 的版本'],
18
+ ['--no-clean', '保留构建中间产物'],
19
+ ['--framework-output', '输出framework文件'],
20
+ ['--no-zip', '不压缩静态 framework 为 zip'],
21
+ ['--all-make', '对该组件的依赖库,全部制作为二进制组件'],
22
+ ['--env', "该组件上传的环境 %w[dev debug_iphoneos release_iphoneos]"]
23
+ ]
24
+ end
25
+
26
+ def initialize(argv)
27
+
28
+ @env = argv.option('env') || 'dev'
29
+ CBin.config.set_configuration_env(@env)
30
+
31
+ @podspec = argv.shift_argument || find_podspec
32
+ @specification = Specification.from_file(@podspec)
33
+
34
+ @code_dependencies = argv.flag?('code-dependencies')
35
+ @allow_prerelease = argv.flag?('allow-prerelease')
36
+ @framework_output = argv.flag?('framework-output', false )
37
+ @clean = argv.flag?('clean', true)
38
+ @zip = argv.flag?('zip', true)
39
+ @all_make = argv.flag?('all-make', false )
40
+ @verbose = argv.flag?('verbose',true)
41
+ super
42
+ end
43
+
44
+ def run
45
+
46
+ unless @podspec
47
+ raise Informative, "未找到 podspec文件"
48
+ end
49
+ sources_sepc = run_archive
50
+
51
+ fail_push_specs = []
52
+ sources_sepc.uniq.each do |spec|
53
+ begin
54
+ fail_push_specs << spec unless CBin::Upload::Helper.new(spec,@code_dependencies,@sources).upload
55
+ rescue
56
+ fail_push_specs << spec
57
+ end
58
+ end
59
+
60
+ if fail_push_specs.any?
61
+ fail_push_specs.uniq.each do |spec|
62
+ UI.warn "【#{spec.name} | #{spec.version}】组件spec push失败 ."
63
+ end
64
+ end
65
+
66
+ success_specs = sources_sepc - fail_push_specs
67
+ if success_specs.any?
68
+ auto_success = ""
69
+ success_specs.uniq.each do |spec|
70
+ auto_success += "#{spec.name} | #{spec.version}\n"
71
+ UI.warn "===【 #{spec.name} | #{spec.version} 】二进制组件制作完成 !!! "
72
+ end
73
+ puts "============== auto_success"
74
+ puts auto_success
75
+ ENV['auto_success'] = auto_success
76
+ end
77
+ #pod repo update
78
+ UI.section("\nUpdating Spec Repositories\n".yellow) do
79
+ Pod::Command::Bin::Repo::Update.new(CLAide::ARGV.new([])).run
80
+ end
81
+
82
+ end
83
+
84
+ #制作二进制包
85
+ # `pod bin archive --verbose --code-dependencies --no-clean --sources=https://gitlab.xxx.com/iOS/imyspecs.git,https://cdn.cocoapods.org/ --use-libraries`
86
+ def run_archive
87
+ argvs = [
88
+ "--sources=#{sources_option(@code_dependencies, @sources)},https:\/\/cdn.cocoapods.org",
89
+ "--use-libraries",
90
+ "--verbose"
91
+ ]
92
+
93
+ argvs << spec_file if spec_file
94
+
95
+ unless @clean
96
+ argvs += ['--no-clean']
97
+ end
98
+ if @code_dependencies
99
+ argvs += ['--code-dependencies']
100
+ end
101
+ if @verbose
102
+ argvs += ['--verbose']
103
+ end
104
+ if @allow_prerelease
105
+ argvs += ['--allow-prerelease']
106
+ end
107
+ if @framework_output
108
+ argvs += ['--framework-output']
109
+ end
110
+ if @all_make
111
+ argvs += ['--all-make']
112
+ end
113
+ if @env
114
+ argvs += ["--env=#{@env}"]
115
+ end
116
+
117
+
118
+ archive = Pod::Command::Bin::Archive.new(CLAide::ARGV.new(argvs))
119
+ archive.validate!
120
+ sources_sepc = archive.run
121
+ sources_sepc
122
+ end
123
+
124
+
125
+ def code_podsepc_extname
126
+ '.podsepc'
127
+ end
128
+
129
+ def binary_podsepc_json
130
+ "#{@specification.name}.binary.podspec.json"
131
+ end
132
+
133
+ def binary_template_podsepc
134
+ "#{@specification.name}.binary-template.podspec"
135
+ end
136
+
137
+ def template_spec_file
138
+ @template_spec_file ||= begin
139
+ if @template_podspec
140
+ find_spec_file(@template_podspec)
141
+ else
142
+ binary_template_spec_file
143
+ end
144
+ end
145
+ end
146
+
147
+ def spec_file
148
+ @spec_file ||= begin
149
+ if @podspec
150
+ find_spec_file(@podspec) || @podspec
151
+ else
152
+ if code_spec_files.empty?
153
+ raise Informative, '当前目录下没有找到可用源码 podspec.'
154
+ end
155
+
156
+ spec_file = if @binary
157
+ code_spec = Pod::Specification.from_file(code_spec_files.first)
158
+ if template_spec_file
159
+ template_spec = Pod::Specification.from_file(template_spec_file)
160
+ end
161
+ create_binary_spec_file(code_spec, template_spec)
162
+ else
163
+ code_spec_files.first
164
+ end
165
+ spec_file
166
+ end
167
+ end
168
+ end
169
+
170
+ #Dir.glob 可替代
171
+ def find_podspec
172
+ Pathname.pwd.children.each do |child|
173
+ puts child
174
+ if File.file?(child)
175
+ if child.extname == '.podspec'
176
+ name = File.basename(child)
177
+ unless name.include?("binary-template")
178
+ return name
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,237 @@
1
+
2
+ module Pod
3
+ class Command
4
+ class Bin < Command
5
+ class Code < Bin
6
+ self.summary = '通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。'
7
+
8
+ self.description = <<-DESC
9
+ 通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。
10
+ 在不删除二进制的情况下为某个组件添加源码调试能力,多个组件名称用空格分隔
11
+ DESC
12
+
13
+ self.arguments = [
14
+ CLAide::Argument.new('NAME', false)
15
+ ]
16
+ def self.options
17
+ [
18
+ ['--all-clean', '删除所有已经下载的源码'],
19
+ ['--clean', '删除所有指定下载的源码'],
20
+ ['--list', '展示所有一级下载的源码以及其大小'],
21
+ ['--source', '源码路径,本地路径,会去自动链接本地源码']
22
+ ]
23
+ end
24
+
25
+ def initialize(argv)
26
+ @codeSource = argv.option('source') || nil
27
+ @names = argv.arguments! unless argv.arguments.empty?
28
+ @list = argv.flag?('list', false )
29
+ @all_clean = argv.flag?('all-clean', false )
30
+ @clean = argv.flag?('clean', false )
31
+
32
+ @config = Pod::Config.instance
33
+
34
+ super
35
+ end
36
+
37
+
38
+ def run
39
+
40
+ podfile_lock = File.join(Pathname.pwd,"Podfile.lock")
41
+ raise "podfile.lock,不存在,请先pod install/update" unless File.exist?(podfile_lock)
42
+ @lockfile ||= Lockfile.from_file(Pathname.new(podfile_lock) )
43
+
44
+ if @list
45
+ list
46
+ elsif @clean
47
+ clean
48
+ elsif @all_clean
49
+ all_clean
50
+ elsif @names
51
+ add
52
+ end
53
+
54
+ if @list && @clean && @names
55
+ raise "请选择您要执行的命令。"
56
+ end
57
+ end
58
+
59
+ #==========================begin add ==============
60
+
61
+ def add
62
+ if @names == nil
63
+ raise "请输入要调试组件名,多个组件名称用空格分隔"
64
+ end
65
+
66
+ @names.each do |name|
67
+ lib_file = get_lib_path(name)
68
+ unless File.exist?(lib_file)
69
+ raise "找不到 #{lib_file}"
70
+ end
71
+ UI.puts "#{lib_file}"
72
+
73
+ target_path = @codeSource || download_source(name)
74
+
75
+ link(lib_file,target_path,name)
76
+ end
77
+ end
78
+
79
+ #下载源码到本地
80
+ def download_source(name)
81
+ target_path = File.join(source_root, name)
82
+ UI.puts target_path
83
+ FileUtils.rm_rf(target_path)
84
+
85
+ find_dependency = find_dependency(name)
86
+ # 意义不大,需要可以使用--source参数 对 github-ios 仓库对做特殊处理
87
+ # if find_dependency && find_dependency.external_source[:podspec].include?(http_gitlib_GitHub_iOS_path)
88
+ # github_ios = find_dependency.external_source[:podspec]
89
+ # find_dependency.external_source[:podspec] = github_ios.gsub(http_gitlib_GitHub_iOS_path,http_gitlib_iOS_path)
90
+ # end
91
+
92
+ spec = fetch_external_source(find_dependency, @config.podfile,@config.lockfile, @config.sandbox,true )
93
+
94
+ download_request = Pod::Downloader::Request.new(:name => name, :spec => spec)
95
+ Downloader.download(download_request, Pathname.new(target_path), :can_cache => true)
96
+
97
+ target_path
98
+ end
99
+
100
+ #找出依赖
101
+ def find_dependency (name)
102
+ find_dependency = nil
103
+ @config.podfile.dependencies.each do |dependency|
104
+ if dependency.root_name.downcase == name.downcase
105
+ find_dependency = dependency
106
+ break
107
+ end
108
+ end
109
+
110
+ find_dependency
111
+ end
112
+
113
+ # 获取external_source 下的仓库
114
+ # @return spec
115
+ def fetch_external_source(dependency ,podfile , lockfile, sandbox,use_lockfile_options)
116
+ source = ExternalSources.from_dependency(dependency, podfile.defined_in_file, true)
117
+ source.fetch(sandbox)
118
+ end
119
+
120
+
121
+ #==========================link begin ==============
122
+
123
+ #链接,.a文件位置, 源码目录,工程名=IMYFoundation
124
+ def link(lib_file,target_path,basename)
125
+ dir = (`dwarfdump "#{lib_file}" | grep "AT_comp_dir" | head -1 | cut -d \\" -f2 `)
126
+ sub_path = "#{basename}/bin-archive/#{basename}"
127
+ dir = dir.gsub(sub_path, "").chomp
128
+ # UI.puts "dir = #{dir}"
129
+
130
+ unless File.exist?(dir)
131
+ # UI.puts "不存在 = #{dir}"
132
+ begin
133
+ FileUtils.mkdir_p(dir)
134
+ rescue SystemCallError
135
+ #判断用户目录是否存在
136
+ array = dir.split('/')
137
+ if array.length > 3
138
+ root_path = '/' + array[1] + '/' + array[2]
139
+ unless File.exist?(root_path)
140
+ raise "由于权限不足,请手动创建#{root_path} 后重试"
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ if Pathname.new(lib_file).extname == ".a"
147
+ FileUtils.rm_rf(File.join(dir,basename))
148
+ `ln -s #{target_path} #{dir}`
149
+ else
150
+ FileUtils.rm_rf(File.join(dir,basename))
151
+ `ln -s #{target_path} #{dir}/#{basename}`
152
+ end
153
+ check(lib_file,dir,basename)
154
+ end
155
+
156
+ def check(lib_file,dir,basename)
157
+ file = `dwarfdump "#{lib_file}" | grep -E "DW_AT_decl_file.*#{basename}.*\\.m|\\.c" | head -1 | cut -d \\" -f2`
158
+ if File.exist?(file)
159
+ raise "#{file} 不存在 请检测代码源是否正确~"
160
+ end
161
+ UI.puts "link successfully!"
162
+ UI.puts "view linked source at path: #{dir}"
163
+ end
164
+
165
+ def get_lib_path(name)
166
+ dir = Pathname.new(File.join(Pathname.pwd,"Pods",name))
167
+ lib_name = "lib#{name}.a"
168
+ lib_path = File.join(dir,lib_name)
169
+
170
+ unless File.exist?(lib_path)
171
+ lib_path = File.join(dir.children.first,lib_name)
172
+ end
173
+
174
+ lib_path
175
+ end
176
+
177
+ #源码地址
178
+ # def get_gitlib_iOS_path(name)
179
+ # "git@gitlab.xxx.com:iOS/#{name}.git"
180
+ # end
181
+ #要转换的地址,Github-iOS默认都是静态库
182
+ # def git_gitlib_iOS_path
183
+ # 'git@gitlab.xxx.com:Github-iOS/'
184
+ # end
185
+
186
+
187
+ #要转换的地址,Github-iOS默认都是静态库
188
+ # def http_gitlib_GitHub_iOS_path
189
+ # 'https://gitlab.xxx.com/Github-iOS/'
190
+ # end
191
+
192
+ #要转换的地址,iOS默认都是静态库
193
+ # def http_gitlib_iOS_path
194
+ # 'https://gitlab.xxx.com/iOS/'
195
+ # end
196
+
197
+ #==========================list begin ==============
198
+
199
+ def list
200
+ Dir.entries(source_root).each do |sub|
201
+ UI.puts "- #{sub}" unless sub.include?('.')
202
+ end
203
+ UI.puts "加载完成"
204
+ end
205
+
206
+
207
+ #==========================clean begin ==============
208
+ def all_clean
209
+ FileUtils.rm_rf(source_root) if File.directory?(source_root)
210
+ UI.puts "清理完成 #{source_root}"
211
+ end
212
+
213
+ def clean
214
+ raise "请输入要删除的组件库" if @names.nil?
215
+ @names.each do |name|
216
+ full_path = File.join(source_root,name)
217
+ if File.directory?(full_path)
218
+ FileUtils.rm_rf(full_path)
219
+ else
220
+ UI.puts "找不到 #{full_path}".yellow
221
+ end
222
+ end
223
+ UI.puts "清理完成 #{@names.to_s}"
224
+ end
225
+
226
+ private
227
+
228
+ def source_root
229
+ dir = File.join(@config.cache_root,"Source")
230
+ FileUtils.mkdir_p(dir) unless File.exist? dir
231
+ dir
232
+ end
233
+
234
+ end
235
+ end
236
+ end
237
+ end