cocoapods-meitu-bin 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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