Module: Pod::PodGenerate::Patches::MultiProjectGeneratorPatch::ParallelMultiProjectGenerator

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

Instance Method Summary collapse

Instance Method Details

#install_all_pod_targets(projects_by_pod_targets) ⇒ Hash{String => TargetInstallationResult}

并行安装所有 pod target

原实现(串行):

projects_by_pod_targets.each_with_object({}) { |(p, pts), r| r.merge!(install_pod_targets(p, pts)) }

优化后(并行):

使用 Concurrent::FixedThreadPool,每个 project 分配一个线程
并发调用 install_pod_targets,结果通过 Mutex 合并到 all_results

Parameters:

  • projects_by_pod_targets (Hash{Project => Array<PodTarget>})

    项目到 pod target 列表的映射

Returns:

  • (Hash{String => TargetInstallationResult})

    pod target 名称到安装结果的映射



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/cocoapods-podgenerate/patches/multi_project_generator_patch.rb', line 54

def install_all_pod_targets(projects_by_pod_targets)
  UI.message '- Installing Pod Targets (parallel)' do
    pool_size = compute_pool_size
    mutex = Mutex.new
    all_results = {}
    errors = [] # v0.1.4: 收集错误而不是静默吞掉

    pool = Concurrent::FixedThreadPool.new(pool_size)
    projects_by_pod_targets.each do |project, pts|
      pool.post do
        # 每个 project 独立安装其 pod target
        target_results = install_pod_targets(project, pts)
        mutex.synchronize { all_results.merge!(target_results) }
      rescue StandardError => e
        mutex.synchronize do
          errors << [project.path, e]
          Pod::UI.warn "[cocoapods-podgenerate] Pod target install failed for #{project.path}: #{e.message}"
        end
      end
    end

    # v0.1.4: 带超时的等待,防止死锁
    pool.shutdown
    unless pool.wait_for_termination(Pod::PodGenerate::Parallel::ThreadPool::DEFAULT_TIMEOUT)
      Pod::UI.warn '[cocoapods-podgenerate] Pod target install timed out after 120s — forcing shutdown'
      pool.kill
    end

    # v0.1.4: 如果有任何失败,抛出异常让 CocoaPods 知道安装不完整
    unless errors.empty?
      raise Pod::Informative, "[cocoapods-podgenerate] #{errors.size} pod target(s) failed to install"
    end

    all_results
  end
end