Module: Pod::PodGenerate::Patches::InstallerPatch::ParallelInstall

Defined in:
lib/cocoapods-podgenerate/patches/installer_patch.rb

Overview

── 优化 3: 并行化 PodTargetIntegrator(修复 M3)──

PodTargetIntegrator 为每个 pod target 添加脚本构建阶段(如 embed frameworks、copy resources)。每个 integrator 操作独立的 target,无共享状态 → 并行安全。

v0.1.4 修复 (M3): 使用 Concurrent::FixedThreadPool(限制并发数)

替代原来的裸 Thread.new(可能同时创建 200+ 线程导致资源耗尽)

Instance Method Summary collapse

Instance Method Details

#install_pod_targets(project, pod_targets) ⇒ Object



234
235
236
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 234

def install_pod_targets(project, pod_targets)
  super
end

#integrate_targets(pod_target_installation_results) ⇒ Object



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 238

def integrate_targets(pod_target_installation_results)
  pods_to_integrate = pod_target_installation_results.values.select do |result|
    target = result.target
    !result.test_native_targets.empty? ||
      !result.app_native_targets.empty? ||
      target.contains_script_phases? ||
      target.framework_paths.values.flatten.any? { |p| !p.dsym_path.nil? } ||
      target.xcframeworks.values.any?(&:any?)
  end
  return if pods_to_integrate.empty?

  use_io_paths = !installation_options.disable_input_output_paths

  if pods_to_integrate.size <= 1
    # 单 target: 直接调用,无需线程开销
    Pod::Installer::Xcode::PodsProjectGenerator::PodTargetIntegrator.new(
      pods_to_integrate.first, :use_input_output_paths => use_io_paths
    ).integrate!
    return
  end

  # 多 target: 使用线程池并行集成(M3 修复)
  pool_size = [[Etc.nprocessors - 1, 2].max, 16].min
  pool = Concurrent::FixedThreadPool.new(pool_size)

  pods_to_integrate.each do |result|
    pool.post do
      Pod::Installer::Xcode::PodsProjectGenerator::PodTargetIntegrator.new(
        result, :use_input_output_paths => use_io_paths
      ).integrate!
    rescue StandardError => e
      Pod::UI.warn "[cocoapods-podgenerate] Integrate error: #{e.message}"
    end
  end

  pool.shutdown
  unless pool.wait_for_termination(Pod::PodGenerate::Parallel::ThreadPool::DEFAULT_TIMEOUT)
    Pod::UI.warn '[cocoapods-podgenerate] Target integration timed out'
    pool.kill
  end
end