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



301
302
303
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 301

def install_pod_targets(project, pod_targets)
  super
end

#integrate_targets(pod_target_installation_results) ⇒ Object



305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 305

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