Module: Pod::PodGenerate::Patches::InstallerPatch::ForceIncrementalInstall
- Defined in:
- lib/cocoapods-podgenerate/patches/installer_patch.rb
Overview
── 优化 1: 强制启用增量安装模式 ──
在 install! 入口处设置 installation_options,强制启用:
- incremental_installation: 只重新生成有变更的 target
- generate_multiple_pod_projects: 每个 pod 独立 xcodeproj
这两个选项是 CocoaPods 内置的(默认关闭),我们通过 monkey-patch 在 super 之前设置,对所有后续流程生效。
Instance Method Summary collapse
-
#create_and_save_projects(pod_targets_to_generate, aggregate_targets_to_generate, build_configurations, project_object_version) ⇒ Object
── 优化 3+4: 项目生成 + 并行 configure_schemes ──.
-
#generate_pods_project ⇒ Object
── 优化 2: 完全无变更时跳过项目生成 + C2/H1 修复 ──.
- #install! ⇒ Object
Instance Method Details
#create_and_save_projects(pod_targets_to_generate, aggregate_targets_to_generate, build_configurations, project_object_version) ⇒ Object
── 优化 3+4: 项目生成 + 并行 configure_schemes ──
完全覆盖原 create_and_save_projects 方法,添加并行 configure_schemes。流程:
1. 创建 generator → 调用 generate!(并行安装 pod targets)
2. 设置实例变量(@pods_project 等)
3. UUID 预测 + 稳定化
4. 创建 writer → 并行清理/重建 scheme/保存
5. 并行 configure_schemes(每个 project 独立)
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 141 def create_and_save_projects(pod_targets_to_generate, aggregate_targets_to_generate, build_configurations, project_object_version) UI.section 'Generating Pods project' do generator = create_generator(pod_targets_to_generate, aggregate_targets_to_generate, build_configurations, project_object_version, .generate_multiple_pod_projects) pod_project_generation_result = generator.generate! @target_installation_results = pod_project_generation_result.target_installation_results @pods_project = pod_project_generation_result.project @pod_target_subprojects = pod_project_generation_result.projects_by_pod_targets.keys @generated_projects = ([pods_project] + pod_target_subprojects).compact @generated_pod_targets = pod_targets_to_generate @generated_aggregate_targets = aggregate_targets_to_generate || [] projects_by_pod_targets = pod_project_generation_result.projects_by_pod_targets predictabilize_uuids(generated_projects) if .deterministic_uuids? stabilize_target_uuids(generated_projects) projects_writer = Pod::Installer::Xcode::PodsProjectWriter.new(sandbox, generated_projects, target_installation_results.pod_target_installation_results, ) projects_writer.write! do run_podfile_post_install_hooks end # 并行 configure_schemes(多项目时) pods_project_pod_targets = pod_targets_to_generate - projects_by_pod_targets.values.flatten all_projects_by_pod_targets = {} if pods_project all_projects_by_pod_targets[pods_project] = pods_project_pod_targets end all_projects_by_pod_targets.merge!(projects_by_pod_targets) if projects_by_pod_targets if all_projects_by_pod_targets.size > 1 parallel_configure_schemes(all_projects_by_pod_targets, generator, pod_project_generation_result) else all_projects_by_pod_targets.each do |project, pts| generator.configure_schemes(project, pts, pod_project_generation_result) end end end end |
#generate_pods_project ⇒ Object
── 优化 2: 完全无变更时跳过项目生成 + C2/H1 修复 ──
原流程即使没有任何 target 变更,create_and_save_projects 仍会被调用,执行大量 file I/O 操作。本方法在 analyze_project_cache 之后检查:
如果 pod_targets_to_generate 和 aggregate_targets_to_generate
都为空(即没有任何 target 需要重新生成),则:
1. 跳过 create_and_save_projects(pod 项目已在磁盘上,内容未变)
2. 仍执行 SandboxDirCleaner(清理可能被移除的 pod 的残留文件)
3. 仍调用 update_project_cache(保持缓存时间戳最新)
4. 仍调用 run_podfile_post_install_hooks(Podfile hook 不能跳过)
v0.1.4 修复 (C2):
- 设置 @pods_project = nil, @pod_target_subprojects = [],
@generated_projects = [](避免下游引用 nil)
- 调用 run_podfile_post_install_hooks(之前被跳过导致 hook 静默丢失)
v0.1.4 修复 (H1):
- 使用上次的 @target_installation_results 更新缓存
(而非空的 InstallationResults,避免清除 metadata_cache)
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 87 def generate_pods_project stage_sandbox(sandbox, pod_targets) cache_analysis_result = analyze_project_cache ptg = cache_analysis_result.pod_targets_to_generate atg = cache_analysis_result.aggregate_targets_to_generate if ptg.empty? && (atg.nil? || atg.empty?) Pod::UI.puts "[cocoapods-podgenerate] No changes — skipping project generation" # C2 修复: 初始化所有实例变量(避免下游代码获得 nil) @generated_aggregate_targets = aggregate_targets @generated_pod_targets = [] @pods_project = nil @pod_target_subprojects = [] @generated_projects = [] # C2 修复: 确保 post-install hooks 被调用 run_podfile_post_install_hooks # 清理沙盒中残留的文件 Pod::Installer::SandboxDirCleaner.new(sandbox, pod_targets, aggregate_targets).clean! # H1 修复: 当没有目标需要生成时,跳过 update_project_cache 调用 # @target_installation_results 仅在 create_and_save_projects 内设置, # 在跳过路径上始终为 nil,回退到空 InstallationResults.new({}, {}) # 会导致 metadata_cache 中所有 pod target 的安装结果被清除, # 下次运行时触发全量重建(cache 损坏)。 # 跳过路径的正确行为:不更新任何缓存,因为没有任何变化, # 已有的缓存状态仍然有效。 return end # 正常路径: 有 target 需要重新生成 ptg.each do |pod_target| pod_target.build_headers.implode_path!(pod_target.headers_sandbox) sandbox.public_headers.implode_path!(pod_target.headers_sandbox) end create_and_save_projects(ptg, atg, cache_analysis_result.build_configurations, cache_analysis_result.project_object_version) Pod::Installer::SandboxDirCleaner.new(sandbox, pod_targets, aggregate_targets).clean! update_project_cache(cache_analysis_result, target_installation_results) end |
#install! ⇒ Object
62 63 64 65 66 |
# File 'lib/cocoapods-podgenerate/patches/installer_patch.rb', line 62 def install! .incremental_installation = true .generate_multiple_pod_projects = true super end |