cocoapods-binary-matchup 0.0.2 → 0.0.4

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.
@@ -0,0 +1,422 @@
1
+ require 'fileutils'
2
+ require 'digest'
3
+
4
+ module Pod
5
+ module PrebuildCache
6
+ class Cache
7
+
8
+ # 获取缓存根目录
9
+ def self.cache_root_dir
10
+ cache_dir = File.expand_path("~/.PodCache")
11
+ FileUtils.mkdir_p(cache_dir) unless Dir.exist?(cache_dir)
12
+ cache_dir
13
+ end
14
+
15
+ # 获取特定pod的缓存目录
16
+ def self.cache_dir_for_pod(pod_name, version)
17
+ File.join(cache_root_dir, pod_name, version)
18
+ end
19
+
20
+ # 获取pod的版本信息,优先使用commit hash
21
+ def self.get_pod_version(sandbox, pod_name)
22
+ begin
23
+ Pod::UI.puts "🔍 Looking for version of: #{pod_name}"
24
+ # 优先级:commit > tag > version > timestamp
25
+
26
+ # 1. 首先尝试从Manifest.lock获取commit信息
27
+ manifest_lock = sandbox.root + 'Manifest.lock'
28
+ if manifest_lock.exist?
29
+ manifest_content = YAML.load_file(manifest_lock)
30
+
31
+ # 优先检查 CHECKOUT OPTIONS 中的commit信息
32
+ checkout_options = manifest_content['CHECKOUT OPTIONS'] || {}
33
+ if checkout_options[pod_name].is_a?(Hash)
34
+ checkout_info = checkout_options[pod_name]
35
+ # 优先使用commit,然后是tag
36
+ if checkout_info[:commit] || checkout_info['commit']
37
+ commit = checkout_info[:commit] || checkout_info['commit']
38
+ Pod::UI.puts "📋 Using commit for #{pod_name}: #{commit[0..7]}..."
39
+ return commit
40
+ elsif checkout_info[:tag] || checkout_info['tag']
41
+ tag = checkout_info[:tag] || checkout_info['tag']
42
+ Pod::UI.puts "📋 Using tag for #{pod_name}: #{tag}"
43
+ return tag
44
+ end
45
+ end
46
+
47
+ # 如果没有commit信息,查找版本信息
48
+ pods = manifest_content['PODS'] || []
49
+ Pod::UI.puts "🔍 Searching in #{pods.length} pod entries from Manifest.lock"
50
+
51
+ pods.each do |pod_entry|
52
+ if pod_entry.is_a?(Hash)
53
+ # Hash 格式:{"PodName (1.0.0)" => [...]}
54
+ pod_entry.each do |key, _|
55
+ key_str = key.to_s
56
+
57
+ # 使用更灵活的匹配逻辑,支持subspec
58
+ match = key_str.match(/^#{Regexp.escape(pod_name)}\s*\(([^)]+)\)/)
59
+ if match
60
+ Pod::UI.puts "📋 Found exact match! Using version for #{pod_name}: #{match[1]}"
61
+ return match[1]
62
+ end
63
+
64
+ # 如果精确匹配失败,尝试检查是否是subspec的情况
65
+ # 例如:pod_name是"GoogleUtilities/AppDelegateSwizzler",但key是"GoogleUtilities/AppDelegateSwizzler (8.1.0)"
66
+ if key_str.include?(pod_name) && key_str.include?('(')
67
+ version_match = key_str.match(/\(([^)]+)\)/)
68
+ if version_match
69
+ Pod::UI.puts "📋 Found partial match! Using version for #{pod_name}: #{version_match[1]}"
70
+ return version_match[1]
71
+ end
72
+ end
73
+ end
74
+ elsif pod_entry.is_a?(String)
75
+ # String 格式:"PodName (1.0.0)"
76
+
77
+ match = pod_entry.match(/^#{Regexp.escape(pod_name)}\s*\(([^)]+)\)/)
78
+ if match
79
+ Pod::UI.puts "📋 Found exact match! Using version for #{pod_name}: #{match[1]}"
80
+ return match[1]
81
+ end
82
+
83
+ # 如果精确匹配失败,尝试部分匹配
84
+ if pod_entry.include?(pod_name) && pod_entry.include?('(')
85
+ version_match = pod_entry.match(/\(([^)]+)\)/)
86
+ if version_match
87
+ Pod::UI.puts "📋 Found partial match! Using version for #{pod_name}: #{version_match[1]}"
88
+ return version_match[1]
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ Pod::UI.puts "⚠️ No version found for #{pod_name} in Manifest.lock"
95
+ end
96
+
97
+
98
+
99
+ # 2. 如果Manifest.lock不存在或没找到,尝试从Podfile.lock获取
100
+ podfile_lock = sandbox.root.parent + 'Podfile.lock'
101
+ if podfile_lock.exist?
102
+ podfile_content = YAML.load_file(podfile_lock)
103
+
104
+ # 同样优先检查checkout信息
105
+ checkout_options = podfile_content['CHECKOUT OPTIONS'] || {}
106
+ if checkout_options[pod_name].is_a?(Hash)
107
+ checkout_info = checkout_options[pod_name]
108
+ if checkout_info[:commit] || checkout_info['commit']
109
+ commit = checkout_info[:commit] || checkout_info['commit']
110
+ Pod::UI.puts "📋 Using commit for #{pod_name}: #{commit[0..7]}..."
111
+ return commit
112
+ elsif checkout_info[:tag] || checkout_info['tag']
113
+ tag = checkout_info[:tag] || checkout_info['tag']
114
+ Pod::UI.puts "📋 Using tag for #{pod_name}: #{tag}"
115
+ return tag
116
+ end
117
+ end
118
+
119
+ # 查找版本信息
120
+ pods = podfile_content['PODS'] || []
121
+ Pod::UI.puts "🔍 Searching in #{pods.length} pod entries from Podfile.lock"
122
+
123
+ pods.each do |pod_entry|
124
+ if pod_entry.is_a?(Hash)
125
+ pod_entry.each do |key, _|
126
+ key_str = key.to_s
127
+
128
+ # 使用更灵活的匹配逻辑,支持subspec
129
+ match = key_str.match(/^#{Regexp.escape(pod_name)}\s*\(([^)]+)\)/)
130
+ if match
131
+ Pod::UI.puts "📋 Found exact match! Using version for #{pod_name}: #{match[1]}"
132
+ return match[1]
133
+ end
134
+
135
+ # 如果精确匹配失败,尝试部分匹配
136
+ if key_str.include?(pod_name) && key_str.include?('(')
137
+ version_match = key_str.match(/\(([^)]+)\)/)
138
+ if version_match
139
+ Pod::UI.puts "📋 Found partial match! Using version for #{pod_name}: #{version_match[1]}"
140
+ return version_match[1]
141
+ end
142
+ end
143
+ end
144
+ elsif pod_entry.is_a?(String)
145
+ # String 格式:"PodName (1.0.0)"
146
+
147
+ match = pod_entry.match(/^#{Regexp.escape(pod_name)}\s*\(([^)]+)\)/)
148
+ if match
149
+ Pod::UI.puts "📋 Found exact match! Using version for #{pod_name}: #{match[1]}"
150
+ return match[1]
151
+ end
152
+
153
+ # 如果精确匹配失败,尝试部分匹配
154
+ if pod_entry.include?(pod_name) && pod_entry.include?('(')
155
+ version_match = pod_entry.match(/\(([^)]+)\)/)
156
+ if version_match
157
+ Pod::UI.puts "📋 Found partial match! Using version for #{pod_name}: #{version_match[1]}"
158
+ return version_match[1]
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ Pod::UI.puts "⚠️ No version found for #{pod_name} in Podfile.lock"
165
+ end
166
+
167
+ # 3. 如果无法从任何lockfile获取,使用时间戳作为版本
168
+ timestamp = Time.now.strftime("%Y%m%d_%H%M%S")
169
+ Pod::UI.puts "⚠️ Warning: Cannot find version/commit for #{pod_name} in lock files, using timestamp: #{timestamp}"
170
+ return timestamp
171
+ rescue => e
172
+ timestamp = Time.now.strftime("%Y%m%d_%H%M%S")
173
+ Pod::UI.puts "⚠️ Warning: Error getting version for #{pod_name}: #{e.message}, using timestamp: #{timestamp}"
174
+ return timestamp
175
+ end
176
+ end
177
+
178
+ # 计算目录内容的哈希值(用于验证缓存完整性)
179
+ def self.calculate_dir_hash(dir_path)
180
+ return nil unless Dir.exist?(dir_path)
181
+
182
+ files = Dir.glob("#{dir_path}/**/*", File::FNM_DOTMATCH).select { |f| File.file?(f) }
183
+ files.sort!
184
+
185
+ hasher = Digest::SHA256.new
186
+ files.each do |file|
187
+ # 添加文件路径和修改时间到哈希计算中
188
+ relative_path = file.sub("#{dir_path}/", "")
189
+ hasher.update(relative_path)
190
+ hasher.update(File.mtime(file).to_s)
191
+ end
192
+
193
+ hasher.hexdigest
194
+ end
195
+
196
+ # 检查缓存是否存在
197
+ def self.cache_exists?(pod_name, version)
198
+ cache_dir = cache_dir_for_pod(pod_name, version)
199
+ Dir.exist?(cache_dir) && !Dir.empty?(cache_dir)
200
+ end
201
+
202
+ # 检查缓存是否存在且有效(用于验证完整性)
203
+ def self.cache_valid?(pod_name, version, source_dir = nil)
204
+ cache_dir = cache_dir_for_pod(pod_name, version)
205
+ return false unless Dir.exist?(cache_dir)
206
+
207
+ # 如果没有提供源目录,只检查缓存是否存在
208
+ return true if source_dir.nil?
209
+
210
+ # 检查缓存的哈希文件
211
+ hash_file = File.join(cache_dir, '.cache_hash')
212
+ return false unless File.exist?(hash_file)
213
+
214
+ begin
215
+ cached_hash = File.read(hash_file).strip
216
+ current_hash = calculate_dir_hash(source_dir)
217
+
218
+ return cached_hash == current_hash
219
+ rescue => e
220
+ Pod::UI.puts "⚠️ Warning: Cannot validate cache for #{pod_name}: #{e.message}"
221
+ return false
222
+ end
223
+ end
224
+
225
+ # 从缓存恢复pod
226
+ def self.restore_from_cache(pod_name, version, target_dir)
227
+ cache_dir = cache_dir_for_pod(pod_name, version)
228
+
229
+ return false unless Dir.exist?(cache_dir)
230
+
231
+ begin
232
+ # 删除目标目录
233
+ FileUtils.rm_rf(target_dir) if Dir.exist?(target_dir)
234
+
235
+ # 从缓存拷贝到目标目录
236
+ FileUtils.cp_r(cache_dir, target_dir, :remove_destination => true)
237
+
238
+ # 删除缓存标记文件
239
+ hash_file = File.join(target_dir, '.cache_hash')
240
+ File.delete(hash_file) if File.exist?(hash_file)
241
+
242
+ Pod::UI.puts "📦 Restored #{pod_name} (#{version}) from cache"
243
+ return true
244
+ rescue => e
245
+ Pod::UI.puts "❌ Failed to restore #{pod_name} from cache: #{e.message}"
246
+ return false
247
+ end
248
+ end
249
+
250
+ # 保存到缓存(如果缓存不存在的话)
251
+ def self.save_to_cache(pod_name, version, source_dir)
252
+ return unless Dir.exist?(source_dir)
253
+
254
+ # 检查缓存是否已经存在,如果存在则不覆盖
255
+ if cache_exists?(pod_name, version)
256
+ Pod::UI.puts "📦 Cache already exists for #{pod_name} (#{version}), skipping save"
257
+ return true
258
+ end
259
+
260
+ cache_dir = cache_dir_for_pod(pod_name, version)
261
+
262
+ begin
263
+ # 创建缓存目录
264
+ FileUtils.mkdir_p(File.dirname(cache_dir))
265
+
266
+ # 删除旧缓存(如果存在)
267
+ FileUtils.rm_rf(cache_dir) if Dir.exist?(cache_dir)
268
+
269
+ # 拷贝到缓存
270
+ FileUtils.cp_r(source_dir, cache_dir, :remove_destination => true)
271
+
272
+ # 保存哈希值
273
+ source_hash = calculate_dir_hash(source_dir)
274
+ hash_file = File.join(cache_dir, '.cache_hash')
275
+ File.write(hash_file, source_hash)
276
+
277
+ Pod::UI.puts "💾 Saved #{pod_name} (#{version}) to cache"
278
+ return true
279
+ rescue => e
280
+ Pod::UI.puts "❌ Failed to save #{pod_name} to cache: #{e.message}"
281
+ return false
282
+ end
283
+ end
284
+
285
+ # 尝试从缓存拷贝到目标目录(如果缓存存在)
286
+ def self.copy_from_cache_if_exists(pod_name, version, target_dir)
287
+ return false unless cache_exists?(pod_name, version)
288
+
289
+ cache_dir = cache_dir_for_pod(pod_name, version)
290
+
291
+ begin
292
+ # 删除目标目录
293
+ FileUtils.rm_rf(target_dir) if Dir.exist?(target_dir)
294
+
295
+ # 从缓存拷贝到目标目录
296
+ FileUtils.cp_r(cache_dir, target_dir, :remove_destination => true)
297
+
298
+ # 删除缓存标记文件
299
+ hash_file = File.join(target_dir, '.cache_hash')
300
+ File.delete(hash_file) if File.exist?(hash_file)
301
+
302
+ Pod::UI.puts "📦 Copied #{pod_name} (#{version}) from cache"
303
+ return true
304
+ rescue => e
305
+ Pod::UI.puts "❌ Failed to copy #{pod_name} from cache: #{e.message}"
306
+ return false
307
+ end
308
+ end
309
+
310
+ # 清理过期缓存(可选功能)
311
+ def self.clean_expired_cache(days = 30)
312
+ return unless Dir.exist?(cache_root_dir)
313
+
314
+ cutoff_time = Time.now - (days * 24 * 60 * 60)
315
+ cleaned_count = 0
316
+
317
+ Dir.glob("#{cache_root_dir}/*/*").each do |cache_dir|
318
+ next unless Dir.exist?(cache_dir)
319
+
320
+ if File.mtime(cache_dir) < cutoff_time
321
+ begin
322
+ FileUtils.rm_rf(cache_dir)
323
+ cleaned_count += 1
324
+ Pod::UI.puts "🗑️ Cleaned expired cache: #{File.basename(File.dirname(cache_dir))}/#{File.basename(cache_dir)}"
325
+ rescue => e
326
+ Pod::UI.puts "❌ Failed to clean cache #{cache_dir}: #{e.message}"
327
+ end
328
+ end
329
+ end
330
+
331
+ Pod::UI.puts "✅ Cleaned #{cleaned_count} expired cache entries" if cleaned_count > 0
332
+ end
333
+
334
+ # 获取缓存统计信息
335
+ def self.cache_stats
336
+ return {} unless Dir.exist?(cache_root_dir)
337
+
338
+ stats = {
339
+ total_pods: 0,
340
+ total_versions: 0,
341
+ total_size: 0
342
+ }
343
+
344
+ Dir.glob("#{cache_root_dir}/*").each do |pod_dir|
345
+ next unless Dir.exist?(pod_dir)
346
+
347
+ stats[:total_pods] += 1
348
+
349
+ Dir.glob("#{pod_dir}/*").each do |version_dir|
350
+ next unless Dir.exist?(version_dir)
351
+
352
+ stats[:total_versions] += 1
353
+
354
+ # 计算目录大小
355
+ size = `du -sk "#{version_dir}" 2>/dev/null`.split.first.to_i * 1024
356
+ stats[:total_size] += size
357
+ end
358
+ end
359
+
360
+ stats
361
+ end
362
+
363
+ # 打印缓存统计信息
364
+ def self.print_cache_stats
365
+ stats = cache_stats
366
+ if stats[:total_pods] > 0
367
+ size_mb = (stats[:total_size] / 1024.0 / 1024.0).round(2)
368
+ Pod::UI.puts "📊 Cache Stats: #{stats[:total_pods]} pods, #{stats[:total_versions]} versions, #{size_mb} MB"
369
+ else
370
+ Pod::UI.puts "📊 Cache is empty"
371
+ end
372
+ end
373
+
374
+ # 从 ~/.PodCache 恢复缓存到 _prebuild 目录
375
+ def self.restore_from_pod_cache(pod_name, prebuild_sandbox)
376
+ begin
377
+ Pod::UI.puts "🔍 Checking cache for #{pod_name} #{prebuild_sandbox}"
378
+
379
+ restored_count = 0
380
+ missing_pods = []
381
+
382
+ # 获取pod版本信息
383
+ pod_version = get_pod_version(prebuild_sandbox, pod_name)
384
+
385
+ # 检查缓存是否存在
386
+ if cache_exists?(pod_name, pod_version)
387
+ # 从缓存复制到_prebuild目录
388
+ cache_dir = cache_dir_for_pod(pod_name, pod_version)
389
+ target_dir = prebuild_sandbox.framework_folder_path_for_pod_name(pod_name)
390
+
391
+ # 确保目标目录存在
392
+ target_dir.parent.mkpath unless target_dir.parent.exist?
393
+
394
+ # 复制缓存到_prebuild
395
+ FileUtils.cp_r(cache_dir, target_dir, :remove_destination => true)
396
+
397
+ # 删除缓存标记文件
398
+ hash_file = target_dir + '.cache_hash'
399
+ hash_file.delete if hash_file.exist?
400
+
401
+ Pod::UI.puts "📦 Restored #{pod_name} (#{pod_version}) from cache"
402
+ restored_count += 1
403
+ else
404
+ missing_pods << pod_name
405
+ end
406
+
407
+ if missing_pods.empty?
408
+ Pod::UI.puts "✅ Successfully restored all #{restored_count} pods from cache"
409
+ return true
410
+ else
411
+ Pod::UI.puts "⚠️ Missing cache for #{missing_pods.count} pods: #{missing_pods.join(', ')}"
412
+ return false
413
+ end
414
+
415
+ rescue => e
416
+ Pod::UI.puts "❌ Error restoring from cache: #{e.message}"
417
+ return false
418
+ end
419
+ end
420
+ end
421
+ end
422
+ end
@@ -0,0 +1,171 @@
1
+ # encoding: UTF-8
2
+ require_relative 'helper/podfile_options'
3
+ require_relative 'tool/tool'
4
+ require_relative 'Integration_cache'
5
+
6
+ module Pod
7
+ class Podfile
8
+ module DSL
9
+
10
+ # Enable prebuiding for all pods
11
+ # it has a lower priority to other binary settings
12
+ def all_binary!
13
+ DSL.prebuild_all = true
14
+ end
15
+
16
+ def simulator_build_disable!
17
+ DSL.simulator_build_enabled = false
18
+ end
19
+
20
+ # Enable bitcode for prebuilt frameworks
21
+ def enable_bitcode_for_prebuilt_frameworks!
22
+ DSL.bitcode_enabled = true
23
+ end
24
+
25
+ # Don't remove source code of prebuilt pods
26
+ # It may speed up the pod install if git didn't
27
+ # include the `Pods` folder
28
+ def keep_source_code_for_prebuilt_frameworks!
29
+ DSL.dont_remove_source_code = true
30
+ end
31
+
32
+ # Add custom xcodebuild option to the prebuilding action
33
+ #
34
+ # You may use this for your special demands. For example: the default archs in dSYMs
35
+ # of prebuilt frameworks is 'arm64 armv7 x86_64', and no 'i386' for 32bit simulator.
36
+ # It may generate a warning when building for a 32bit simulator. You may add following
37
+ # to your podfile
38
+ #
39
+ # ` set_custom_xcodebuild_options_for_prebuilt_frameworks :simulator => "ARCHS=$(ARCHS_STANDARD)" `
40
+ #
41
+ # Another example to disable the generating of dSYM file:
42
+ #
43
+ # ` set_custom_xcodebuild_options_for_prebuilt_frameworks "DEBUG_INFORMATION_FORMAT=dwarf"`
44
+ #
45
+ #
46
+ # @param [String or Hash] options
47
+ #
48
+ # If is a String, it will apply for device and simulator. Use it just like in the commandline.
49
+ # If is a Hash, it should be like this: { :device => "XXXXX", :simulator => "XXXXX" }
50
+ #
51
+ def set_custom_xcodebuild_options_for_prebuilt_frameworks(options)
52
+ if options.kind_of? Hash
53
+ DSL.custom_build_options = [ options[:device] ] unless options[:device].nil?
54
+ DSL.custom_build_options_simulator = [ options[:simulator] ] unless options[:simulator].nil?
55
+ elsif options.kind_of? String
56
+ DSL.custom_build_options = [options]
57
+ DSL.custom_build_options_simulator = [options]
58
+ else
59
+ raise "Wrong type."
60
+ end
61
+ end
62
+
63
+ class_attr_accessor :simulator_build_enabled
64
+ simulator_build_enabled = true
65
+
66
+ private
67
+ class_attr_accessor :prebuild_all
68
+ prebuild_all = false
69
+
70
+ class_attr_accessor :bitcode_enabled
71
+ bitcode_enabled = false
72
+
73
+ class_attr_accessor :dont_remove_source_code
74
+ dont_remove_source_code = false
75
+
76
+ class_attr_accessor :custom_build_options
77
+ class_attr_accessor :custom_build_options_simulator
78
+ self.custom_build_options = []
79
+ self.custom_build_options_simulator = []
80
+ end
81
+ end
82
+ end
83
+
84
+ Pod::HooksManager.register('cocoapods-binary-matchup', :pre_install) do |installer_context|
85
+
86
+ require_relative 'helper/feature_switches'
87
+ if Pod.is_prebuild_stage
88
+ next
89
+ end
90
+
91
+ # [Check Environment]
92
+ # check user_framework is on
93
+ podfile = installer_context.podfile
94
+ podfile.target_definition_list.each do |target_definition|
95
+ next if target_definition.prebuild_framework_names.empty?
96
+ if not target_definition.uses_frameworks?
97
+ STDERR.puts "[!] Cocoapods-binary requires `use_frameworks!`".red
98
+ exit
99
+ end
100
+ end
101
+
102
+
103
+ # -- step 1: prebuild framework ---
104
+ # Execute a sperated pod install, to generate targets for building framework,
105
+ # then compile them to framework files.
106
+ require_relative 'helper/prebuild_sandbox'
107
+ require_relative 'Prebuild'
108
+
109
+ Pod::UI.puts "🚀 Prebuild frameworks"
110
+
111
+ # Fetch original installer (which is running this pre-install hook) options,
112
+ # then pass them to our installer to perform update if needed
113
+ # Looks like this is the most appropriate way to figure out that something should be updated
114
+
115
+ update = nil
116
+ repo_update = nil
117
+
118
+ include ObjectSpace
119
+ ObjectSpace.each_object(Pod::Installer) { |installer|
120
+ update = installer.update
121
+ repo_update = installer.repo_update
122
+ }
123
+
124
+ # control features
125
+ Pod.is_prebuild_stage = true
126
+ Pod::Podfile::DSL.enable_prebuild_patch true # enable sikpping for prebuild targets
127
+ Pod::Installer.force_disable_integration true # don't integrate targets
128
+ Pod::Config.force_disable_write_lockfile true # disbale write lock file for perbuild podfile
129
+ Pod::Installer.disable_install_complete_message true # disable install complete message
130
+
131
+ # make another custom sandbox
132
+ standard_sandbox = installer_context.sandbox
133
+ prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(standard_sandbox)
134
+
135
+ # get the podfile for prebuild
136
+ prebuild_podfile = Pod::Podfile.from_ruby(podfile.defined_in_file)
137
+
138
+ # install
139
+ lockfile = installer_context.lockfile
140
+ binary_installer = Pod::Installer.new(prebuild_sandbox, prebuild_podfile, lockfile)
141
+
142
+ # 优化的三级缓存逻辑
143
+ if binary_installer.have_exact_prebuild_cache? && !update
144
+ # 1. 优先:_prebuild 目录已有完整缓存
145
+ Pod::UI.puts "📦 Using exact prebuild cache from _Prebuild"
146
+ binary_installer.install_when_cache_hit!
147
+ else
148
+ # 3. 最后:重新构建
149
+ Pod::UI.puts "🔨 Building frameworks (no cache available)"
150
+ binary_installer.update = update
151
+ binary_installer.repo_update = repo_update
152
+ binary_installer.install!
153
+ end
154
+
155
+
156
+ # reset the environment
157
+ Pod.is_prebuild_stage = false
158
+ Pod::Installer.force_disable_integration false
159
+ Pod::Podfile::DSL.enable_prebuild_patch false
160
+ Pod::Config.force_disable_write_lockfile false
161
+ Pod::Installer.disable_install_complete_message false
162
+
163
+
164
+ # -- step 2: pod install ---
165
+ # install
166
+ Pod::UI.puts "\n"
167
+ Pod::UI.puts "🤖 Pod Install"
168
+ require_relative 'Integration'
169
+ # go on the normal install step ...
170
+ end
171
+