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



227
228
229
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 227

def install_pod_targets(project, pod_targets)
  super
end

#integrate_targets(pod_target_installation_results) ⇒ Object



231
232
233
234
235
236
237
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
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 231

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