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



415
416
417
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 415

def install_pod_targets(project, pod_targets)
  super
end

#integrate_targets(pod_target_installation_results) ⇒ Object



419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 419

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 = Pod::PodGenerate::Parallel::ThreadPool.compute_pool_size
  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