cocoapods-bin-cache 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/lib/cocoapods-bin-cache/gem_version.rb +3 -0
- data/lib/cocoapods-bin-cache.rb +1 -0
- data/lib/cocoapods-binary-patch.rb +205 -0
- data/lib/cocoapods_plugin.rb +85 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2309086892987cacb0dbda0a71142ba55cee8d0a1380d92b03b8e8aa2c5ed0ed
|
4
|
+
data.tar.gz: df110ea74f0390f05cb7bc96d3d44337392f1a8e5dbf49dabccdc515c63363e4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 59a83cb71c056a5f4c80f111a1918ec412ab6113e9e66ca989ad47f75a95d2ed123e4a978bfd00c0ee106fa8cb17a7418e47e50c20d38efc2d9a2281bba72a3c
|
7
|
+
data.tar.gz: 92d443b6386ea6cb2505fc21262a1054591cb3c1c2cf9623fd1d8f6871384a3662ee5a7977d9bc25f1f1ea9adb9a295b4bafc395f131a84798cdebaca0425cc8
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cocoapods-bin-cache/gem_version'
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'cocoapods-binary'
|
2
|
+
|
3
|
+
def patch_copy_bundle
|
4
|
+
|
5
|
+
Pod::Installer.define_method :prebuild_frameworks! do |*args|
|
6
|
+
puts "copy bundle fixed" .green << "\n"
|
7
|
+
Pod::Prebuild.check_one_pod_should_have_only_one_target(self.pod_targets)
|
8
|
+
|
9
|
+
# build options
|
10
|
+
sandbox_path = sandbox.root
|
11
|
+
existed_framework_folder = sandbox.generate_framework_path
|
12
|
+
bitcode_enabled = Pod::Podfile::DSL.bitcode_enabled
|
13
|
+
targets = []
|
14
|
+
|
15
|
+
if local_manifest != nil
|
16
|
+
|
17
|
+
changes = prebuild_pods_changes
|
18
|
+
added = changes.added
|
19
|
+
changed = changes.changed
|
20
|
+
unchanged = changes.unchanged
|
21
|
+
deleted = changes.deleted
|
22
|
+
|
23
|
+
existed_framework_folder.mkdir unless existed_framework_folder.exist?
|
24
|
+
exsited_framework_names = sandbox.exsited_framework_names
|
25
|
+
|
26
|
+
# additions
|
27
|
+
missing = unchanged.select do |pod_name|
|
28
|
+
not exsited_framework_names.include?(pod_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
root_names_to_update = (added + changed + missing)
|
33
|
+
|
34
|
+
# transform names to targets
|
35
|
+
name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
|
36
|
+
sum[target.name] = target
|
37
|
+
sum
|
38
|
+
end
|
39
|
+
targets = root_names_to_update.map do |root_name|
|
40
|
+
t = name_to_target_hash[root_name]
|
41
|
+
raise "There's no target named (#{root_name}) in Pod.xcodeproj.\n #{name_to_target_hash.keys}" if t.nil?
|
42
|
+
t
|
43
|
+
end || []
|
44
|
+
|
45
|
+
# add the dendencies
|
46
|
+
dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
|
47
|
+
targets = (targets + dependency_targets).uniq
|
48
|
+
else
|
49
|
+
targets = self.pod_targets
|
50
|
+
end
|
51
|
+
|
52
|
+
targets = targets.reject {|pod_target| sandbox.local?(pod_target.pod_name) }
|
53
|
+
|
54
|
+
|
55
|
+
# build!
|
56
|
+
Pod::UI.puts "Prebuild frameworks (total #{targets.count})"
|
57
|
+
Pod::Prebuild.remove_build_dir(sandbox_path)
|
58
|
+
targets.each do |target|
|
59
|
+
if !target.should_build?
|
60
|
+
UI.puts "Prebuilding #{target.label}"
|
61
|
+
next
|
62
|
+
end
|
63
|
+
|
64
|
+
output_path = sandbox.framework_folder_path_for_pod_name(target.name)
|
65
|
+
output_path.mkpath unless output_path.exist?
|
66
|
+
Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled, Pod::Podfile::DSL.custom_build_options, Pod::Podfile::DSL.custom_build_options_simulator)
|
67
|
+
|
68
|
+
# save the resource paths for later installing
|
69
|
+
if target.static_framework? and !target.resource_paths.empty?
|
70
|
+
framework_path = output_path + target.framework_name
|
71
|
+
standard_sandbox_path = sandbox.standard_sanbox_path
|
72
|
+
|
73
|
+
resources = begin
|
74
|
+
if Pod::VERSION.start_with? "1.5"
|
75
|
+
target.resource_paths
|
76
|
+
else
|
77
|
+
# resource_paths is Hash{String=>Array<String>} on 1.6 and above
|
78
|
+
# (use AFNetworking to generate a demo data)
|
79
|
+
# https://github.com/leavez/cocoapods-binary/issues/50
|
80
|
+
target.resource_paths.values.flatten
|
81
|
+
end
|
82
|
+
end
|
83
|
+
raise "Wrong type: #{resources}" unless resources.kind_of? Array
|
84
|
+
|
85
|
+
path_objects = resources.map do |path|
|
86
|
+
object = Pod::Prebuild::Passer::ResourcePath.new
|
87
|
+
# object.real_file_path = framework_path + File.basename(path)
|
88
|
+
#liuao patch 修改resources的地址 xxx/xxx.framework/ => xxx/
|
89
|
+
object.real_file_path = sandbox.framework_folder_path_for_pod_name(target.name) + File.basename(path)
|
90
|
+
#liuao patch end
|
91
|
+
object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s) if path.start_with? '${PODS_ROOT}'
|
92
|
+
object.target_file_path = path.gsub("${PODS_CONFIGURATION_BUILD_DIR}", standard_sandbox_path.to_s) if path.start_with? "${PODS_CONFIGURATION_BUILD_DIR}"
|
93
|
+
#liuao patch 如果是静态库且framework里没有bundle 从当前沙盒拷贝过去
|
94
|
+
realpath = object.target_file_path.gsub('Pods','Pods/_Prebuild')
|
95
|
+
if !object.real_file_path.exist? and target.static_framework? and Pathname(realpath).exist?
|
96
|
+
# byebug
|
97
|
+
FileUtils.cp_r(realpath, object.real_file_path, :remove_destination => true)
|
98
|
+
end
|
99
|
+
#liuao patch end
|
100
|
+
object
|
101
|
+
end
|
102
|
+
Pod::Prebuild::Passer.resources_to_copy_for_static_framework[target.name] = path_objects
|
103
|
+
end
|
104
|
+
end
|
105
|
+
Pod::Prebuild.remove_build_dir(sandbox_path)
|
106
|
+
|
107
|
+
# copy vendored libraries and frameworks
|
108
|
+
targets.each do |target|
|
109
|
+
root_path = self.sandbox.pod_dir(target.name)
|
110
|
+
target_folder = sandbox.framework_folder_path_for_pod_name(target.name)
|
111
|
+
|
112
|
+
# If target shouldn't build, we copy all the original files
|
113
|
+
# This is for target with only .a and .h files
|
114
|
+
if not target.should_build?
|
115
|
+
Prebuild::Passer.target_names_to_skip_integration_framework << target.pod_name
|
116
|
+
FileUtils.cp_r(root_path, target_folder, :remove_destination => true)
|
117
|
+
next
|
118
|
+
end
|
119
|
+
|
120
|
+
target.spec_consumers.each do |consumer|
|
121
|
+
file_accessor = Pod::Sandbox::FileAccessor.new(root_path, consumer)
|
122
|
+
lib_paths = file_accessor.vendored_frameworks || []
|
123
|
+
lib_paths += file_accessor.vendored_libraries
|
124
|
+
# @TODO dSYM files
|
125
|
+
lib_paths.each do |lib_path|
|
126
|
+
relative = lib_path.relative_path_from(root_path)
|
127
|
+
destination = target_folder + relative
|
128
|
+
destination.dirname.mkpath unless destination.dirname.exist?
|
129
|
+
FileUtils.cp_r(lib_path, destination, :remove_destination => true)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Remove useless files
|
135
|
+
# remove useless pods
|
136
|
+
all_needed_names = self.pod_targets.map(&:name).uniq
|
137
|
+
useless_names = sandbox.exsited_framework_names.reject do |name|
|
138
|
+
all_needed_names.include? name
|
139
|
+
end
|
140
|
+
useless_names.each do |name|
|
141
|
+
path = sandbox.framework_folder_path_for_pod_name(name)
|
142
|
+
path.rmtree if path.exist?
|
143
|
+
end
|
144
|
+
|
145
|
+
if not Pod::Podfile::DSL.dont_remove_source_code
|
146
|
+
# only keep manifest.lock and framework folder in _Prebuild
|
147
|
+
to_remain_files = ["Manifest.lock", File.basename(existed_framework_folder)]
|
148
|
+
to_delete_files = sandbox_path.children.select do |file|
|
149
|
+
filename = File.basename(file)
|
150
|
+
not to_remain_files.include?(filename)
|
151
|
+
end
|
152
|
+
to_delete_files.each do |path|
|
153
|
+
path.rmtree if path.exist?
|
154
|
+
end
|
155
|
+
else
|
156
|
+
# just remove the tmp files
|
157
|
+
path = sandbox.root + 'Manifest.lock.tmp'
|
158
|
+
path.rmtree if path.exist?
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
def patch_copy_dysms
|
167
|
+
puts "copy dysms fixed" .green << "\n"
|
168
|
+
def patch(generated_projects)
|
169
|
+
generated_projects.each do |project|
|
170
|
+
project.targets.each do |target|
|
171
|
+
target.shell_script_build_phases.each do |phase|
|
172
|
+
script = phase.shell_script
|
173
|
+
if script.include? "-copy-dsyms.sh\""
|
174
|
+
script = script.delete_prefix "\"${PODS_ROOT}/"
|
175
|
+
script = script.delete_suffix "\"\n"
|
176
|
+
script = "Pods/" + script
|
177
|
+
contents = File.read(script)
|
178
|
+
contents = contents.gsub(/-av/, "-r -L -p -t -g -o -D -v")
|
179
|
+
File.open(script, "w") do |file|
|
180
|
+
file.puts contents
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
Pod::Installer.define_method :generate_pods_project do |*args|
|
189
|
+
stage_sandbox(sandbox, pod_targets)
|
190
|
+
|
191
|
+
cache_analysis_result = analyze_project_cache
|
192
|
+
pod_targets_to_generate = cache_analysis_result.pod_targets_to_generate
|
193
|
+
aggregate_targets_to_generate = cache_analysis_result.aggregate_targets_to_generate
|
194
|
+
|
195
|
+
clean_sandbox(pod_targets_to_generate)
|
196
|
+
|
197
|
+
create_and_save_projects(pod_targets_to_generate, aggregate_targets_to_generate,
|
198
|
+
cache_analysis_result.build_configurations, cache_analysis_result.project_object_version)
|
199
|
+
patch @generated_projects
|
200
|
+
Pod::Installer::SandboxDirCleaner.new(sandbox, pod_targets, aggregate_targets).clean!
|
201
|
+
|
202
|
+
update_project_cache(cache_analysis_result, target_installation_results)
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'cocoapods-binary'
|
2
|
+
require_relative './cocoapods-binary-patch'
|
3
|
+
Pod::HooksManager.register('cocoapods-bin-cache', :post_install) do |installer_context|
|
4
|
+
if Pod::Podfile::DSL.cache_enabled
|
5
|
+
oldmethod = Pod::Prebuild.singleton_method(:build)
|
6
|
+
Pod::Prebuild.define_singleton_method :build do |*args|
|
7
|
+
target = args[1]
|
8
|
+
output_path = args[2]
|
9
|
+
prebuild_bin = Pathname(Pod::Podfile::DSL.cache_path + (target.name + target.version + '.zip'))
|
10
|
+
if prebuild_bin.exist?
|
11
|
+
def extract_zip(file, destination)
|
12
|
+
FileUtils.mkdir_p(destination) unless destination.exist?
|
13
|
+
`unzip -o #{file} -d #{destination}`
|
14
|
+
end
|
15
|
+
puts (target.name + ' prebuild cache hit,skip prebuilding🎉🎉') .green << "\n"
|
16
|
+
extract_zip(prebuild_bin,output_path)
|
17
|
+
else
|
18
|
+
puts (target.name + ' has no prebuild cache,start prebuilding🔧🔧') .yellow << "\n"
|
19
|
+
oldmethod.call(*args)
|
20
|
+
`pushd #{output_path} && zip -r #{prebuild_bin} . && popd`
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if Pod::Podfile::DSL.copy_bunlde_fixed
|
26
|
+
patch_copy_bundle
|
27
|
+
end
|
28
|
+
|
29
|
+
if Pod::Podfile::DSL.copy_dysms_fixed
|
30
|
+
patch_copy_dysms
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
module Pod
|
37
|
+
class Podfile
|
38
|
+
module DSL
|
39
|
+
@@fix_copy_bundle = false
|
40
|
+
@@fix_copy_dysms = false
|
41
|
+
@@bin_cache_path = nil
|
42
|
+
@@enable_prebuild_cache = true
|
43
|
+
def self.cache_path
|
44
|
+
@@bin_cache_path ||= Pathname(File.expand_path('~') + '/.cocoapods-bin-cache')
|
45
|
+
FileUtils.mkdir_p(@@bin_cache_path) unless @@bin_cache_path.exist?
|
46
|
+
@@bin_cache_path
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.cache_enabled
|
50
|
+
@@enable_prebuild_cache
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.copy_bunlde_fixed
|
54
|
+
@@fix_copy_bundle
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.copy_dysms_fixed
|
58
|
+
@@fix_copy_dysms
|
59
|
+
end
|
60
|
+
|
61
|
+
def enable_bin_cache
|
62
|
+
@@enable_prebuild_cache = true
|
63
|
+
end
|
64
|
+
|
65
|
+
def disable_bin_cache
|
66
|
+
@@enable_prebuild_cache = false
|
67
|
+
end
|
68
|
+
|
69
|
+
def fix_copy_bundle
|
70
|
+
@@fix_copy_bundle = true
|
71
|
+
end
|
72
|
+
|
73
|
+
def fix_copy_dysms
|
74
|
+
@@fix_copy_dysms = true
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
def set_bin_cache_path(path)
|
79
|
+
pathname = Pathname(path)
|
80
|
+
raise 'bin_cache_path not exist' unless pathname.exist?
|
81
|
+
@@bin_cache_path = pathname
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cocoapods-bin-cache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- royliu1990
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-01-19 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: A short description of cocoapods-bin-cache.
|
42
|
+
email:
|
43
|
+
- royliu.chengdu@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/cocoapods-bin-cache.rb
|
49
|
+
- lib/cocoapods-bin-cache/gem_version.rb
|
50
|
+
- lib/cocoapods-binary-patch.rb
|
51
|
+
- lib/cocoapods_plugin.rb
|
52
|
+
homepage: https://github.com/EXAMPLE/cocoapods-bin-cache
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubygems_version: 3.0.3
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: A longer description of cocoapods-bin-cache.
|
75
|
+
test_files: []
|