class Pod::Installer::UserProjectIntegrator::TargetIntegrator


{TargetDefinition} with its destination project.
This class is responsible for integrating the library generated by a

def add_check_manifest_lock_script_phase

Returns:
  • (void) -

Other tags:
    Note: - The build phase is appended to the front because to fail
def add_check_manifest_lock_script_phase
  phase_name = 'Check Pods Manifest.lock'
  native_targets.each do |native_target|
    next if native_target.shell_script_build_phases.any? { |phase| phase.name == phase_name }
    phase = native_target.project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
    native_target.build_phases.unshift(phase)
    phase.name = phase_name
    phase.shell_script = <<-EOS.strip_heredoc
      diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
      if [[ $? != 0 ]] ; then
          cat << EOM
      error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
      EOM
          exit 1
      fi
    EOS
    phase.show_env_vars_in_log = '0'
  end
end

def add_copy_resources_script_phase

Returns:
  • (void) -
def add_copy_resources_script_phase
  phase_name = "Copy Pods Resources"
  native_targets.each do |native_target|
    phase = native_target.shell_script_build_phases.select { |bp| bp.name == phase_name }.first ||
            native_target.new_shell_script_build_phase(phase_name)
    path  = target.copy_resources_script_relative_path
    phase.shell_script = %{"#{path}"\n}
    phase.show_env_vars_in_log = '0'
  end
end

def add_pods_library

Returns:
  • (void) -
def add_pods_library
  frameworks = user_project.frameworks_group
  native_targets.each do |native_target|
    library = frameworks.files.select { |f| f.path == target.product_name }.first ||
              frameworks.new_product_ref_for_target(target.name, :static_library)
    unless native_target.frameworks_build_phase.files_references.include?(library)
           native_target.frameworks_build_phase.add_file_reference(library)
    end
  end
end

def add_xcconfig_base_configuration

Returns:
  • (void) -

Other tags:
    Todo: - If the xcconfig is already set don't override it and inform

Other tags:
    Note: - It also checks if any build setting of the build
def add_xcconfig_base_configuration
  xcconfig = user_project.files.select { |f| f.path == target.xcconfig_relative_path }.first ||
             user_project.new_file(target.xcconfig_relative_path)
  native_targets.each do |native_target|
    check_overridden_build_settings(target.xcconfig, native_target)
    native_target.build_configurations.each do |config|
      config.base_configuration_reference = xcconfig
    end
  end
end

def check_overridden_build_settings(xcconfig, native_target)

Returns:
  • (void) -
def check_overridden_build_settings(xcconfig, native_target)
  return unless xcconfig
  configs_by_overridden_key = {}
  native_target.build_configurations.each do |config|
    xcconfig.attributes.keys.each do |key|
      target_value = config.build_settings[key]
      if target_value && !target_value.include?('$(inherited)')
        configs_by_overridden_key[key] ||= []
        configs_by_overridden_key[key] << config.name
      end
    end
    configs_by_overridden_key.each do |key, config_names|
      name    = "#{native_target.name} [#{config_names.join(' - ')}]"
      actions = [
        "Use the `$(inherited)` flag, or",
        "Remove the build settings from the target."
      ]
      UI.warn("The target `#{name}` overrides the `#{key}` build " \
              "setting defined in `#{target.xcconfig_relative_path}'.",
              actions)
    end
  end
end

def initialize(target)

Parameters:
  • target (Target) -- @see #target_definition
def initialize(target)
  @target = target
end

def inspect

Returns:
  • (String) - a string representation suitable for debugging.
def inspect
  "#<#{self.class} for target `#{target.label}'>"
end

def integrate!

Returns:
  • (void) -
def integrate!
  return if native_targets.empty?
  UI.section(integration_message) do
    add_xcconfig_base_configuration
    add_pods_library
    add_copy_resources_script_phase
    add_check_manifest_lock_script_phase
    user_project.save
  end
end

def integration_message

Returns:
  • (String) - the message that should be displayed for the target
def integration_message
  "Integrating Pod #{'target'.pluralize(target.pod_targets.size)} " \
    "`#{target.pod_targets.map(&:name).to_sentence}` " \
    "into aggregate target #{target.name} " \
    "of project #{UI.path target.user_project_path}."
end

def native_targets

Returns:
  • (Array) - the user targets for integration.
def native_targets
  unless @native_targets
    target_uuids = target.user_target_uuids
    native_targets = target_uuids.map do |uuid|
      native_target = user_project.objects_by_uuid[uuid]
      unless native_target
        raise Informative, "[Bug] Unable to find the target with " \
          "the `#{uuid}` UUID for the `#{target}` integration library"
      end
      native_target
    end
    non_integrated = native_targets.reject do |native_target|
      native_target.frameworks_build_phase.files.any? do |build_file|
        file_ref = build_file.file_ref
        file_ref &&
          file_ref.isa == 'PBXFileReference' &&
          file_ref.display_name == target.product_name
      end
    end
    @native_targets = non_integrated
  end
  @native_targets
end

def pods_project


other TargetIntegrators might have modified it.
Read the pods project from the disk to ensure that it is up to date as
def pods_project
  @pods_project ||= Xcodeproj::Project.open(target.sandbox.project_path)
end

def spec_consumers

Returns:
  • (Specification::Consumer) - the consumer for the specifications.
def spec_consumers
  @spec_consumers ||= target.pod_targets.map(&:file_accessors).flatten.map(&:spec_consumer)
end

def user_project


other TargetIntegrators might have modified it.
Read the project from the disk to ensure that it is up to date as
def user_project
  @user_project ||= Xcodeproj::Project.open(target.user_project_path)
end