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,104 @@
1
+
2
+
3
+ # copy from https://github.com/CocoaPods/cocoapods-packager
4
+
5
+ require 'cocoapods-meitu-bin/native/podfile'
6
+ require 'cocoapods/command/gen'
7
+ require 'cocoapods/generate'
8
+ require 'cocoapods-meitu-bin/helpers/framework_builder'
9
+ require 'cocoapods-meitu-bin/helpers/library_builder'
10
+ require 'cocoapods-meitu-bin/helpers/sources_helper'
11
+ require 'cocoapods-meitu-bin/command/bin/repo/push'
12
+ require 'json'
13
+
14
+ module CBin
15
+ class Upload
16
+ class Helper
17
+ include CBin::SourcesHelper
18
+
19
+ def initialize(spec,code_dependencies,sources)
20
+ @spec = spec
21
+ @code_dependencies = code_dependencies
22
+ @sources = sources
23
+ end
24
+
25
+ # 创建binary-template.podsepc
26
+ # 上传二进制文件
27
+ # 上传二进制 podspec
28
+ def upload
29
+ Dir.chdir(CBin::Config::Builder.instance.root_dir) do
30
+ # 上传zip包
31
+ res_zip = curl_zip
32
+ if res_zip
33
+ # 创建二进制podspec
34
+ filename = spec_creator
35
+ # 上传二进制 podspec
36
+ push_binary_repo(filename)
37
+ end
38
+ res_zip
39
+ end
40
+ end
41
+
42
+ # 创建二进制podspec
43
+ def spec_creator
44
+ spec_creator = CBin::SpecificationSource::Creator.new(@spec)
45
+ # 创建二进制podspec
46
+ spec_creator.create
47
+ # 将二进制podspec写入文件
48
+ spec_creator.write_spec_file
49
+ # 返回二进制podspec文件路径
50
+ spec_creator.filename
51
+ end
52
+
53
+ # 推送二进制
54
+ # curl http://ci.xxx:9192/frameworks -F "name=IMYFoundation" -F "version=7.7.4.2" -F "annotate=IMYFoundation_7.7.4.2_log" -F "file=@bin_zip/bin_IMYFoundation_7.7.4.2.zip"
55
+ def curl_zip
56
+ # output_name = File.join(CBin::Config::Builder.instance.zip_dir, CBin::Config::Builder.instance.framework_name_zip)
57
+ zip_file = "#{CBin::Config::Builder.instance.library_file(@spec)}.zip"
58
+ res = File.exist?(zip_file)
59
+ unless res
60
+ zip_file = CBin::Config::Builder.instance.framework_zip_file(@spec) + ".zip"
61
+ res = File.exist?(zip_file)
62
+ end
63
+ if res
64
+ Pod::UI.title "Uploading binary zip file #{@spec.name} (#{@spec.version})" do
65
+ command = "curl -F \"name=#{@spec.module_name}\" -F \"version=#{@spec.version}\" -F \"file=@#{zip_file}\" #{CBin.config.binary_upload_url_str}"
66
+ Pod::UI.info "#{command}"
67
+ json = `#{command}`
68
+ Pod::UI.info json
69
+ error_code = JSON.parse(json)["error_code"]
70
+ if error_code == 0
71
+ Pod::UI.info "#{@spec.name} (#{@spec.version}) 上传成功".green
72
+ else
73
+ Pod::UI.info "#{@spec.name} (#{@spec.version}) 上传失败".red
74
+ raise Informative, "#{@spec.name} (#{@spec.version}) 上传失败"
75
+ end
76
+ end
77
+ end
78
+ res
79
+ end
80
+
81
+ # 上传二进制 podspec
82
+ def push_binary_repo(binary_podsepc_json)
83
+ argvs = [
84
+ "#{binary_podsepc_json}",
85
+ "--binary",
86
+ "--sources=#{sources_option(@code_dependencies, @sources)},https:\/\/cdn.cocoapods.org",
87
+ "--skip-import-validation",
88
+ "--use-libraries",
89
+ "--allow-warnings",
90
+ "--verbose",
91
+ "--code-dependencies"
92
+ ]
93
+ if @verbose
94
+ argvs += ['--verbose']
95
+ end
96
+
97
+ push = Pod::Command::Bin::Repo::Push.new(CLAide::ARGV.new(argvs))
98
+ push.validate!
99
+ push.run
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,5 @@
1
+ require 'cocoapods-meitu-bin/helpers/sources_helper'
2
+ require 'cocoapods-meitu-bin/helpers/spec_creator'
3
+ require 'cocoapods-meitu-bin/helpers/spec_files_helper'
4
+ require 'cocoapods-meitu-bin/helpers/spec_source_creator'
5
+ require 'cocoapods-meitu-bin/helpers/build_utils'
@@ -0,0 +1,27 @@
1
+
2
+
3
+ module Pod
4
+ module Generator
5
+ class Acknowledgements
6
+ def license_text(spec)
7
+ return nil unless spec.license
8
+
9
+ text = spec.license[:text]
10
+ unless text
11
+ if license_file = spec.license[:file]
12
+ license_path = file_accessor(spec).root + license_file
13
+ if File.exist?(license_path)
14
+ text = IO.read(license_path)
15
+ else
16
+ # UI.warn "Unable to read the license file `#{license_file}` " \
17
+ # "for the spec `#{spec}`"
18
+ end
19
+ elsif license_file = file_accessor(spec).license
20
+ text = IO.read(license_file)
21
+ end
22
+ end
23
+ text
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,109 @@
1
+
2
+ require 'parallel'
3
+ require 'cocoapods'
4
+
5
+ module Pod
6
+ class Installer
7
+ class Analyzer
8
+ alias old_fetch_external_sources fetch_external_sources
9
+ def fetch_external_sources(podfile_state)
10
+ verify_no_pods_with_different_sources!
11
+ deps = dependencies_to_fetch(podfile_state)
12
+ pods = pods_to_fetch(podfile_state)
13
+ return if deps.empty?
14
+ UI.section 'Fetching external sources' do
15
+ if installation_options.install_with_multi_threads
16
+ thread_count = installation_options.multi_threads_count
17
+ Parallel.each(deps.sort, in_threads: thread_count) do |dependency|
18
+ fetch_external_source(dependency, !pods.include?(dependency.root_name))
19
+ end
20
+ else
21
+ deps.sort.each do |dependency|
22
+ fetch_external_source(dependency, !pods.include?(dependency.root_name))
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ # > 1.6.0
29
+ # all_specs[dep.name] 为 nil 会崩溃
30
+ # 主要原因是 all_specs 分析错误
31
+ # 查看 source 是否正确
32
+ #
33
+ # def dependencies_for_specs(specs, platform, all_specs)
34
+ # return [] if specs.empty? || all_specs.empty?
35
+
36
+ # dependent_specs = Set.new
37
+
38
+ # specs.each do |s|
39
+ # s.dependencies(platform).each do |dep|
40
+ # all_specs[dep.name].each do |spec|
41
+ # dependent_specs << spec
42
+ # end
43
+ # end
44
+ # end
45
+
46
+ # dependent_specs - specs
47
+ # end
48
+
49
+ # > 1.5.3 版本
50
+ # rewrite update_repositories
51
+ #
52
+ alias old_update_repositories update_repositories
53
+ def update_repositories
54
+ if installation_options.update_source_with_multi_threads
55
+ # 并发更新私有源
56
+ # 这里多线程会导致 pod update 额外输出 --verbose 的内容
57
+ # 不知道为什么?
58
+ thread_count = installation_options.multi_threads_count
59
+ Parallel.each(sources.uniq(&:url), in_threads: thread_count) do |source|
60
+ if source.updateable?
61
+ sources_manager.update(source.name, true)
62
+ else
63
+ UI.message "Skipping `#{source.name}` update because the repository is not an updateable repository."
64
+ end
65
+ end
66
+ @specs_updated = true
67
+ else
68
+ old_update_repositories
69
+ end
70
+ end
71
+
72
+ # 解决 dep.name = xxx/binary 时,all_specs[dep.name] 返回nil,导致调用 each 方法报错
73
+ alias old_dependencies_for_specs dependencies_for_specs
74
+ def dependencies_for_specs(specs, platform, all_specs)
75
+ dependent_specs = {
76
+ :debug => Set.new,
77
+ :release => Set.new,
78
+ }
79
+
80
+ podfile = Pod::Config.instance.podfile
81
+
82
+ if !specs.empty? && !all_specs.empty?
83
+ specs.each do |s|
84
+ s.dependencies(platform).each do |dep|
85
+ # use_binary = podfile.use_binaries? && !podfile.use_source_pods.include?(dep.root_name)
86
+ # key = use_binary ? dep.root_name : dep.name
87
+ all_specs[dep.name].each do |spec|
88
+ if spec.non_library_specification?
89
+ if s.test_specification? && spec.name == s.consumer(platform).app_host_name && spec.app_specification?
90
+ # This needs to be handled separately, since we _don't_ want to treat this as a "normal" dependency
91
+ next
92
+ end
93
+ raise Informative, "`#{s}` depends upon `#{spec}`, which is a `#{spec.spec_type}` spec."
94
+ end
95
+
96
+ dependent_specs.each do |config, set|
97
+ next unless s.dependency_whitelisted_for_configuration?(dep, config)
98
+ set << spec
99
+ end
100
+ end unless all_specs[dep.name].nil? # 解决 dep.name = xxx/binary 时,all_specs[dep.name]返回的是nil,导致调用 each 方法报错
101
+ end
102
+ end
103
+ end
104
+
105
+ Hash[dependent_specs.map { |k, v| [k, (v - specs).group_by(&:root)] }].freeze
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,28 @@
1
+ require 'macho'
2
+ require 'cocoapods'
3
+
4
+ module Pod
5
+ class Sandbox
6
+ class FileAccessor
7
+
8
+ # swift动态库 需要设置为true
9
+ def dynamic_binary?(binary)
10
+ @cached_dynamic_binary_results ||= {}
11
+ return @cached_dynamic_binary_results[binary] unless @cached_dynamic_binary_results[binary].nil?
12
+ return false unless binary.file?
13
+
14
+ @cached_dynamic_binary_results[binary] = MachO.open(binary).dylib?
15
+ rescue MachO::MachOError
16
+ @cached_dynamic_binary_results[binary] = true
17
+
18
+ end
19
+
20
+ # def expanded_paths(patterns, options = {})
21
+ # return [] if patterns.empty?
22
+ # path_list.glob(patterns, options).flatten.compact.uniq
23
+ # end
24
+
25
+ #-----------------------------------------------------------------------#
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,79 @@
1
+
2
+ # hook cocoapods-generate的Gen类和Installer类
3
+
4
+ module Pod
5
+ class Command
6
+ class Gen < Command
7
+
8
+ alias old_run run
9
+
10
+ def run
11
+ UI.puts "[pod gen] Running with #{configuration.to_s.gsub("\n", " \n")}" if configuration.pod_config.verbose?
12
+
13
+ # this is done here rather than in the installer so we only update sources once,
14
+ # even if there are multiple podspecs
15
+ update_sources if configuration.repo_update?
16
+
17
+ installers = []
18
+ Generate::PodfileGenerator.new(configuration).podfiles_by_spec.each do |spec, podfile|
19
+ installer = Generate::Installer.new(configuration, spec, podfile).install!
20
+ installers << installer
21
+ end
22
+
23
+ remove_warnings(UI.warnings)
24
+
25
+ installers
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module Pod
32
+ module Generate
33
+ class Installer
34
+
35
+ alias old_install! install!
36
+
37
+ def install!
38
+ UI.title "Generating #{spec.name} in #{UI.path install_directory}" do
39
+ clean! if configuration.clean?
40
+ install_directory.mkpath
41
+
42
+ UI.message 'Creating stub application' do
43
+ create_app_project
44
+ end
45
+
46
+ UI.message 'Writing Podfile' do
47
+ podfile.defined_in_file.open('w') { |f| f << podfile.to_yaml }
48
+ end
49
+
50
+ installer = nil
51
+ UI.section 'Installing...' do
52
+ configuration.pod_config.with_changes(installation_root: install_directory, podfile: podfile,
53
+ lockfile: configuration.lockfile, sandbox: nil,
54
+ sandbox_root: install_directory + 'Pods',
55
+ podfile_path: podfile.defined_in_file,
56
+ silent: !configuration.pod_config.verbose?, verbose: false,
57
+ lockfile_path: nil) do
58
+ installer = ::Pod::Installer.new(configuration.pod_config.sandbox, podfile, configuration.lockfile)
59
+ installer.use_default_plugins = configuration.use_default_plugins
60
+ installer.install!
61
+ end
62
+ end
63
+
64
+ UI.section 'Performing post-installation steps' do
65
+ should_perform_post_install = if installer.respond_to?(:generated_aggregate_targets) # CocoaPods 1.7.0
66
+ !installer.generated_aggregate_targets.empty?
67
+ else
68
+ true
69
+ end
70
+ perform_post_install_steps(open_app_project, installer) if should_perform_post_install
71
+ end
72
+
73
+ print_post_install_message
74
+ installer
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,28 @@
1
+
2
+ require 'cocoapods'
3
+
4
+ module Pod
5
+ class Installer
6
+ class InstallationOptions
7
+ def self.env_option(key, default = true)
8
+ option key, ENV[key.to_s].nil? ? default : ENV[key.to_s] == 'true'
9
+ end
10
+
11
+ # 不同 source 存在相同 spec 名时,默认不警告
12
+ defaults.delete('warn_for_multiple_pod_sources')
13
+ env_option :warn_for_multiple_pod_sources, false
14
+
15
+ # 是否警告不安全 source (如 http )
16
+ env_option :warn_for_unsecure_source, false
17
+
18
+ # 是否多线程执行 install_pod_sources
19
+ env_option :install_with_multi_threads, false
20
+
21
+ # 是否多进程执行 update_repositories
22
+ env_option :update_source_with_multi_threads, false
23
+
24
+ # 并发执行个数
25
+ option :multi_threads_count, 4
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,259 @@
1
+ require 'cocoapods/installer/project_cache/target_metadata.rb'
2
+ require 'parallel'
3
+ require 'cocoapods'
4
+ require 'xcodeproj'
5
+ require 'cocoapods-meitu-bin/native/pod_source_installer'
6
+ require 'cocoapods-meitu-bin/helpers/pod_size_helper'
7
+
8
+ module Pod
9
+ class Installer
10
+ alias mtxx_create_analyzer create_analyzer
11
+ def create_analyzer(plugin_sources = nil)
12
+ # 修复MBox下即使存在Podfile.lock依赖分析依然很慢的问题
13
+ if !lockfile.nil? && lockfile.internal_data.empty?
14
+ @lockfile = Lockfile.from_file(config.lockfile_path) if config.lockfile_path
15
+ end
16
+ mtxx_create_analyzer(plugin_sources)
17
+ end
18
+
19
+ def cost_time_hash
20
+ @cost_time_hash ||= begin
21
+ Hash.new
22
+ end
23
+ end
24
+
25
+ # TODO: 不知道为啥无法hook
26
+ # 准备
27
+ alias old_prepare prepare
28
+ def prepare
29
+ start_time = Time.now
30
+ old_prepare
31
+ cost_time_hash['prepare'] = Time.now - start_time
32
+ end
33
+
34
+ # 依赖分析
35
+ alias old_resolve_dependencies resolve_dependencies
36
+ def resolve_dependencies
37
+ start_time = Time.now
38
+ analyzer = old_resolve_dependencies
39
+ cost_time_hash['resolve_dependencies'] = Time.now - start_time
40
+ analyzer
41
+ end
42
+
43
+ # 依赖下载
44
+ alias old_download_dependencies download_dependencies
45
+ def download_dependencies
46
+ start_time = Time.now
47
+ old_download_dependencies
48
+ cost_time_hash['download_dependencies'] = Time.now - start_time
49
+ end
50
+
51
+ # 验证target
52
+ alias old_validate_targets validate_targets
53
+ def validate_targets
54
+ start_time = Time.now
55
+ old_validate_targets
56
+ cost_time_hash['validate_targets'] = Time.now - start_time
57
+ end
58
+
59
+ # 集成
60
+ alias old_integrate integrate
61
+ def integrate
62
+ start_time = Time.now
63
+ old_integrate
64
+ cost_time_hash['integrate'] = Time.now - start_time
65
+ end
66
+
67
+ # 写入lock文件
68
+ def write_lockfiles
69
+ start_time = Time.now
70
+ @lockfile = generate_lockfile
71
+
72
+ UI.message "- Writing Lockfile in #{UI.path config.lockfile_path}" do
73
+ # No need to invoke Sandbox#update_changed_file here since this logic already handles checking if the
74
+ # contents of the file are the same.
75
+ @lockfile.write_to_disk(config.lockfile_path)
76
+ end
77
+
78
+ UI.message "- Writing Manifest in #{UI.path sandbox.manifest_path}" do
79
+ # No need to invoke Sandbox#update_changed_file here since this logic already handles checking if the
80
+ # contents of the file are the same.
81
+ @lockfile.write_to_disk(sandbox.manifest_path)
82
+ end
83
+ cost_time_hash['write_lockfiles'] = Time.now - start_time
84
+ end
85
+
86
+ # 执行post install
87
+ alias old_perform_post_install_actions perform_post_install_actions
88
+ def perform_post_install_actions
89
+ start_time = Time.now
90
+ old_perform_post_install_actions
91
+ cost_time_hash['perform_post_install_actions'] = Time.now - start_time
92
+ # 打印有多少个源码库,多少二进制库
93
+ print_source_bin_statistics
94
+ # 打印耗时
95
+ print_cost_time
96
+ # 打印大小大于阈值的库
97
+ CBin::PodSize.print_pods
98
+ end
99
+
100
+ # 打印有多少个源码库,多少二进制库
101
+ def print_source_bin_statistics
102
+ source_pods = []
103
+ bin_pods = []
104
+ @pod_targets.map do |target|
105
+ if target.should_build?
106
+ source_pods << target
107
+ else
108
+ bin_pods << target
109
+ end
110
+ end
111
+ UI.puts "\n总共有 #{@pod_targets.size} 个Pod库,二进制有 #{bin_pods.size} 个,源码有 #{source_pods.size} 个".green
112
+ # 打印二进制库
113
+ if ENV['statistics_bin'] == '1'
114
+ UI.puts "二进制库:".green
115
+ UI.puts bin_pods
116
+ end
117
+ # 打印源码库
118
+ if ENV['statistics_source'] == '1'
119
+ UI.puts "源码库:".green
120
+ UI.puts source_pods
121
+ end
122
+ end
123
+
124
+ # 打印耗时
125
+ def print_cost_time
126
+ prefix = 'pod_time_profiler:'
127
+ UI.title "#{prefix} pod执行耗时:".green do
128
+ UI.info "#{prefix} ———————————————————————————————————————————————".green
129
+ UI.info "#{prefix} |#{'Stage'.center(30)}|#{'Time(s)'.center(15)}|".green
130
+ UI.info "#{prefix} ———————————————————————————————————————————————".green
131
+ cost_time_hash.each do |key, value|
132
+ UI.info "#{prefix} |#{key.center(30)}|#{('%.3f' % value).to_s.center(15)}|".green
133
+ end
134
+ UI.info "#{prefix} ———————————————————————————————————————————————".green
135
+ end
136
+ end
137
+
138
+ alias old_create_pod_installer create_pod_installer
139
+ def create_pod_installer(pod_name)
140
+ installer = old_create_pod_installer(pod_name)
141
+ installer.installation_options = installation_options
142
+ installer
143
+ end
144
+
145
+ alias old_install_pod_sources install_pod_sources
146
+ def install_pod_sources
147
+ if installation_options.install_with_multi_threads
148
+ install_pod_sources_with_multiple_threads
149
+ else
150
+ old_install_pod_sources
151
+ end
152
+ end
153
+
154
+ # 多线程下载
155
+ def install_pod_sources_with_multiple_threads
156
+ @installed_specs = []
157
+ pods_to_install = sandbox_state.added | sandbox_state.changed
158
+ title_options = { :verbose_prefix => '-> '.green }
159
+ thread_count = installation_options.multi_threads_count
160
+ Parallel.each(root_specs.sort_by(&:name), in_threads: thread_count) do |spec|
161
+ if pods_to_install.include?(spec.name)
162
+ if sandbox_state.changed.include?(spec.name) && sandbox.manifest
163
+ current_version = spec.version
164
+ previous_version = sandbox.manifest.version(spec.name)
165
+ has_changed_version = current_version != previous_version
166
+ current_repo = analysis_result.specs_by_source.detect { |key, values| break key if values.map(&:name).include?(spec.name) }
167
+ current_repo &&= (Pod::TrunkSource::TRUNK_REPO_NAME if current_repo.name == Pod::TrunkSource::TRUNK_REPO_NAME) || current_repo.url || current_repo.name
168
+ previous_spec_repo = sandbox.manifest.spec_repo(spec.name)
169
+ has_changed_repo = !previous_spec_repo.nil? && current_repo && !current_repo.casecmp(previous_spec_repo).zero?
170
+ title = "Installing #{spec.name} #{spec.version}"
171
+ title << " (was #{previous_version} and source changed to `#{current_repo}` from `#{previous_spec_repo}`)" if has_changed_version && has_changed_repo
172
+ title << " (was #{previous_version})" if has_changed_version && !has_changed_repo
173
+ title << " (source changed to `#{current_repo}` from `#{previous_spec_repo}`)" if !has_changed_version && has_changed_repo
174
+ else
175
+ title = "Installing #{spec}"
176
+ end
177
+ UI.titled_section(title.green, title_options) do
178
+ install_source_of_pod(spec.name)
179
+ end
180
+ else
181
+ UI.section("Using #{spec}", title_options[:verbose_prefix]) do
182
+ create_pod_installer(spec.name)
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ # alias old_write_lockfiles write_lockfiles
189
+ # def write_lockfiles
190
+ # old_write_lockfiles
191
+ # if File.exist?('Podfile_local')
192
+ #
193
+ # project = Xcodeproj::Project.open(config.sandbox.project_path)
194
+ # #获取主group
195
+ # group = project.main_group
196
+ # group.set_source_tree('SOURCE_ROOT')
197
+ # #向group中添加 文件引用
198
+ # file_ref = group.new_reference(config.sandbox.root + '../Podfile_local')
199
+ # #podfile_local排序
200
+ # podfile_local_group = group.children.last
201
+ # group.children.pop
202
+ # group.children.unshift(podfile_local_group)
203
+ # #保存
204
+ # project.save
205
+ # end
206
+ # end
207
+ end
208
+
209
+ module Downloader
210
+ class Cache
211
+ require 'cocoapods-meitu-bin/helpers/pod_size_helper'
212
+ # 多线程锁
213
+ @@lock = Mutex.new
214
+
215
+ # 后面如果要切到进程的话,可以在 cache root 里面新建一个文件
216
+ # 利用这个文件 lock
217
+ # https://stackoverflow.com/questions/23748648/using-fileflock-as-ruby-global-lock-mutex-for-processes
218
+
219
+ # rmtree 在多进程情况下可能 Directory not empty @ dir_s_rmdir 错误
220
+ # old_ensure_matching_version 会移除不是同一个 CocoaPods 版本的组件缓存
221
+ alias old_ensure_matching_version ensure_matching_version
222
+ def ensure_matching_version
223
+ @@lock.synchronize do
224
+ version_file = root + 'VERSION'
225
+ # version = version_file.read.strip if version_file.file?
226
+
227
+ # root.rmtree if version != Pod::VERSION && root.exist?
228
+ root.mkpath
229
+
230
+ version_file.open('w') { |f| f << Pod::VERSION }
231
+ end
232
+ end
233
+
234
+ def uncached_pod(request)
235
+ in_tmpdir do |target|
236
+ result, podspecs = download(request, target)
237
+ result.location = nil
238
+
239
+ # 记录下载大小大于阈值的库及大小
240
+ if File.exist?(target.to_s)
241
+ dir_size = `du -sk #{target.to_s}`.strip().split(' ')[0]
242
+ CBin::PodSize.add_pod({:name => request.name, :size => dir_size})
243
+ end
244
+
245
+ podspecs.each do |name, spec|
246
+ destination = path_for_pod(request, :name => name, :params => result.checkout_options)
247
+ copy_and_clean(target, destination, spec)
248
+ write_spec(spec, path_for_spec(request, :name => name, :params => result.checkout_options))
249
+ if request.name == name
250
+ result.location = destination
251
+ end
252
+ end
253
+
254
+ result
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,26 @@
1
+
2
+
3
+ require 'cocoapods-meitu-bin/native/specification'
4
+
5
+ module Pod
6
+ class Specification
7
+ class Linter
8
+ # !@group Lint steps
9
+
10
+ # Checks that the spec's root name matches the filename.
11
+ #
12
+ # @return [void]
13
+ #
14
+ def validate_root_name
15
+ if spec.root.name && file
16
+ acceptable_names = Specification::VALID_EXTNAME.map { |extname| "#{spec.root.name}#{extname}" }
17
+ names_match = acceptable_names.include?(file.basename.to_s)
18
+ unless names_match
19
+ results.add_error('name', 'The name of the spec should match the ' \
20
+ 'name of the file.')
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end