cocoapods-meitu-bin 1.0.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 (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,299 @@
1
+
2
+
3
+ require 'parallel'
4
+ require 'cocoapods'
5
+ require 'cocoapods-meitu-bin/native/podfile'
6
+ require 'cocoapods-meitu-bin/native/sources_manager'
7
+ require 'cocoapods-meitu-bin/native/installation_options'
8
+ require 'cocoapods-meitu-bin/gem_version'
9
+ # require 'cocoapods-meitu-bin/command/bin/archive'
10
+ require 'cocoapods-meitu-bin/helpers/buildAll/bin_helper'
11
+ require 'cocoapods-meitu-bin/config/config'
12
+
13
+ module Pod
14
+ class Resolver
15
+ if Pod.match_version?('~> 1.6')
16
+ # 其实不用到 resolver_specs_by_target 再改 spec
17
+ # 在这个方法里面,通过修改 dependency 的 source 应该也可以
18
+ # 就是有一点,如果改了之后,对应的 source 没有符合 dependency 的版本
19
+ # 分析依赖阶段就会报错了,没法像 resolver_specs_by_target 一样
20
+ # 没有对应的二进制版本时还可以转到源码源码
21
+ #
22
+ def aggregate_for_dependency(dependency)
23
+ sources_manager = Config.instance.sources_manager
24
+ if dependency&.podspec_repo
25
+ sources_manager.aggregate_for_dependency(dependency)
26
+ # 采用 lock 中的 source ,会导致插件对 source 的先后调整失效
27
+ # elsif (locked_vertex = @locked_dependencies.vertex_named(dependency.name)) && (locked_dependency = locked_vertex.payload) && locked_dependency.podspec_repo
28
+ # sources_manager.aggregate_for_dependency(locked_dependency)
29
+ else
30
+ @aggregate ||= Source::Aggregate.new(sources)
31
+ end
32
+ end
33
+ end
34
+
35
+ if Pod.match_version?('~> 1.4')
36
+ def specifications_for_dependency(dependency, additional_requirements_frozen = [])
37
+ additional_requirements = additional_requirements_frozen.dup.compact
38
+ requirement = Requirement.new(dependency.requirement.as_list + additional_requirements.flat_map(&:as_list))
39
+ if podfile.allow_prerelease? && !requirement.prerelease?
40
+ requirement = Requirement.new(dependency.requirement.as_list.map { |r| r + '.a' } + additional_requirements.flat_map(&:as_list))
41
+ end
42
+
43
+ options = if Pod.match_version?('~> 1.7')
44
+ podfile.installation_options
45
+ else
46
+ installation_options
47
+ end
48
+
49
+ if Pod.match_version?('~> 1.8')
50
+ specifications = find_cached_set(dependency)
51
+ .all_specifications(options.warn_for_multiple_pod_sources, requirement)
52
+ else
53
+ specifications = find_cached_set(dependency)
54
+ .all_specifications(options.warn_for_multiple_pod_sources)
55
+ .select { |s| requirement.satisfied_by? s.version }
56
+ end
57
+
58
+ specifications
59
+ .map { |s| s.subspec_by_name(dependency.name, false, true) }
60
+ .compact
61
+ end
62
+ end
63
+
64
+ if Pod.match_version?('~> 1.6')
65
+ alias old_valid_possibility_version_for_root_name? valid_possibility_version_for_root_name?
66
+
67
+ def valid_possibility_version_for_root_name?(requirement, activated, spec)
68
+ return true if podfile.allow_prerelease?
69
+
70
+ old_valid_possibility_version_for_root_name?(requirement, activated, spec)
71
+ end
72
+ elsif Pod.match_version?('~> 1.4')
73
+ def requirement_satisfied_by?(requirement, activated, spec)
74
+ version = spec.version
75
+ return false unless requirement.requirement.satisfied_by?(version)
76
+
77
+ shared_possibility_versions, prerelease_requirement = possibility_versions_for_root_name(requirement, activated)
78
+ if !shared_possibility_versions.empty? && !shared_possibility_versions.include?(version)
79
+ return false
80
+ end
81
+ if !podfile.allow_prerelease? && version.prerelease? && !prerelease_requirement
82
+ return false
83
+ end
84
+ unless spec_is_platform_compatible?(activated, requirement, spec)
85
+ return false
86
+ end
87
+
88
+ true
89
+ end
90
+ end
91
+
92
+ # 读取黑名单
93
+ def read_black_list
94
+ config_file = File.join(Pod::Config.instance.project_root, 'BinConfig.yaml')
95
+ return nil unless File.exist?(config_file)
96
+ config = YAML.load(File.open(config_file))
97
+ return nil if config.nil?
98
+ install_config = config['install_config']
99
+ return nil if install_config.nil?
100
+ install_config['black_list']
101
+ end
102
+
103
+ # >= 1.4.0 才有 resolver_specs_by_target 以及 ResolverSpecification
104
+ # >= 1.5.0 ResolverSpecification 才有 source,供 install 或者其他操作时,输入 source 变更
105
+ #
106
+ if Pod.match_version?('~> 1.4')
107
+ old_resolve = instance_method(:resolve)
108
+ define_method(:resolve) do
109
+ dependencies = @podfile_dependency_cache.target_definition_list.flat_map do |target|
110
+ @podfile_dependency_cache.target_definition_dependencies(target).each do |dep|
111
+ next unless target.platform
112
+ @platforms_by_dependency[dep].push(target.platform)
113
+ end
114
+ end.uniq
115
+ @platforms_by_dependency.each_value(&:uniq!)
116
+
117
+ # 遍历locked_dependencies,将二进制版本号的最后一位删掉
118
+ locked_dependencies.each do |value|
119
+ next if value.nil?
120
+ # 获取 Pod::Dependency
121
+ dep = value.payload
122
+ next if dep.external_source
123
+ # 修改版本号限制
124
+ requirements = dep.requirement.as_list.map do |req|
125
+ req_arr = req.split('.').delete_if { |r| r.include?('bin') }
126
+ req_arr.join('.')
127
+ end
128
+ # 重新生成 Pod::Dependency
129
+ dep = Dependency.new(dep.name, requirements, {:source => dep.podspec_repo, :external_source => dep.external_source})
130
+ value.payload = dep
131
+ end
132
+
133
+ start_time = Time.now
134
+ @activated = Molinillo::Resolver.new(self, self).resolve(dependencies, locked_dependencies)
135
+ UI.puts "Molinillo resolve耗时:#{'%.1f' % (Time.now - start_time)}s".green
136
+ resolver_specs_by_target
137
+ rescue Molinillo::ResolverError => e
138
+ handle_resolver_error(e)
139
+ end
140
+
141
+ old_resolver_specs_by_target = instance_method(:resolver_specs_by_target)
142
+ define_method(:resolver_specs_by_target) do
143
+ specs_by_target = old_resolver_specs_by_target.bind(self).call
144
+
145
+ sources_manager = Config.instance.sources_manager
146
+ use_source_pods = podfile.use_source_pods
147
+
148
+ # 从BinConfig读取black_list
149
+ black_list = read_black_list
150
+ use_source_pods.concat(black_list).uniq! unless black_list.nil?
151
+
152
+ specifications = specs_by_target.values.flatten.map(&:spec).uniq
153
+
154
+ missing_binary_specs = []
155
+ specs_by_target.each do |target, rspecs|
156
+ # use_binaries 并且 use_source_pods 不包含 本地可过滤
157
+ use_binary_rspecs = if podfile.use_binaries? || podfile.use_binaries_selector
158
+ rspecs.select do |rspec|
159
+ ([rspec.name, rspec.root.name] & use_source_pods).empty? &&
160
+ (podfile.use_binaries_selector.nil? || podfile.use_binaries_selector.call(rspec.spec))
161
+ end
162
+ else
163
+ []
164
+ end
165
+
166
+ # Parallel.map(rspecs, in_threads: 8) do |rspec|
167
+ specs_by_target[target] = rspecs.map do |rspec|
168
+ # 含有 subspecs 的组件暂不处理
169
+ # next rspec if rspec.spec.subspec? || rspec.spec.subspecs.any?
170
+
171
+ # developments 组件采用默认输入的 spec (development pods 的 source 为 nil)
172
+ # 可以使 :podspec => "htts://IMYFoundation.podspec"可以走下去,by slj
173
+ unless rspec.spec.respond_to?(:spec_source) && rspec.spec.spec_source
174
+ next rspec
175
+ end
176
+
177
+ # 采用二进制依赖并且不为开发组件
178
+ use_binary = use_binary_rspecs.include?(rspec)
179
+ if use_binary
180
+ source = sources_manager.binary_source
181
+ configuration = ENV['configuration'] || podfile.configuration
182
+ spec_version = version_helper.version(rspec.root.name, rspec.spec.version, specifications, configuration)
183
+ else
184
+ # 获取podfile中的source
185
+ podfile_sources = podfile.sources.uniq.map { |source| sources_manager.source_with_name_or_url(source) }
186
+ source = (sources_manager.code_source_list + podfile_sources).uniq.select do |s|
187
+ s.search(rspec.root.name)
188
+ end.first
189
+ spec_version = rspec.spec.version
190
+ end
191
+
192
+ raise Informative, "#{rspec.root.name}(#{spec_version})的podspec未找到,请执行 pod repo update 或添加相应的source源" unless source
193
+
194
+ # UI.message "------------------- 分界线 -----------------------"
195
+ # UI.message "- 开始处理 #{rspec.spec.name}(#{spec_version}) 组件(#{use_binary ? '二进制' : '源码'})."
196
+
197
+ begin
198
+ # 从新 source 中获取 spec,在bin archive中会异常,因为找不到
199
+ specification = source.specification(rspec.root.name, spec_version)
200
+
201
+ raise Informative, "Specification of #{rspec.root.name}(#{spec_version}) is nil" unless specification
202
+
203
+ UI.message "specification = #{specification}"
204
+ # 组件是 subspec
205
+ if rspec.spec.subspec?
206
+ specification = specification.subspec_by_name(rspec.name, false, true)
207
+ end
208
+
209
+ # 这里可能出现分析依赖的 source 和切换后的 source 对应 specification 的 subspec 对应不上
210
+ # 造成 subspec_by_name 返回 nil,这个是正常现象
211
+ next unless specification
212
+
213
+ used_by_only = if Pod.match_version?('~> 1.7')
214
+ rspec.used_by_non_library_targets_only
215
+ else
216
+ rspec.used_by_tests_only
217
+ end
218
+ # 组装新的 rspec ,替换原 rspec
219
+ rspec = if Pod.match_version?('~> 1.4.0')
220
+ ResolverSpecification.new(specification, used_by_only)
221
+ else
222
+ ResolverSpecification.new(specification, used_by_only, source)
223
+ end
224
+ # UI.message "组装新的 rspec ,替换原 rspec #{rspec.root.name} (#{spec_version}) specification = #{specification} #{rspec} "
225
+ rescue Pod::StandardError => e
226
+ # 没有从新的 source 找到对应版本组件,直接返回原 rspec
227
+ missing_binary_specs << rspec.spec if use_binary
228
+ # UI.message "【#{rspec.spec.name} | #{rspec.spec.version}】组件无对应源码版本 , 将采用二进制版本依赖.".red unless use_binary
229
+ rspec
230
+ end
231
+ rspec
232
+ end.compact
233
+ end
234
+
235
+ # if missing_binary_specs.any?
236
+ # missing_binary_specs.uniq.each do |spec|
237
+ # # UI.message "【#{spec.name} | #{spec.version}】组件无对应二进制版本 , 将采用源码依赖." unless spec.root.source[:type] == 'zip'
238
+ # end
239
+ # # 下面的代码为了实现 auto 命令的 --all-make
240
+ # Pod::Command::Bin::Archive.missing_binary_specs(missing_binary_specs)
241
+ # #缓存没有二进制组件到spec文件,local_psec_dir 目录
242
+ # sources_sepc = []
243
+ # des_dir = CBin::Config::Builder.instance.local_psec_dir
244
+ # FileUtils.rm_f(des_dir) if File.exist?des_dir
245
+ # Dir.mkdir des_dir unless File.exist?des_dir
246
+ # missing_binary_specs.uniq.each do |spec|
247
+ # # 排除subspec
248
+ # next if spec.name.include?('/')
249
+ #
250
+ # spec_git_res = false
251
+ # CBin::Config::Builder.instance.ignore_git_list.each do |ignore_git|
252
+ # spec_git_res = spec.source[:git] && spec.source[:git].include?(ignore_git)
253
+ # break if spec_git_res
254
+ # end
255
+ # next if spec_git_res
256
+ #
257
+ # #获取没有制作二进制版本的spec集合
258
+ # sources_sepc << spec
259
+ # unless spec.defined_in_file.nil?
260
+ # FileUtils.cp("#{spec.defined_in_file}", "#{des_dir}")
261
+ # end
262
+ # end
263
+ # end
264
+
265
+ specs_by_target
266
+ end
267
+ end
268
+
269
+ def version_helper
270
+ @version_helper ||= begin
271
+ CBin::BuildAll::BinHelper.new
272
+ end
273
+ end
274
+ end
275
+
276
+ if Pod.match_version?('~> 1.4.0')
277
+ # 1.4.0 没有 spec_source
278
+ class Specification
279
+ class Set
280
+ class LazySpecification < BasicObject
281
+ attr_reader :spec_source
282
+
283
+ old_initialize = instance_method(:initialize)
284
+ define_method(:initialize) do |name, version, source|
285
+ old_initialize.bind(self).call(name, version, source)
286
+
287
+ @spec_source = source
288
+ end
289
+
290
+ def respond_to?(method, include_all = false)
291
+ return super unless method == :spec_source
292
+
293
+ true
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,34 @@
1
+
2
+
3
+ module Pod
4
+ class Installer
5
+ class Analyzer
6
+ class SandboxAnalyzer
7
+ # def pod_changed?(pod)
8
+ # spec = root_spec(pod)
9
+ # 有 subspec 的情况下,root spec 对应的 used_files 可能始终为空
10
+ # 要添加为空 && 没有 subspec 的情况
11
+ # file_accessors = spec.available_platforms.map { |platform| Sandbox::FileAccessor.new(sandbox.pod_dir(pod), spec.consumer(platform)) }
12
+ # files = [
13
+ # file_accessors.map(&:vendored_frameworks),
14
+ # file_accessors.map(&:vendored_libraries),
15
+ # file_accessors.map(&:resource_bundle_files),
16
+ # file_accessors.map(&:prefix_header),
17
+ # file_accessors.map(&:resources),
18
+ # file_accessors.map(&:source_files),
19
+ # file_accessors.map(&:module_map),
20
+ # ]
21
+ # used_files = files.flatten.compact.map(&:to_s).uniq
22
+ # p pod if used_files.empty?
23
+
24
+ # return true if spec.version != sandbox_version(pod)
25
+ # return true if spec.checksum != sandbox_checksum(pod)
26
+ # return true if resolved_spec_names(pod) != sandbox_spec_names(pod)
27
+ # return true if sandbox.predownloaded?(pod)
28
+ # return true if folder_empty?(pod)
29
+ # false
30
+ # end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+
2
+
3
+ require 'cocoapods'
4
+
5
+ module Pod
6
+ class Source
7
+ # Returns the path of the specification with the given name and version.
8
+ #
9
+ # @param [String] name
10
+ # the name of the Pod.
11
+ #
12
+ # @param [Version,String] version
13
+ # the version for the specification.
14
+ #
15
+ # @return [Pathname] The path of the specification.
16
+ #
17
+ def specification_path(name, version)
18
+ raise ArgumentError, 'No name' unless name
19
+ raise ArgumentError, 'No version' unless version
20
+
21
+ path = pod_path(name) + version.to_s
22
+
23
+ specification_path = Specification::VALID_EXTNAME
24
+ .map { |extname| "#{name}#{extname}" }
25
+ .map { |file| path + file }
26
+ .find(&:exist?)
27
+
28
+ unless specification_path
29
+ raise StandardError, "Unable to find the specification #{name} " \
30
+ "(#{version}) in the #{self.name} source."
31
+ end
32
+ specification_path
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+
2
+
3
+ require 'cocoapods'
4
+ require 'cocoapods-meitu-bin/config/config'
5
+
6
+ module Pod
7
+ class Source
8
+ class Manager
9
+ # 源码 source list
10
+ def code_source_list
11
+ []
12
+ # CBin.config.code_repo_url_list.split(";").map { |source| source_with_name_or_url(source)}
13
+ end
14
+ # 二进制 source
15
+ def binary_source
16
+ source_with_name_or_url(CBin.config.binary_repo_url)
17
+ # source_with_name_or_url('git@github.com:Zhangyanshen/example-private-spec-bin.git')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+
2
+
3
+ require 'cocoapods-meitu-bin/native/sources_manager'
4
+
5
+ module Pod
6
+ class Specification
7
+ VALID_EXTNAME = %w[.binary.podspec.json .binary.podspec .podspec.json .podspec].freeze
8
+ DEFAULT_TEMPLATE_EXTNAME = %w[.binary-template.podspec .binary-template.podspec.json].freeze
9
+
10
+ # TODO
11
+ # 可以在这里根据组件依赖二进制或源码调整 sources 的先后顺序
12
+ # 如果是源码,则调整 code_source 到最前面
13
+ # 如果是二进制,则调整 binary_source 到最前面
14
+ # 这样 CocoaPods 分析时,就会优先获取到对应源的 podspec
15
+ #
16
+ # 先要把 Podfile 里面的配置数据保存到单例中,再在这里判断,就不需要 resolver 了
17
+ # 但是现在这个插件依旧可用,重构需要时间 = = ,没什么动力去重构了呀。。。
18
+ #
19
+ # class Set
20
+ # old_initialize = instance_method(:initialize)
21
+ # define_method(:initialize) do |name, sources|
22
+ # if name == 'TDFAdaptationKit'
23
+ # sources_manager = Pod::Config.instance.sources_manager
24
+ # # sources = [sources_manager.binary_source, *sources].uniq
25
+ # sources = [sources_manager.code_source, *sources].uniq
26
+ # end
27
+ # old_initialize.bind(self).call(name, sources)
28
+ # end
29
+ # end
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ module Pod
2
+ class Installer
3
+ class Xcode
4
+ # The {Xcode::TargetValidator} ensures that the pod and aggregate target
5
+ # configuration is valid for installation.
6
+ #
7
+ class TargetValidator
8
+
9
+
10
+
11
+ def verify_swift_pods_have_module_dependencies
12
+ error_messages = []
13
+ pod_targets.each do |pod_target|
14
+ next unless pod_target.uses_swift?
15
+
16
+ non_module_dependencies = []
17
+ pod_target.dependent_targets.each do |dependent_target|
18
+ next if !dependent_target.should_build? || dependent_target.defines_module?
19
+ non_module_dependencies << dependent_target.name
20
+ end
21
+
22
+ next if non_module_dependencies.empty?
23
+
24
+ error_messages << "The Swift pod `#{pod_target.name}` depends upon #{non_module_dependencies.map { |d| "`#{d}`" }.to_sentence}, " \
25
+ "which #{non_module_dependencies.count == 1 ? 'does' : 'do'} not define modules. " \
26
+ 'To opt into those targets generating module maps '\
27
+ '(which is necessary to import them from Swift when building as static libraries), ' \
28
+ 'you may set `use_modular_headers!` globally in your Podfile, '\
29
+ 'or specify `:modular_headers => true` for particular dependencies.'
30
+ end
31
+ return false
32
+
33
+ # raise Informative, 'The following Swift pods cannot yet be integrated '\
34
+ # "as static libraries:\n\n#{error_messages.join("\n\n")}"
35
+ end
36
+
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,40 @@
1
+
2
+
3
+ module Pod
4
+ class Validator
5
+ # def validate_source_url(spec)
6
+ # return if spec.source.nil? || spec.source[:http].nil?
7
+ # url = URI(spec.source[:http])
8
+ # return if url.scheme == 'https' || url.scheme == 'file'
9
+ # warning('http', "The URL (`#{url}`) doesn't use the encrypted HTTPs protocol. " \
10
+ # 'It is crucial for Pods to be transferred over a secure protocol to protect your users from man-in-the-middle attacks. '\
11
+ # 'This will be an error in future releases. Please update the URL to use https.')
12
+ # end
13
+ #
14
+ # Perform analysis for a given spec (or subspec)
15
+ #
16
+ def perform_extensive_analysis(spec)
17
+ return true
18
+ end
19
+
20
+ #覆盖
21
+ def check_file_patterns
22
+ FILE_PATTERNS.each do |attr_name|
23
+ next if %i(source_files resources).include? attr_name
24
+ if respond_to?("_validate_#{attr_name}", true)
25
+ send("_validate_#{attr_name}")
26
+ else
27
+ validate_nonempty_patterns(attr_name, :error)
28
+ end
29
+ end
30
+
31
+ _validate_header_mappings_dir
32
+ if consumer.spec.root?
33
+ _validate_license
34
+ _validate_module_map
35
+ end
36
+ end
37
+
38
+ def validate_source_url(spec); end
39
+ end
40
+ end
@@ -0,0 +1,26 @@
1
+ require 'cocoapods'
2
+ require 'cocoapods-meitu-bin/gem_version'
3
+
4
+ if Pod.match_version?('~> 1.4')
5
+ require 'cocoapods-meitu-bin/native/podfile'
6
+ require 'cocoapods-meitu-bin/native/installation_options'
7
+ require 'cocoapods-meitu-bin/native/specification'
8
+ require 'cocoapods-meitu-bin/native/path_source'
9
+ require 'cocoapods-meitu-bin/native/analyzer'
10
+ require 'cocoapods-meitu-bin/native/installer'
11
+ require 'cocoapods-meitu-bin/native/podfile_generator'
12
+ require 'cocoapods-meitu-bin/native/pod_source_installer'
13
+ require 'cocoapods-meitu-bin/native/linter'
14
+ require 'cocoapods-meitu-bin/native/resolver'
15
+ require 'cocoapods-meitu-bin/native/source'
16
+ require 'cocoapods-meitu-bin/native/validator'
17
+ require 'cocoapods-meitu-bin/native/acknowledgements'
18
+ require 'cocoapods-meitu-bin/native/sandbox_analyzer'
19
+ require 'cocoapods-meitu-bin/native/podspec_finder'
20
+ require 'cocoapods-meitu-bin/native/file_accessor'
21
+ require 'cocoapods-meitu-bin/native/pod_target_installer'
22
+ require 'cocoapods-meitu-bin/native/target_validator'
23
+ require 'cocoapods-meitu-bin/native/gen'
24
+ require 'cocoapods-meitu-bin/native/lockfile'
25
+
26
+ end
@@ -0,0 +1,68 @@
1
+ require 'cocoapods-meitu-bin/native/sources_manager'
2
+ require 'cocoapods-meitu-bin/command/bin/repo/update'
3
+ require 'cocoapods-meitu-bin/config/config'
4
+ require 'cocoapods/user_interface'
5
+ require 'yaml'
6
+
7
+ Pod::HooksManager.register('cocoapods-meitu-bin', :pre_install) do |_context, _|
8
+ require 'cocoapods-meitu-bin/native'
9
+ require 'cocoapods-meitu-bin/helpers/buildAll/bin_helper'
10
+
11
+ Pod::UI.puts "当前configuration: `#{ENV['configuration'] || Pod::Config.instance.podfile.configuration}`".green
12
+
13
+ # pod bin repo update 更新二进制私有源
14
+ Pod::Command::Bin::Repo::Update.new(CLAide::ARGV.new($ARGV)).run
15
+
16
+ # 有插件/本地库 且是dev环境下,默认进入源码白名单 过滤 archive命令
17
+ if _context.podfile.plugins.keys.include?('cocoapods-meitu-bin') && _context.podfile.configuration_env == 'dev'
18
+ dependencies = _context.podfile.dependencies
19
+ dependencies.each do |d|
20
+ next unless d.respond_to?(:external_source) &&
21
+ d.external_source.is_a?(Hash) &&
22
+ !d.external_source[:path].nil? &&
23
+ $ARGV[1] != 'archive'
24
+ _context.podfile.set_use_source_pods d.name
25
+ end
26
+ end
27
+
28
+ # 同步 BinPodfile 文件
29
+ project_root = Pod::Config.instance.project_root
30
+ path = File.join(project_root.to_s, 'BinPodfile')
31
+
32
+ next unless File.exist?(path)
33
+
34
+ contents = File.open(path, 'r:utf-8', &:read)
35
+ podfile = Pod::Config.instance.podfile
36
+ podfile.instance_eval do
37
+ begin
38
+ eval(contents, nil, path)
39
+ rescue Exception => e
40
+ message = "Invalid `#{path}` file: #{e.message}"
41
+ raise Pod::DSLError.new(message, path, e, contents)
42
+ end
43
+ end
44
+ end
45
+
46
+ Pod::HooksManager.register('cocoapods-meitu-bin', :source_provider) do |context, _|
47
+ sources_manager = Pod::Config.instance.sources_manager
48
+ podfile = Pod::Config.instance.podfile
49
+ if podfile
50
+ # 读取配置文件
51
+ config_file = File.join(Pod::Config.instance.project_root, 'BinConfig.yaml')
52
+ if File.exist?(config_file)
53
+ config = YAML.load(File.open(config_file))
54
+ unless config.nil?
55
+ build_config = config['install_config'] || {}
56
+ use_binary = build_config['use_binary'] || false
57
+ podfile.use_binaries!(use_binary) if use_binary
58
+ end
59
+ end
60
+ # 添加源码私有源 && 二进制私有源
61
+ added_sources = sources_manager.code_source_list
62
+ # if podfile.use_binaries? || podfile.use_binaries_selector
63
+ # added_sources << sources_manager.binary_source
64
+ # added_sources.reverse!
65
+ # end
66
+ added_sources.each { |source| context.add_source(source)}
67
+ end
68
+ end
@@ -0,0 +1,2 @@
1
+ require 'cocoapods-meitu-bin/gem_version'
2
+ require 'cocoapods-meitu-bin/native/sources_manager'
@@ -0,0 +1,11 @@
1
+ require 'cocoapods-meitu-bin/command'
2
+ require 'cocoapods-meitu-bin/source_provider_hook'
3
+ # require 'cocoapods-meitu-bin/gem_version'
4
+ #
5
+ # msg = <<-MSG
6
+ # ————————————————————————————————
7
+ # |#{'cocoapods-meitu-bin'.center(30)}|
8
+ # |#{CBin::VERSION.center(30)}|
9
+ # ————————————————————————————————
10
+ # MSG
11
+ # Pod::UI.puts msg.red
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ module Pod
4
+ describe Command::Bin do
5
+ describe 'CLAide' do
6
+ it 'registers it self' do
7
+ Command.parse(%w{ bin }).should.be.instance_of Command::Bin
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,50 @@
1
+ require 'pathname'
2
+ ROOT = Pathname.new(File.expand_path('../../', __FILE__))
3
+ $:.unshift((ROOT + 'lib').to_s)
4
+ $:.unshift((ROOT + 'spec').to_s)
5
+
6
+ require 'bundler/setup'
7
+ require 'bacon'
8
+ require 'mocha-on-bacon'
9
+ require 'pretty_bacon'
10
+ require 'pathname'
11
+ require 'cocoapods'
12
+
13
+ Mocha::Configuration.prevent(:stubbing_non_existent_method)
14
+
15
+ require 'cocoapods_plugin'
16
+
17
+ #-----------------------------------------------------------------------------#
18
+
19
+ module Pod
20
+
21
+ # Disable the wrapping so the output is deterministic in the tests.
22
+ #
23
+ UI.disable_wrap = true
24
+
25
+ # Redirects the messages to an internal store.
26
+ #
27
+ module UI
28
+ @output = ''
29
+ @warnings = ''
30
+
31
+ class << self
32
+ attr_accessor :output
33
+ attr_accessor :warnings
34
+
35
+ def puts(message = '')
36
+ @output << "#{message}\n"
37
+ end
38
+
39
+ def warn(message = '', actions = [])
40
+ @warnings << "#{message}\n"
41
+ end
42
+
43
+ def print(message)
44
+ @output << message
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ #-----------------------------------------------------------------------------#