Class: Pod::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-meitu-bin/native/resolver.rb

Instance Method Summary collapse

Instance Method Details

#aggregate_for_dependency(dependency) ⇒ Object

其实不用到 resolver_specs_by_target 再改 spec 在这个方法里面,通过修改 dependency 的 source 应该也可以就是有一点,如果改了之后,对应的 source 没有符合 dependency 的版本分析依赖阶段就会报错了,没法像 resolver_specs_by_target 一样没有对应的二进制版本时还可以转到源码源码



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 21

def aggregate_for_dependency(dependency)
  sources_manager = Config.instance.sources_manager
  if dependency&.podspec_repo
    sources_manager.aggregate_for_dependency(dependency)
    # 采用 lock 中的 source ,会导致插件对 source 的先后调整失效
    # elsif (locked_vertex = @locked_dependencies.vertex_named(dependency.name)) && (locked_dependency = locked_vertex.payload) && locked_dependency.podspec_repo
    #   sources_manager.aggregate_for_dependency(locked_dependency)
  else
    @aggregate ||= Source::Aggregate.new(sources)
  end
end

#get_all_components_dependenciesObject

获取所有组件的完整依赖关系



624
625
626
627
628
629
630
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 624

def get_all_components_dependencies
  result = {}
  @activated.vertices.each do |name, vertex|
    result[name] = get_all_dependencies(vertex)
  end
  result
end

#get_all_dependencies(vertex, visited = Set.new, dependencies = {}) ⇒ Object

获取组件的所有依赖(包括直接和间接依赖)



580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 580

def get_all_dependencies(vertex, visited = Set.new, dependencies = {})
  return dependencies if vertex.nil? || visited.include?(vertex.name)

  visited.add(vertex.name)

  # 添加当前组件信息
  dependencies[vertex.name] = {
    version: vertex.payload&.version,
    dependencies: {}
  }

  # 递归处理所有直接依赖
  vertex.outgoing_edges&.each do |edge|
    dest_vertex = edge.destination
    next if dest_vertex.nil?
    
    dep_name = dest_vertex.name

    # 记录直接依赖信息
    dependencies[vertex.name][:dependencies][dep_name] = {
      version: dest_vertex.payload&.version,
      requirement: edge.requirement&.to_s
    }

    # 递归获取间接依赖
    get_all_dependencies(dest_vertex, visited, dependencies)
  end

  dependencies
end

#old_valid_possibility_version_for_root_name?Object



64
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 64

alias old_valid_possibility_version_for_root_name? valid_possibility_version_for_root_name?

打印组件的所有依赖树



612
613
614
615
616
617
618
619
620
621
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 612

def print_dependency_tree(vertex, indent = 0, visited = Set.new)
  return if visited.include?(vertex.name)
  visited.add(vertex.name)

  puts "#{'  ' * indent}#{vertex.name} (#{vertex.payload&.version || '?'})"

  vertex.outgoing_edges.each do |edge|
    print_dependency_tree(edge.destination, indent + 1, visited)
  end
end


551
552
553
554
555
556
557
558
559
560
561
562
563
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 551

def print_worktree_identity_debug(local_pods, stage)
  return unless ENV['MEITU_BIN_WORKTREE_DEBUG'] == '1'

  roots = local_pods.map { |name| Pod::Specification.root_name(name) }.uniq.sort
  missing = roots.reject { |name| PodUpdateConfig.get_worktree_identity(name) }
  if stage == 'after_precompute'
    UI.puts "worktree_identity_debug(rule): #{CBin::Helpers::WorktreeIdentity.rule_version}".yellow
  end
  UI.puts "worktree_identity_debug(#{stage}): local=#{roots.size}, resolved=#{roots.size - missing.size}, missing=#{missing.size}".yellow
  unless missing.empty?
    UI.puts "worktree_identity_debug_missing(#{stage}): #{missing.join(',')}".yellow
  end
end

#promote_local_path_pod_to_binary(pod_name, spec_version) ⇒ Object



565
566
567
568
569
570
571
572
573
574
575
576
577
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 565

def promote_local_path_pod_to_binary(pod_name, spec_version)
  root_name = Pod::Specification.root_name(pod_name)
  return if PodUpdateConfig.promoted_local_pod?(root_name)

  # 提升后的 root 不再视为本地 development pod,后续安装流程将按 binary pod 处理。
  PodUpdateConfig.promote_local_pod(root_name, {
    version: spec_version,
    identity: PodUpdateConfig.get_worktree_identity(root_name),
  })
  PodUpdateConfig.set_external_source({ name: root_name, source: { promoted_from: 'path' } })
  sandbox.development_pods.delete(root_name)
  sandbox.remove_local_podspec(root_name) if sandbox.respond_to?(:remove_local_podspec)
end

#read_black_listObject

读取黑名单



92
93
94
95
96
97
98
99
100
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 92

def read_black_list
  config_file = File.join(Pod::Config.instance.project_root, 'BinConfig.yaml')
  return nil unless File.exist?(config_file)
  config = YAML.load(File.open(config_file))
  return nil if config.nil?
  install_config = config['install_config']
  return nil if install_config.nil?
  install_config['black_list']
end

#requirement_satisfied_by?(requirement, activated, spec) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 72

def requirement_satisfied_by?(requirement, activated, spec)
  version = spec.version
  return false unless requirement.requirement.satisfied_by?(version)

  shared_possibility_versions, prerelease_requirement = possibility_versions_for_root_name(requirement, activated)
  if !shared_possibility_versions.empty? && !shared_possibility_versions.include?(version)
    return false
  end
  if !podfile.allow_prerelease? && version.prerelease? && !prerelease_requirement
    return false
  end
  unless spec_is_platform_compatible?(activated, requirement, spec)
    return false
  end

  true
end

#specifications_for_dependency(dependency, additional_requirements_frozen = []) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 35

def specifications_for_dependency(dependency, additional_requirements_frozen = [])
  additional_requirements = additional_requirements_frozen.dup.compact
  requirement = Requirement.new(dependency.requirement.as_list + additional_requirements.flat_map(&:as_list))
  if podfile.allow_prerelease? && !requirement.prerelease?
    requirement = Requirement.new(dependency.requirement.as_list.map { |r| r + '.a' } + additional_requirements.flat_map(&:as_list))
  end

  options = if Pod.match_version?('~> 1.7')
              podfile.installation_options
            else
              installation_options
            end

  if Pod.match_version?('~> 1.8')
    specifications = find_cached_set(dependency)
                     .all_specifications(options.warn_for_multiple_pod_sources, requirement)
  else
    specifications = find_cached_set(dependency)
                     .all_specifications(options.warn_for_multiple_pod_sources)
                     .select { |s| requirement.satisfied_by? s.version }
  end

  specifications
    .map { |s| s.subspec_by_name(dependency.name, false, true) }
    .compact
end

#valid_possibility_version_for_root_name?(requirement, activated, spec) ⇒ Boolean

Returns:

  • (Boolean)


66
67
68
69
70
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 66

def valid_possibility_version_for_root_name?(requirement, activated, spec)
  return true if podfile.allow_prerelease?

  old_valid_possibility_version_for_root_name?(requirement, activated, spec)
end

#version_helperObject



545
546
547
548
549
# File 'lib/cocoapods-meitu-bin/native/resolver.rb', line 545

def version_helper
  @version_helper ||= begin
                        CBin::BuildAll::BinHelper.new
                      end
end