class Pod::Installer::Xcode::PodTargetDependencyInstaller

Wires up the dependencies between targets from the target installation results

Attributes

metadata_cache[R]

@return [ProjectMetadataCache] The metadata cache for targets.

pod_target_installation_results[R]

@return [TargetInstallationResults] The target installation results for pod targets.

sandbox[R]

@return [Sandbox] The sandbox used for this installation.

Public Class Methods

new(sandbox, pod_target_installation_results, metadata_cache) click to toggle source

Initialize a new instance.

@param [Sandbox] sandbox @see sandbox @param [TargetInstallationResults] pod_target_installation_results @see pod_target_installation_results @param [ProjectMetadataCache] metadata_cache @see metadata_cache

# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 27
def initialize(sandbox, pod_target_installation_results, metadata_cache)
  @sandbox = sandbox
  @pod_target_installation_results = pod_target_installation_results
  @metadata_cache = metadata_cache
end

Public Instance Methods

install!() click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 33
def install!
  # Wire up pod targets
  pod_target_installation_results.values.each do |pod_target_installation_result|
    pod_target = pod_target_installation_result.target
    native_target = pod_target_installation_result.native_target
    project = native_target.project

    # First, wire up all resource bundles.
    wire_resource_bundle_targets(pod_target_installation_result.resource_bundle_targets,
                                 native_target, pod_target)
    # Wire up all dependencies to this pod target, if any.
    wire_target_dependencies(pod_target, native_target, project, pod_target_installation_results,
                             metadata_cache)

    # Wire up test native targets.
    unless pod_target_installation_result.test_native_targets.empty?
      wire_test_native_targets(pod_target, pod_target_installation_result, pod_target_installation_results,
                               project, metadata_cache)
    end

    # Wire up app native targets.
    unless pod_target_installation_result.app_native_targets.empty?
      wire_app_native_targets(pod_target, pod_target_installation_result, pod_target_installation_results,
                              project, metadata_cache)
    end
  end
end

Private Instance Methods

wire_app_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache) click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 161
def wire_app_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache)
  installation_result.app_specs_by_native_target.each do |app_native_target, app_spec|
    resource_bundle_native_targets = installation_result.app_resource_bundle_targets[app_spec.name] || []
    resource_bundle_native_targets.each do |app_resource_bundle_target|
      app_native_target.add_dependency(app_resource_bundle_target)
    end

    app_dependent_targets = pod_target.app_dependent_targets_by_spec_name.fetch(app_spec.name, []).unshift(pod_target).uniq
    app_dependent_targets.each do |app_dependent_target|
      is_local = sandbox.local?(app_dependent_target.pod_name)
      if dependency_installation_result = pod_target_installation_results[app_dependent_target.name]
        resource_bundle_native_targets = dependency_installation_result.app_resource_bundle_targets[app_spec.name]
        unless resource_bundle_native_targets.nil?
          resource_bundle_native_targets.each do |app_resource_bundle_target|
            app_native_target.add_dependency(app_resource_bundle_target)
          end
        end
        dependency_project = dependency_installation_result.native_target.project
        if dependency_project != project
          project.add_pod_subproject(dependency_project, is_local)
        end
        app_native_target.add_dependency(dependency_installation_result.native_target)
      else
        # Hit the cache
        cached_dependency = metadata_cache.target_label_by_metadata[app_dependent_target.label]
        project.add_cached_pod_subproject(sandbox, cached_dependency, is_local)
        Project.add_cached_dependency(sandbox, app_native_target, cached_dependency)
      end
    end
  end
end
wire_resource_bundle_targets(resource_bundle_targets, native_target, pod_target) click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 63
def wire_resource_bundle_targets(resource_bundle_targets, native_target, pod_target)
  resource_bundle_targets.each do |resource_bundle_target|
    native_target.add_dependency(resource_bundle_target)
    if pod_target.build_as_dynamic_framework? && pod_target.should_build?
      native_target.add_resources([resource_bundle_target.product_reference])
    end
  end
end
wire_target_dependencies(pod_target, native_target, project, pod_target_installation_results, metadata_cache) click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 72
def wire_target_dependencies(pod_target, native_target, project, pod_target_installation_results, metadata_cache)
  dependent_targets = pod_target.dependent_targets
  dependent_targets.each do |dependent_target|
    is_local = sandbox.local?(dependent_target.pod_name)
    if installation_result = pod_target_installation_results[dependent_target.name]
      dependent_project = installation_result.native_target.project
      if dependent_project != project
        project.add_pod_subproject(dependent_project, is_local)
      end
      native_target.add_dependency(installation_result.native_target)
    else
      # Hit the cache
      cached_dependency = metadata_cache.target_label_by_metadata[dependent_target.label]
      project.add_cached_pod_subproject(sandbox, cached_dependency, is_local)
      Project.add_cached_dependency(sandbox, native_target, cached_dependency)
    end
  end
end
wire_test_native_target_app_host(test_native_target, pod_target, pod_target_installation_results, project, metadata_cache, app_host_pod_target_label, app_host_target_label) click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 122
def wire_test_native_target_app_host(test_native_target, pod_target, pod_target_installation_results, project, metadata_cache, app_host_pod_target_label, app_host_target_label)
  if dependency_installation_result = pod_target_installation_results[app_host_pod_target_label]
    unless app_native_target = dependency_installation_result.app_host_target_labelled(app_host_target_label)
      raise Informative, "Did not find target with label #{app_host_target_label} in the set of targets installed for #{app_host_pod_target_label}."
    end

    dependent_test_project = app_native_target.project
    if dependent_test_project != project
      project.add_subproject_reference(dependent_test_project, project.dependencies_group)
    end

    app_host_target_names = app_native_target.resolved_build_setting('PRODUCT_NAME', true)
    test_native_target.build_configurations.each do |configuration|
      app_host_target_name = app_host_target_names[configuration.name] || target.name
      case test_native_target.symbol_type
      when :unit_test_bundle
        test_host = "$(BUILT_PRODUCTS_DIR)/#{app_host_target_name}.app/"
        test_host << 'Contents/MacOS/' if pod_target.platform == :osx
        test_host << app_host_target_name.to_s
        configuration.build_settings['BUNDLE_LOADER'] = '$(TEST_HOST)'
        configuration.build_settings['TEST_HOST'] = test_host
      when :ui_test_bundle
        configuration.build_settings['TEST_TARGET_NAME'] = app_host_target_name
      end
    end
    target_attributes = project.root_object.attributes['TargetAttributes'] || {}
    target_attributes[test_native_target.uuid.to_s] = { 'TestTargetID' => app_native_target.uuid.to_s }
    project.root_object.attributes['TargetAttributes'] = target_attributes
    test_native_target.add_dependency(app_native_target)
  elsif cached_dependency = metadata_cache.target_label_by_metadata[app_host_target_label]
    # Hit the cache
    project.add_cached_subproject_reference(sandbox, cached_dependency, project.dependencies_group)
    Project.add_cached_dependency(sandbox, test_native_target, cached_dependency)
  else
    raise "Expected to either have an installation or cache result for #{app_host_target_label} (from pod #{app_host_pod_target_label}) " \
      "for target #{test_native_target.name} in project #{project.project_name}"
  end
end
wire_test_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache) click to toggle source
# File lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb, line 91
def wire_test_native_targets(pod_target, installation_result, pod_target_installation_results, project, metadata_cache)
  installation_result.test_specs_by_native_target.each do |test_native_target, test_spec|
    resource_bundle_native_targets = installation_result.test_resource_bundle_targets[test_spec.name] || []
    resource_bundle_native_targets.each do |test_resource_bundle_target|
      test_native_target.add_dependency(test_resource_bundle_target)
    end

    test_dependent_targets = pod_target.test_dependent_targets_by_spec_name.fetch(test_spec.name, []).+([pod_target]).uniq
    test_dependent_targets.each do |test_dependent_target|
      is_local = sandbox.local?(test_dependent_target.pod_name)
      if dependency_installation_result = pod_target_installation_results[test_dependent_target.name]
        dependent_test_project = dependency_installation_result.native_target.project
        if dependent_test_project != project
          project.add_pod_subproject(dependent_test_project, is_local)
        end
        test_native_target.add_dependency(dependency_installation_result.native_target)
      else
        # Hit the cache
        cached_dependency = metadata_cache.target_label_by_metadata[test_dependent_target.label]
        project.add_cached_pod_subproject(sandbox, cached_dependency, is_local)
        Project.add_cached_dependency(sandbox, test_native_target, cached_dependency)
      end
    end

    if app_host_target_label = pod_target.app_host_target_label(test_spec)
      app_host_pod_target_label, app_host_target_label = *app_host_target_label
      wire_test_native_target_app_host(test_native_target, pod_target, pod_target_installation_results, project, metadata_cache, app_host_pod_target_label, app_host_target_label)
    end
  end
end