cocoapods-pdk8 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +13 -0
- data/cocoapods-pdk8.gemspec +23 -0
- data/lib/cocoapods-pdk8.rb +1 -0
- data/lib/cocoapods-pdk8/command.rb +1 -0
- data/lib/cocoapods-pdk8/command/pdk8.rb +44 -0
- data/lib/cocoapods-pdk8/gem_version.rb +3 -0
- data/lib/cocoapods-pdk8/hook.rb +9 -0
- data/lib/cocoapods-pdk8/hook/analyzer.rb +25 -0
- data/lib/cocoapods-pdk8/hook/download.rb +21 -0
- data/lib/cocoapods-pdk8/hook/installer.rb +300 -0
- data/lib/cocoapods-pdk8/hook/installer/pod_source_installer.rb +29 -0
- data/lib/cocoapods-pdk8/hook/podfile.rb +16 -0
- data/lib/cocoapods-pdk8/hook/requirement.rb +18 -0
- data/lib/cocoapods-pdk8/hook/resolver.rb +1 -0
- data/lib/cocoapods-pdk8/hook/sandbox.rb +1 -0
- data/lib/cocoapods-pdk8/hook/sandbox/path_list.rb +43 -0
- data/lib/cocoapods-pdk8/hook/specification.rb +57 -0
- data/lib/cocoapods-pdk8/hook/specification/set.rb +33 -0
- data/lib/cocoapods-pdk8/hook/specification/set/lazy_specification.rb +56 -0
- data/lib/cocoapods-pdk8/source_config.rb +47 -0
- data/lib/cocoapods-pdk8/time_profiler.rb +150 -0
- data/lib/cocoapods_plugin.rb +5 -0
- data/spec/command/pdk8_spec.rb +12 -0
- data/spec/spec_helper.rb +50 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2ea7db40c9f2d655a7336d0354f8e572cbacef7960b923662b77d7db2b327809
|
4
|
+
data.tar.gz: 195f947b1cc60e9174529026724b1bce3e51b04310453214280d1b75baa44e2d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ed765e6538361a5a4db903ad719ae9b920329c095ac10174918dc591b909f55adb984cc102c729d41d3f0789a9b3fb86d7059ba51386a9d4d2b8fc2c758852e3
|
7
|
+
data.tar.gz: 7d2f678ca798100aa6f7659c356ee637f9a8b54aee3e3f64e549d9fdff4d58824dc81939b8f0cc71ace3b552557f28259f9564faab6ba74dc1cbdada4b6d0f28
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2021 戴易超 <daiyichao@corp.netease.com>
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# cocoapods-pdk8
|
2
|
+
> 因为精力有限,目前只兼容了`cocoapods 1.10.0`,如有其他版本的需求,可以提`issue`给我,在时间允许的情况下我会兼容的
|
3
|
+
`pdk8`的取名来自于保时捷`pdk`8速变速箱,也是我这边的期望,我们这个小工具可以让`pod install/update`的速度可以跟保时捷的跑车一样快。
|
4
|
+
|
5
|
+
## Feature
|
6
|
+
- 减少文件IO和优化获取算法
|
7
|
+
- 多线程加载`Pods`
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
$ gem install cocoapods-pdk8
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
`Podfile`里面如果有的多个`source`,如果定义`force`,会优先匹配`force`的源
|
15
|
+
```
|
16
|
+
force_source 'source2'
|
17
|
+
source 'source1'
|
18
|
+
```
|
19
|
+
|
20
|
+
然后就按照普通的`pod install/update`即可,就可以享受到加速,命令行看到`pkd8 enable`即享受到了加速
|
21
|
+
```
|
22
|
+
pdk8 enable
|
23
|
+
Analyzing dependencies
|
24
|
+
Downloading dependencies
|
25
|
+
finish xxx cost: 0s
|
26
|
+
finish xxx cost: 0s
|
27
|
+
finish xxx cost: 0s
|
28
|
+
finish xxx cost: 0s
|
29
|
+
finish xxx cost: 0s
|
30
|
+
finish xxx cost: 0s
|
31
|
+
finish xxx cost: 0s
|
32
|
+
finish xxx cost: 0s
|
33
|
+
finish xxx cost: 0s
|
34
|
+
Generating Pods project
|
35
|
+
Integrating client project
|
36
|
+
Pod installation complete! There is 1 dependency from the Podfile and 14 total pods installed.
|
37
|
+
- total: 1s
|
38
|
+
-- prepare: 0s
|
39
|
+
-- resolve_dependencies: 0s
|
40
|
+
--- run_source_provider_hooks: 0s
|
41
|
+
--- create_analyzer: 0s
|
42
|
+
--- analyze: 1s
|
43
|
+
-- download_dependencies: 0s
|
44
|
+
--- install_pod_sources: 0s
|
45
|
+
--- run_podfile_pre_install_hooks: 0s
|
46
|
+
--- clean_pod_sources: 0s
|
47
|
+
-- validate_targets: 0s
|
48
|
+
-- integrate: 0s
|
49
|
+
--- generate_pods_project: 0s
|
50
|
+
--- integrate_user_project: 0s
|
51
|
+
-- write_lockfiles: 0s
|
52
|
+
-- perform_post_install_actions: 0s
|
53
|
+
```
|
54
|
+
不想享受加速直接卸载即可
|
55
|
+
|
56
|
+
```
|
57
|
+
gem uninstall cocoapods-pdk8
|
58
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cocoapods-pdk8/gem_version.rb'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'cocoapods-pdk8'
|
8
|
+
spec.version = CocoapodsPdk8::VERSION
|
9
|
+
spec.authors = ['戴易超']
|
10
|
+
spec.email = ['804054226@qq.com']
|
11
|
+
spec.description = %q{pod install/update 加速}
|
12
|
+
spec.summary = %q{pod install/update 加速,详情请看readme}
|
13
|
+
spec.homepage = 'https://github.com/EXAMPLE/cocoapods-pdk8'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-pdk8/gem_version'
|
@@ -0,0 +1 @@
|
|
1
|
+
#require 'cocoapods-pdk8/command/pdk8'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
# This is an example of a cocoapods plugin adding a top-level subcommand
|
4
|
+
# to the 'pod' command.
|
5
|
+
#
|
6
|
+
# You can also create subcommands of existing or new commands. Say you
|
7
|
+
# wanted to add a subcommand to `list` to show newly deprecated pods,
|
8
|
+
# (e.g. `pod list deprecated`), there are a few things that would need
|
9
|
+
# to change.
|
10
|
+
#
|
11
|
+
# - move this file to `lib/pod/command/list/deprecated.rb` and update
|
12
|
+
# the class to exist in the the Pod::Command::List namespace
|
13
|
+
# - change this class to extend from `List` instead of `Command`. This
|
14
|
+
# tells the plugin system that it is a subcommand of `list`.
|
15
|
+
# - edit `lib/cocoapods_plugins.rb` to require this file
|
16
|
+
#
|
17
|
+
# @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
|
18
|
+
# in the `plugins.json` file, once your plugin is released.
|
19
|
+
#
|
20
|
+
class Pdk8 < Command
|
21
|
+
self.summary = 'Short description of cocoapods-pdk8.'
|
22
|
+
|
23
|
+
self.description = <<-DESC
|
24
|
+
Longer description of cocoapods-pdk8.
|
25
|
+
DESC
|
26
|
+
|
27
|
+
self.arguments = 'NAME'
|
28
|
+
|
29
|
+
def initialize(argv)
|
30
|
+
@name = argv.shift_argument
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def validate!
|
35
|
+
super
|
36
|
+
help! 'A Pod name is required.' unless @name
|
37
|
+
end
|
38
|
+
|
39
|
+
def run
|
40
|
+
UI.puts "Add your implementation for the cocoapods-pdk8 plugin in #{__FILE__}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
puts "pdk8 enable".yellow
|
2
|
+
require 'cocoapods-pdk8/hook/podfile'
|
3
|
+
require 'cocoapods-pdk8/hook/requirement'
|
4
|
+
require 'cocoapods-pdk8/hook/resolver'
|
5
|
+
require 'cocoapods-pdk8/hook/download'
|
6
|
+
require 'cocoapods-pdk8/hook/installer'
|
7
|
+
require 'cocoapods-pdk8/hook/analyzer'
|
8
|
+
require 'cocoapods-pdk8/hook/specification'
|
9
|
+
require 'cocoapods-pdk8/hook/sandbox'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module Pod
|
3
|
+
class Installer
|
4
|
+
# Analyzes the Podfile, the Lockfile, and the sandbox manifest to generate
|
5
|
+
# the information relative to a CocoaPods installation.
|
6
|
+
#
|
7
|
+
class Analyzer
|
8
|
+
alias origin_update_repositories update_repositories
|
9
|
+
def update_repositories
|
10
|
+
threads = []
|
11
|
+
sources.each do |source|
|
12
|
+
threads << Thread.new {
|
13
|
+
if source.updateable?
|
14
|
+
sources_manager.update(source.name, true)
|
15
|
+
else
|
16
|
+
UI.message "Skipping `#{source.name}` update because the repository is not an updateable repository."
|
17
|
+
end
|
18
|
+
}
|
19
|
+
end
|
20
|
+
threads.each {|thr| thr.join}
|
21
|
+
@specs_updated = true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pod
|
2
|
+
module Downloader
|
3
|
+
# The class responsible for managing Pod downloads, transparently caching
|
4
|
+
# them in a cache directory.
|
5
|
+
#
|
6
|
+
class Cache
|
7
|
+
include SourceConfig::Mixin
|
8
|
+
def ensure_matching_version
|
9
|
+
version_file = root + 'VERSION'
|
10
|
+
|
11
|
+
source_config.mutex_for_downloader.synchronize {
|
12
|
+
version = version_file.read.strip if version_file.file?
|
13
|
+
root.rmtree if version != Pod::VERSION && root.exist?
|
14
|
+
root.mkpath
|
15
|
+
|
16
|
+
version_file.open('w') { |f| f << Pod::VERSION }
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,300 @@
|
|
1
|
+
require 'thread'
|
2
|
+
require 'cocoapods-pdk8/hook/installer/pod_source_installer'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
class Installer
|
6
|
+
include SourceConfig::Mixin
|
7
|
+
attr_accessor :mutex
|
8
|
+
def install_pod_sources
|
9
|
+
@mutex = source_config.mutex_for_downloader
|
10
|
+
@installed_specs = []
|
11
|
+
pods_to_install = sandbox_state.added | sandbox_state.changed
|
12
|
+
|
13
|
+
download_queue = Queue.new
|
14
|
+
root_specs.sort_by(&:name).each do |spec|
|
15
|
+
download_queue.push spec
|
16
|
+
end
|
17
|
+
|
18
|
+
threads = []
|
19
|
+
(1..12).each do |thread_index|
|
20
|
+
threads << Thread.new {
|
21
|
+
while not download_queue.empty?
|
22
|
+
spec = download_queue.pop(true)
|
23
|
+
last_time = Time.new.to_i
|
24
|
+
if pods_to_install.include? spec.name
|
25
|
+
pods_to_install_include_download spec,thread_index
|
26
|
+
else
|
27
|
+
pods_to_install_exclude_download spec,thread_index
|
28
|
+
end
|
29
|
+
puts "finish #{spec.name} cost: #{Time.new.to_i - last_time}s".green
|
30
|
+
end
|
31
|
+
}
|
32
|
+
end
|
33
|
+
threads.map(&:join)
|
34
|
+
end
|
35
|
+
|
36
|
+
def title_options
|
37
|
+
{ :verbose_prefix => '-> '.green }
|
38
|
+
end
|
39
|
+
|
40
|
+
def pods_to_install_include_download spec,thread_index
|
41
|
+
title = ""
|
42
|
+
if sandbox_state.changed.include?(spec.name) && sandbox.manifest
|
43
|
+
title = pods_to_install_include_changed_title spec
|
44
|
+
else
|
45
|
+
title = pods_to_install_include_added_title spec
|
46
|
+
end
|
47
|
+
UI.titled_section("#{thread_index}:#{title}".green, title_options) do
|
48
|
+
install_source_of_pod(spec.name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def pods_to_install_include_changed_title spec
|
53
|
+
current_version = spec.version
|
54
|
+
previous_version = sandbox.manifest.version(spec.name)
|
55
|
+
has_changed_version = current_version != previous_version
|
56
|
+
current_repo = analysis_result.specs_by_source.detect { |key, values| break key if values.map(&:name).include?(spec.name) }
|
57
|
+
current_repo &&= (Pod::TrunkSource::TRUNK_REPO_NAME if current_repo.name == Pod::TrunkSource::TRUNK_REPO_NAME) || current_repo.url || current_repo.name
|
58
|
+
previous_spec_repo = sandbox.manifest.spec_repo(spec.name)
|
59
|
+
has_changed_repo = !previous_spec_repo.nil? && current_repo && !current_repo.casecmp(previous_spec_repo).zero?
|
60
|
+
title = "Installing #{spec.name} #{spec.version}"
|
61
|
+
title << " (was #{previous_version} and source changed to `#{current_repo}` from `#{previous_spec_repo}`)" if has_changed_version && has_changed_repo
|
62
|
+
title << " (was #{previous_version})" if has_changed_version && !has_changed_repo
|
63
|
+
title << " (source changed to `#{current_repo}` from `#{previous_spec_repo}`)" if !has_changed_version && has_changed_repo
|
64
|
+
title
|
65
|
+
end
|
66
|
+
|
67
|
+
def pods_to_install_include_added_title spec
|
68
|
+
title = "Installing #{spec}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def pods_to_install_exclude_download spec,thread_index
|
72
|
+
UI.section("#{thread_index}:Using #{spec}", title_options[:verbose_prefix]) do
|
73
|
+
create_pod_installer(spec.name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_pod_installer(pod_name)
|
78
|
+
specs_by_platform = specs_for_pod(pod_name)
|
79
|
+
|
80
|
+
if specs_by_platform.empty?
|
81
|
+
requiring_targets = pod_targets.select { |pt| pt.recursive_dependent_targets.any? { |dt| dt.pod_name == pod_name } }
|
82
|
+
message = "Could not install '#{pod_name}' pod"
|
83
|
+
message += ", dependended upon by #{requiring_targets.to_sentence}" unless requiring_targets.empty?
|
84
|
+
message += '. There is either no platform to build for, or no target to build.'
|
85
|
+
raise StandardError, message
|
86
|
+
end
|
87
|
+
|
88
|
+
pod_installer = PodSourceInstaller.new(sandbox, podfile, specs_by_platform, :can_cache => installation_options.clean?)
|
89
|
+
@mutex.synchronize {
|
90
|
+
pod_installers << pod_installer
|
91
|
+
}
|
92
|
+
pod_installer
|
93
|
+
end
|
94
|
+
|
95
|
+
def install_source_of_pod(pod_name)
|
96
|
+
pod_installer = create_pod_installer(pod_name)
|
97
|
+
pod_installer.install!
|
98
|
+
@mutex.synchronize {
|
99
|
+
@installed_specs.concat(pod_installer.specs_by_platform.values.flatten.uniq)
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
include TimeProfiler::Mixin
|
104
|
+
alias origin_prepare prepare
|
105
|
+
|
106
|
+
def prepare
|
107
|
+
time_profiler.add_milestone_start time_profiler.stage_prepare, time_profiler.default_step
|
108
|
+
origin_prepare
|
109
|
+
time_profiler.add_milestone_stop time_profiler.stage_prepare, time_profiler.default_step
|
110
|
+
end
|
111
|
+
|
112
|
+
alias origin_run_source_provider_hooks run_source_provider_hooks
|
113
|
+
def run_source_provider_hooks
|
114
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "run_source_provider_hooks"
|
115
|
+
result=origin_run_source_provider_hooks
|
116
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "run_source_provider_hooks"
|
117
|
+
result
|
118
|
+
end
|
119
|
+
|
120
|
+
alias origin_create_analyzer create_analyzer
|
121
|
+
def create_analyzer(plugin_sources)
|
122
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "create_analyzer"
|
123
|
+
result=origin_create_analyzer(plugin_sources)
|
124
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "create_analyzer"
|
125
|
+
result
|
126
|
+
end
|
127
|
+
|
128
|
+
class Analyzer
|
129
|
+
alias origin_update_repositories update_repositories
|
130
|
+
def update_repositories
|
131
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "update_repositories"
|
132
|
+
result=origin_update_repositories
|
133
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "update_repositories"
|
134
|
+
result
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
alias origin_analyze analyze
|
139
|
+
def analyze(analyzer)
|
140
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "analyze"
|
141
|
+
result=origin_analyze(analyzer)
|
142
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "analyze"
|
143
|
+
result
|
144
|
+
end
|
145
|
+
|
146
|
+
alias origin_validate_build_configurations validate_build_configurations
|
147
|
+
def validate_build_configurations
|
148
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, time_profiler.default_step
|
149
|
+
result=origin_validate_build_configurations
|
150
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, time_profiler.default_step
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
154
|
+
alias origin_verify_no_podfile_changes! verify_no_podfile_changes!
|
155
|
+
def verify_no_podfile_changes!
|
156
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "verify_no_podfile_changes!"
|
157
|
+
result=origin_verify_no_podfile_changes!
|
158
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "verify_no_podfile_changes!"
|
159
|
+
result
|
160
|
+
end
|
161
|
+
|
162
|
+
alias origin_verify_no_lockfile_changes! verify_no_lockfile_changes!
|
163
|
+
def verify_no_lockfile_changes!
|
164
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, "verify_no_lockfile_changes!"
|
165
|
+
result=origin_verify_no_lockfile_changes!
|
166
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, "verify_no_lockfile_changes!"
|
167
|
+
result
|
168
|
+
end
|
169
|
+
|
170
|
+
alias origin_resolve_dependencies resolve_dependencies
|
171
|
+
def resolve_dependencies
|
172
|
+
time_profiler.add_milestone_start time_profiler.stage_resolve_dependencies, time_profiler.default_step
|
173
|
+
|
174
|
+
plugin_sources = run_source_provider_hooks
|
175
|
+
analyzer = create_analyzer(plugin_sources)
|
176
|
+
|
177
|
+
UI.section 'Updating local specs repositories' do
|
178
|
+
analyzer.update_repositories
|
179
|
+
end if repo_update?
|
180
|
+
|
181
|
+
UI.section 'Analyzing dependencies' do
|
182
|
+
analyze(analyzer)
|
183
|
+
validate_build_configurations
|
184
|
+
end
|
185
|
+
|
186
|
+
UI.section 'Verifying no changes' do
|
187
|
+
verify_no_podfile_changes!
|
188
|
+
verify_no_lockfile_changes!
|
189
|
+
end if deployment?
|
190
|
+
|
191
|
+
time_profiler.add_milestone_stop time_profiler.stage_resolve_dependencies, time_profiler.default_step
|
192
|
+
|
193
|
+
analyzer
|
194
|
+
end
|
195
|
+
|
196
|
+
alias origin_install_pod_sources install_pod_sources
|
197
|
+
def install_pod_sources
|
198
|
+
time_profiler.add_milestone_start time_profiler.stage_download_dependencies, "install_pod_sources"
|
199
|
+
result=origin_install_pod_sources
|
200
|
+
time_profiler.add_milestone_stop time_profiler.stage_download_dependencies, "install_pod_sources"
|
201
|
+
result
|
202
|
+
end
|
203
|
+
|
204
|
+
alias origin_run_podfile_pre_install_hooks run_podfile_pre_install_hooks
|
205
|
+
def run_podfile_pre_install_hooks
|
206
|
+
time_profiler.add_milestone_start time_profiler.stage_download_dependencies, "run_podfile_pre_install_hooks"
|
207
|
+
result=origin_run_podfile_pre_install_hooks
|
208
|
+
time_profiler.add_milestone_stop time_profiler.stage_download_dependencies, "run_podfile_pre_install_hooks"
|
209
|
+
result
|
210
|
+
end
|
211
|
+
|
212
|
+
alias origin_clean_pod_sources clean_pod_sources
|
213
|
+
def clean_pod_sources
|
214
|
+
time_profiler.add_milestone_start time_profiler.stage_download_dependencies, "clean_pod_sources"
|
215
|
+
result=origin_clean_pod_sources
|
216
|
+
time_profiler.add_milestone_stop time_profiler.stage_download_dependencies, "clean_pod_sources"
|
217
|
+
result
|
218
|
+
end
|
219
|
+
|
220
|
+
alias origin_download_dependencies download_dependencies
|
221
|
+
def download_dependencies
|
222
|
+
time_profiler.add_milestone_start time_profiler.stage_download_dependencies, time_profiler.default_step
|
223
|
+
UI.section 'Downloading dependencies' do
|
224
|
+
install_pod_sources
|
225
|
+
run_podfile_pre_install_hooks
|
226
|
+
clean_pod_sources
|
227
|
+
end
|
228
|
+
time_profiler.add_milestone_stop time_profiler.stage_download_dependencies, time_profiler.default_step
|
229
|
+
end
|
230
|
+
|
231
|
+
alias origin_validate_targets validate_targets
|
232
|
+
def validate_targets
|
233
|
+
time_profiler.add_milestone_start time_profiler.stage_validate_targets, time_profiler.default_step
|
234
|
+
result=origin_validate_targets
|
235
|
+
result
|
236
|
+
time_profiler.add_milestone_stop time_profiler.stage_validate_targets, time_profiler.default_step
|
237
|
+
end
|
238
|
+
|
239
|
+
alias origin_show_skip_pods_project_generation_message show_skip_pods_project_generation_message
|
240
|
+
def show_skip_pods_project_generation_message
|
241
|
+
time_profiler.add_milestone_start time_profiler.stage_show_skip_pods_project_generation_message, time_profiler.default_step
|
242
|
+
result=origin_show_skip_pods_project_generation_message
|
243
|
+
time_profiler.add_milestone_stop time_profiler.stage_show_skip_pods_project_generation_message, time_profiler.default_step
|
244
|
+
result
|
245
|
+
end
|
246
|
+
|
247
|
+
alias origin_generate_pods_project generate_pods_project
|
248
|
+
def generate_pods_project
|
249
|
+
time_profiler.add_milestone_start time_profiler.stage_integrate, "generate_pods_project"
|
250
|
+
result=origin_generate_pods_project
|
251
|
+
time_profiler.add_milestone_stop time_profiler.stage_integrate, "generate_pods_project"
|
252
|
+
result
|
253
|
+
end
|
254
|
+
|
255
|
+
alias origin_integrate_user_project integrate_user_project
|
256
|
+
def integrate_user_project
|
257
|
+
time_profiler.add_milestone_start time_profiler.stage_integrate, "integrate_user_project"
|
258
|
+
result=origin_integrate_user_project
|
259
|
+
time_profiler.add_milestone_stop time_profiler.stage_integrate, "integrate_user_project"
|
260
|
+
result
|
261
|
+
end
|
262
|
+
|
263
|
+
alias origin_integrate integrate
|
264
|
+
def integrate
|
265
|
+
time_profiler.add_milestone_start time_profiler.stage_integrate, time_profiler.default_step
|
266
|
+
generate_pods_project
|
267
|
+
if installation_options.integrate_targets?
|
268
|
+
integrate_user_project
|
269
|
+
else
|
270
|
+
UI.section 'Skipping User Project Integration'
|
271
|
+
end
|
272
|
+
time_profiler.add_milestone_stop time_profiler.stage_integrate, time_profiler.default_step
|
273
|
+
end
|
274
|
+
|
275
|
+
alias origin_write_lockfiles write_lockfiles
|
276
|
+
def write_lockfiles
|
277
|
+
time_profiler.add_milestone_start time_profiler.stage_write_lockfiles, time_profiler.default_step
|
278
|
+
result=origin_write_lockfiles
|
279
|
+
time_profiler.add_milestone_stop time_profiler.stage_write_lockfiles, time_profiler.default_step
|
280
|
+
result
|
281
|
+
end
|
282
|
+
|
283
|
+
alias origin_run_plugins_post_install_hooks run_plugins_post_install_hooks
|
284
|
+
def run_plugins_post_install_hooks
|
285
|
+
time_profiler.add_milestone_start time_profiler.stage_perform_post_install_actions, time_profiler.default_step
|
286
|
+
result=origin_run_plugins_post_install_hooks
|
287
|
+
time_profiler.add_milestone_stop time_profiler.stage_perform_post_install_actions, time_profiler.default_step
|
288
|
+
result
|
289
|
+
end
|
290
|
+
|
291
|
+
alias :origin_install! :install!
|
292
|
+
def install!
|
293
|
+
time_profiler.add_milestone_start time_profiler.total_stage, time_profiler.default_step
|
294
|
+
rs = origin_install!
|
295
|
+
time_profiler.add_milestone_stop time_profiler.total_stage, time_profiler.default_step
|
296
|
+
puts time_profiler.format_prints.join("\n")
|
297
|
+
rs
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pod
|
2
|
+
class Installer
|
3
|
+
# Controller class responsible of installing the activated specifications
|
4
|
+
# of a single Pod.
|
5
|
+
#
|
6
|
+
# @note This class needs to consider all the activated specs of a Pod.
|
7
|
+
#
|
8
|
+
class PodSourceInstaller
|
9
|
+
def download_source
|
10
|
+
if root_spec.source[:git] =~ /http/
|
11
|
+
source = root_spec.attributes_hash["source"]
|
12
|
+
# 替换
|
13
|
+
if source["git"].include? "https://g.hz.netease.com"
|
14
|
+
source["git"]["https://g.hz.netease.com"] = "ssh://git@g.hz.netease.com:22222"
|
15
|
+
end
|
16
|
+
|
17
|
+
if source["git"].include? "http://g.hz.netease.com"
|
18
|
+
source["git"]["http://g.hz.netease.com"] = "ssh://git@g.hz.netease.com:22222"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
download_result = Downloader.download(download_request, root, :can_cache => can_cache?)
|
22
|
+
|
23
|
+
if (specific_source = download_result.checkout_options) && specific_source != root_spec.source
|
24
|
+
sandbox.store_checkout_source(root_spec.name, specific_source)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Pod
|
2
|
+
class Podfile
|
3
|
+
module DSL
|
4
|
+
include SourceConfig::Mixin
|
5
|
+
|
6
|
+
def force_source url
|
7
|
+
SourceConfig.instance.add_force_source url
|
8
|
+
source url
|
9
|
+
end
|
10
|
+
|
11
|
+
def speed_up_enable enable
|
12
|
+
SourceConfig.instance.speed_up_enable enable
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Pod
|
2
|
+
# A Requirement is a set of one or more version restrictions of a
|
3
|
+
# {Dependency}.
|
4
|
+
#
|
5
|
+
# It is based on the RubyGems class adapted to support CocoaPods specific
|
6
|
+
# information.
|
7
|
+
#
|
8
|
+
# @todo Move support about external sources and head information here from
|
9
|
+
# the Dependency class.
|
10
|
+
#
|
11
|
+
class Requirement < Pod::Vendor::Gem::Requirement
|
12
|
+
# module Pod::Specification::Set - all_specifications[requirement]
|
13
|
+
# 如上所示,当requirement做为key的时候,实际上只需要requirements的内容是一样既可以认为是一样的,而不需要整个Requirement的对象一样
|
14
|
+
def eql? other
|
15
|
+
@requirements.eql? other.requirements
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-pdk8/hook/specification/set/lazy_specification'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-pdk8/hook/sandbox/path_list.rb'
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pod
|
2
|
+
class Sandbox
|
3
|
+
# The PathList class is designed to perform multiple glob matches against
|
4
|
+
# a given directory. Basically, it generates a list of all the children
|
5
|
+
# paths and matches the globs patterns against them, resulting in just one
|
6
|
+
# access to the file system.
|
7
|
+
#
|
8
|
+
# @note A PathList once it has generated the list of the paths this is
|
9
|
+
# updated only if explicitly requested by calling
|
10
|
+
# {#read_file_system}
|
11
|
+
#
|
12
|
+
class PathList
|
13
|
+
def read_file_system
|
14
|
+
|
15
|
+
unless root.exist?
|
16
|
+
puts caller
|
17
|
+
raise Informative, "Attempt to read non existent folder `#{root}`."
|
18
|
+
end
|
19
|
+
dirs = []
|
20
|
+
files = []
|
21
|
+
root_length = root.cleanpath.to_s.length + File::SEPARATOR.length
|
22
|
+
escaped_root = escape_path_for_glob(root)
|
23
|
+
Dir.glob(escaped_root + '**/*', File::FNM_DOTMATCH).each do |f|
|
24
|
+
directory = File.directory?(f)
|
25
|
+
# Ignore `.` and `..` directories
|
26
|
+
next if directory && f =~ /\.\.?$/
|
27
|
+
|
28
|
+
f = f.slice(root_length, f.length - root_length)
|
29
|
+
next if f.nil?
|
30
|
+
|
31
|
+
(directory ? dirs : files) << f
|
32
|
+
end
|
33
|
+
|
34
|
+
dirs.sort_by!(&:upcase)
|
35
|
+
files.sort_by!(&:upcase)
|
36
|
+
|
37
|
+
@dirs = dirs
|
38
|
+
@files = files
|
39
|
+
@glob_cache = {}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'cocoapods-pdk8/hook/specification/set'
|
2
|
+
module Pod
|
3
|
+
# The Specification provides a DSL to describe a Pod. A pod is defined as a
|
4
|
+
# library originating from a source. A specification can support detailed
|
5
|
+
# attributes for modules of code through subspecs.
|
6
|
+
#
|
7
|
+
# Usually it is stored in files with `podspec` extension.
|
8
|
+
#
|
9
|
+
$SPECIFICATION_HASH_CACHE = Hash.new
|
10
|
+
class Specification
|
11
|
+
def self.from_file(path, subspec_name = nil)
|
12
|
+
path = Pathname.new(path)
|
13
|
+
unless path.exist?
|
14
|
+
raise Informative, "No podspec exists at path `#{path}`."
|
15
|
+
end
|
16
|
+
return $SPECIFICATION_HASH_CACHE[path.expand_path] if $SPECIFICATION_HASH_CACHE[path.expand_path]
|
17
|
+
|
18
|
+
string = File.open(path, 'r:utf-8', &:read)
|
19
|
+
# Work around for Rubinius incomplete encoding in 1.9 mode
|
20
|
+
if string.respond_to?(:encoding) && string.encoding.name != 'UTF-8'
|
21
|
+
string.encode!('UTF-8')
|
22
|
+
end
|
23
|
+
specification = from_string(string, path, subspec_name)
|
24
|
+
$SPECIFICATION_HASH_CACHE[path.expand_path] = specification
|
25
|
+
return specification
|
26
|
+
end
|
27
|
+
|
28
|
+
$SPECIFICATION_FROM_STRING_HASH_CACHE = Hash.new
|
29
|
+
|
30
|
+
def self.from_string(spec_contents, path, subspec_name = nil)
|
31
|
+
path = Pathname.new(path).expand_path
|
32
|
+
|
33
|
+
key = "#{path}"
|
34
|
+
return $SPECIFICATION_FROM_STRING_HASH_CACHE[key] if $SPECIFICATION_FROM_STRING_HASH_CACHE[key]
|
35
|
+
|
36
|
+
spec = nil
|
37
|
+
case path.extname
|
38
|
+
when '.podspec'
|
39
|
+
Dir.chdir(path.parent.directory? ? path.parent : Dir.pwd) do
|
40
|
+
spec = ::Pod._eval_podspec(spec_contents, path)
|
41
|
+
unless spec.is_a?(Specification)
|
42
|
+
raise Informative, "Invalid podspec file at path `#{path}`."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
when '.json'
|
46
|
+
spec = Specification.from_json(spec_contents)
|
47
|
+
else
|
48
|
+
raise Informative, "Unsupported specification format `#{path.extname}` for spec at `#{path}`."
|
49
|
+
end
|
50
|
+
|
51
|
+
spec.defined_in_file = path
|
52
|
+
spec.subspec_by_name(subspec_name, true)
|
53
|
+
$SPECIFICATION_FROM_STRING_HASH_CACHE[key] = spec
|
54
|
+
spec
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Pod
|
2
|
+
class Specification
|
3
|
+
class Set
|
4
|
+
include SourceConfig::Mixin
|
5
|
+
alias origin_specification_name specification_name
|
6
|
+
def specification_name
|
7
|
+
## 这里可能存在的风险,但是目前可以再是不关心
|
8
|
+
name
|
9
|
+
end
|
10
|
+
|
11
|
+
alias origin_versions_by_source versions_by_source
|
12
|
+
def versions_by_source
|
13
|
+
@fix_versions_by_source ||= begin
|
14
|
+
force_sources = []
|
15
|
+
vers_b_source = origin_versions_by_source
|
16
|
+
vers_b_source.keys.each do |key|
|
17
|
+
if source_config.force_sources.include? key.url
|
18
|
+
force_sources << key
|
19
|
+
end
|
20
|
+
end
|
21
|
+
result = {}
|
22
|
+
vers_b_source.each do |key, value|
|
23
|
+
result[key] = value
|
24
|
+
force_sources.each do |src|
|
25
|
+
result[key] = result[key] - vers_b_source[src] unless source_config.force_sources.include? key.url
|
26
|
+
end
|
27
|
+
end
|
28
|
+
result
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'cocoapods/resolver/lazy_specification'
|
2
|
+
|
3
|
+
# module Pod
|
4
|
+
# class Specification
|
5
|
+
# class Set
|
6
|
+
# include SourceConfig::Mixin
|
7
|
+
|
8
|
+
# # returns the highest versioned spec last
|
9
|
+
# # alias all_specifications_fix all_specifications
|
10
|
+
# def aall_specifications(warn_for_multiple_pod_sources, requirement)
|
11
|
+
# @all_specifications ||= {}
|
12
|
+
# @all_specifications[requirement] ||= begin
|
13
|
+
# sources_by_version = {}
|
14
|
+
# source_hash = {}
|
15
|
+
# versions_by_source.each do |source, versions|
|
16
|
+
# source_hash[source.url] ||= source
|
17
|
+
# versions.each do |v|
|
18
|
+
# next unless requirement.satisfied_by?(v)
|
19
|
+
# (sources_by_version[v] ||= []) << source
|
20
|
+
# if source_config.enable?
|
21
|
+
# if source_config.force_sources.include? source.url
|
22
|
+
# sources_by_version[v] = [source]
|
23
|
+
# else
|
24
|
+
# sources_by_version[v].each do |s|
|
25
|
+
# if source_config.force_sources.include? s.url
|
26
|
+
# sources_by_version[v] = [source]
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
|
34
|
+
|
35
|
+
# if warn_for_multiple_pod_sources
|
36
|
+
# duplicate_versions = sources_by_version.select { |_version, sources| sources.count > 1 }
|
37
|
+
|
38
|
+
# duplicate_versions.each do |version, sources|
|
39
|
+
# UI.warn "Found multiple specifications for `#{name} (#{version})`:\n" +
|
40
|
+
# sources.
|
41
|
+
# map { |s| s.specification_path(name, version) }.
|
42
|
+
# map { |v| "- #{v}" }.join("\n")
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
|
46
|
+
# # sort versions from high to low
|
47
|
+
# sources_by_version.sort_by(&:first).flat_map do |version, sources|
|
48
|
+
# # within each version, we want the prefered (first-specified) source
|
49
|
+
# # to be the _last_ one
|
50
|
+
# sources.reverse_each.map { |source| LazySpecification.new(name, version, source) }
|
51
|
+
# end
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
# end
|
56
|
+
# end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Pod
|
2
|
+
class SourceConfig
|
3
|
+
|
4
|
+
attr_accessor :force_xx_sources
|
5
|
+
def force_sources
|
6
|
+
@force_xx_sources ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_force_source source
|
10
|
+
raise "Donot try add a nil source to force sources" if source.nil?
|
11
|
+
@force_xx_sources ||= []
|
12
|
+
@force_xx_sources << source
|
13
|
+
end
|
14
|
+
|
15
|
+
def enable?
|
16
|
+
!force_sources.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_accessor :speed_up_enable
|
20
|
+
|
21
|
+
def speed_up_enable?
|
22
|
+
@speed_up_enable
|
23
|
+
end
|
24
|
+
|
25
|
+
def speed_up_enable enable
|
26
|
+
@speed_up_enable = enable
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_accessor :mutex_for_downloader
|
30
|
+
def mutex_for_downloader
|
31
|
+
@mutex_for_downloader ||= Mutex.new
|
32
|
+
end
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr_writer :instance
|
36
|
+
def instance
|
37
|
+
@instance ||= new
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module Mixin
|
42
|
+
def source_config
|
43
|
+
SourceConfig.instance
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
module Pod
|
2
|
+
class TimeProfiler
|
3
|
+
#
|
4
|
+
# Hash {
|
5
|
+
# stage:{
|
6
|
+
# :start => Date,
|
7
|
+
# step => {
|
8
|
+
# :start
|
9
|
+
# :end
|
10
|
+
# }
|
11
|
+
# }
|
12
|
+
# }
|
13
|
+
attr_accessor :time_line
|
14
|
+
def add_milestone_start stage, step
|
15
|
+
@time_line ||= Hash.new
|
16
|
+
@time_line[stage] ||= begin
|
17
|
+
rs = Hash.new
|
18
|
+
rs
|
19
|
+
end
|
20
|
+
@time_line[stage][step] = {
|
21
|
+
:start => Time.new.getutc.to_i
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_milestone_stop stage, step
|
26
|
+
raise "timeline is not start" unless @time_line
|
27
|
+
raise "stage #{stage} is not start" unless @time_line[stage]
|
28
|
+
raise "step #{step} is not start" unless @time_line[stage][step]
|
29
|
+
@time_line[stage][step][:stop] = Time.new.getutc.to_i
|
30
|
+
end
|
31
|
+
# - total: 1s
|
32
|
+
# -- prepare: 0s
|
33
|
+
# -- resolve_dependencies: 0s
|
34
|
+
# --- run_source_provider_hooks: 0s
|
35
|
+
# --- create_analyzer: 0s
|
36
|
+
# --- analyze: 1s
|
37
|
+
# -- download_dependencies: 0s
|
38
|
+
# --- install_pod_sources: 0s
|
39
|
+
# --- run_podfile_pre_install_hooks: 0s
|
40
|
+
# --- clean_pod_sources: 0s
|
41
|
+
# -- validate_targets: 0s
|
42
|
+
# -- integrate: 0s
|
43
|
+
# --- generate_pods_project: 0s
|
44
|
+
# --- integrate_user_project: 0s
|
45
|
+
# -- write_lockfiles: 0s
|
46
|
+
# -- perform_post_install_actions: 0s
|
47
|
+
def format_prints
|
48
|
+
result = []
|
49
|
+
total_line = @time_line[total_stage]
|
50
|
+
if total_line
|
51
|
+
result << "- total: #{total_line[default_step][:stop] - total_line[default_step][:start]}s".yellow
|
52
|
+
end
|
53
|
+
stages.each do |stage|
|
54
|
+
stage_line = @time_line[stage]
|
55
|
+
if stage_line
|
56
|
+
stage_cost = stage_line[default_step][:stop] - stage_line[default_step][:start]
|
57
|
+
result << "-- #{stage}: #{stage_cost}s".yellow
|
58
|
+
stage_line.each do |step, values|
|
59
|
+
if step != default_step
|
60
|
+
result << "--- #{step}: #{values[:stop] - values[:start]}s"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
result
|
66
|
+
end
|
67
|
+
|
68
|
+
def format
|
69
|
+
result = Hash.new
|
70
|
+
total_line = @time_line[total_stage]
|
71
|
+
if total_line
|
72
|
+
result["total"] = total_line[default_step][:stop] - total_line[default_step][:start]
|
73
|
+
end
|
74
|
+
stages.each do |stage|
|
75
|
+
stage_line = @time_line[stage]
|
76
|
+
if stage_line
|
77
|
+
stage_cost = stage_line[default_step][:stop] - stage_line[default_step][:start]
|
78
|
+
result[stage] = stage_cost
|
79
|
+
end
|
80
|
+
end
|
81
|
+
result
|
82
|
+
end
|
83
|
+
|
84
|
+
def total_stage
|
85
|
+
"total_stage"
|
86
|
+
end
|
87
|
+
|
88
|
+
def default_step
|
89
|
+
"default_step"
|
90
|
+
end
|
91
|
+
|
92
|
+
def stages
|
93
|
+
[
|
94
|
+
stage_prepare,
|
95
|
+
stage_resolve_dependencies,
|
96
|
+
stage_download_dependencies,
|
97
|
+
stage_validate_targets,
|
98
|
+
stage_show_skip_pods_project_generation_message,
|
99
|
+
stage_integrate,
|
100
|
+
stage_write_lockfiles,
|
101
|
+
stage_perform_post_install_actions
|
102
|
+
]
|
103
|
+
end
|
104
|
+
|
105
|
+
def stage_prepare
|
106
|
+
"prepare"
|
107
|
+
end
|
108
|
+
|
109
|
+
def stage_resolve_dependencies
|
110
|
+
"resolve_dependencies"
|
111
|
+
end
|
112
|
+
|
113
|
+
def stage_download_dependencies
|
114
|
+
"download_dependencies"
|
115
|
+
end
|
116
|
+
|
117
|
+
def stage_validate_targets
|
118
|
+
"validate_targets"
|
119
|
+
end
|
120
|
+
|
121
|
+
def stage_show_skip_pods_project_generation_message
|
122
|
+
"show_skip_pods_project_generation_message"
|
123
|
+
end
|
124
|
+
|
125
|
+
def stage_integrate
|
126
|
+
"integrate"
|
127
|
+
end
|
128
|
+
|
129
|
+
def stage_write_lockfiles
|
130
|
+
"write_lockfiles"
|
131
|
+
end
|
132
|
+
|
133
|
+
def stage_perform_post_install_actions
|
134
|
+
"perform_post_install_actions"
|
135
|
+
end
|
136
|
+
|
137
|
+
class << self
|
138
|
+
attr_writer :instance
|
139
|
+
def instance
|
140
|
+
@instance ||= new
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
module Mixin
|
145
|
+
def time_profiler
|
146
|
+
return TimeProfiler.instance
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
+
#-----------------------------------------------------------------------------#
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cocoapods-pdk8
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- 戴易超
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-07-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: pod install/update 加速
|
42
|
+
email:
|
43
|
+
- 804054226@qq.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- cocoapods-pdk8.gemspec
|
54
|
+
- lib/cocoapods-pdk8.rb
|
55
|
+
- lib/cocoapods-pdk8/command.rb
|
56
|
+
- lib/cocoapods-pdk8/command/pdk8.rb
|
57
|
+
- lib/cocoapods-pdk8/gem_version.rb
|
58
|
+
- lib/cocoapods-pdk8/hook.rb
|
59
|
+
- lib/cocoapods-pdk8/hook/analyzer.rb
|
60
|
+
- lib/cocoapods-pdk8/hook/download.rb
|
61
|
+
- lib/cocoapods-pdk8/hook/installer.rb
|
62
|
+
- lib/cocoapods-pdk8/hook/installer/pod_source_installer.rb
|
63
|
+
- lib/cocoapods-pdk8/hook/podfile.rb
|
64
|
+
- lib/cocoapods-pdk8/hook/requirement.rb
|
65
|
+
- lib/cocoapods-pdk8/hook/resolver.rb
|
66
|
+
- lib/cocoapods-pdk8/hook/sandbox.rb
|
67
|
+
- lib/cocoapods-pdk8/hook/sandbox/path_list.rb
|
68
|
+
- lib/cocoapods-pdk8/hook/specification.rb
|
69
|
+
- lib/cocoapods-pdk8/hook/specification/set.rb
|
70
|
+
- lib/cocoapods-pdk8/hook/specification/set/lazy_specification.rb
|
71
|
+
- lib/cocoapods-pdk8/source_config.rb
|
72
|
+
- lib/cocoapods-pdk8/time_profiler.rb
|
73
|
+
- lib/cocoapods_plugin.rb
|
74
|
+
- spec/command/pdk8_spec.rb
|
75
|
+
- spec/spec_helper.rb
|
76
|
+
homepage: https://github.com/EXAMPLE/cocoapods-pdk8
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata: {}
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubygems_version: 3.0.3
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: pod install/update 加速,详情请看readme
|
99
|
+
test_files:
|
100
|
+
- spec/command/pdk8_spec.rb
|
101
|
+
- spec/spec_helper.rb
|