class XcodeArchiveCache::Injection::PodsXCFrameworkFixer

Attributes

build_settings_interpolator[R]

@return [XcodeArchiveCache::BuildSettings::StringInterpolator]

checked_targets[RW]

@return [Array<String>]

configuration_name[R]

@return [String]

native_target_finder[R]

@return [XcodeArchive::BuildGraph::NativeTargetFinder]

shell_executor[R]

@return [XcodeArchiveCache::Shell::Executor]

storage[R]

@return [XcodeArchive::Injection::InjectionStorage]

Public Class Methods

new(storage, native_target_finder, configuration_name) click to toggle source

@param [XcodeArchiveCache::Injection::Storage] storage @param [XcodeArchive::BuildGraph::NativeTargetFinder] native_target_finder @param [String] configuration_name

# File lib/injection/pods_xcframework_fixer.rb, line 11
def initialize(storage, native_target_finder, configuration_name)
  @storage = storage
  @native_target_finder = native_target_finder
  @configuration_name = configuration_name
  @shell_executor = XcodeArchiveCache::Shell::Executor.new
  @build_settings_interpolator = XcodeArchiveCache::BuildSettings::StringInterpolator.new
  @checked_targets = []
end

Public Instance Methods

fix(target, build_settings_loader) click to toggle source

@param [Xcodeproj::Project::Object::PBXAbstractTarget] target @param [XcodeArchiveCache::BuildSettings::Container] build_settings

# File lib/injection/pods_xcframework_fixer.rb, line 23
def fix(target, build_settings_loader)
  checked_targets.push(target.equatable_identifier)
  build_settings = build_settings_loader.get_settings(target.project.path, target.display_name)

  debug("fixing #{target.display_name}")
  script_path = find_copy_xcframeworks_script(target, build_settings)
  if script_path != nil
    fix_file(script_path)
    
    unless shell_executor.execute_with_env(script_path, build_settings.all)
      raise XcodeArchiveCache::Informative, "Failed to execute Pods XCFramework script #{script_path}"
    end
  end

  embed_frameworks_script_path = find_embed_frameworks_script(target, build_settings)
  if embed_frameworks_script_path != nil
    fix_file(embed_frameworks_script_path)
  end

  build_configuration = target.find_build_configuration(configuration_name)
  if build_configuration.has_xcconfig?
    fix_xcconfig_recursively(build_configuration.get_xcconfig_path, build_configuration.get_project_dir)
  end

  dependencies = native_target_finder.find_all_dependencies(target)
  dependencies.each do |dependency_target|
    if checked_targets.include?(dependency_target.equatable_identifier)
      next
    end

    fix(dependency_target, build_settings_loader)
  end
end

Private Instance Methods

find_copy_xcframeworks_script(target, build_settings) click to toggle source

@param [Xcodeproj::Project::Object::PBXAbstractTarget] target @param [XcodeArchiveCache::BuildSettings::Container] build_settings

@return [String]

# File lib/injection/pods_xcframework_fixer.rb, line 101
def find_copy_xcframeworks_script(target, build_settings)
  target.find_script(build_settings_interpolator, build_settings, "[CP] Copy XCFrameworks")
end
find_embed_frameworks_script(target, build_settings) click to toggle source

@param [Xcodeproj::Project::Object::PBXAbstractTarget] target @param [XcodeArchiveCache::BuildSettings::Container] build_settings

@return [String]

# File lib/injection/pods_xcframework_fixer.rb, line 110
def find_embed_frameworks_script(target, build_settings)
  target.find_script(build_settings_interpolator, build_settings, "[CP] Embed Pods Frameworks")
end
fix_file(file_path) click to toggle source

@param [String] file_path

# File lib/injection/pods_xcframework_fixer.rb, line 116
def fix_file(file_path)
  debug("fixing #{file_path}")
  contents = File
    .read(file_path)
    .gsub("${PODS_XCFRAMEWORKS_BUILD_DIR}", storage.container_dir_path)

  File.open(file_path, "w") {|file| file.puts(contents)}
end
fix_xcconfig_recursively(path, project_dir) click to toggle source

@param [String] path @param [String] project_dir

# File lib/injection/pods_xcframework_fixer.rb, line 86
def fix_xcconfig_recursively(path, project_dir)
  fix_file(path)
  xcconfig = Xcodeproj::Config.new(path)

  xcconfig.includes.each do |included_xcconfig|
    included_xcconfig_path = File.join(project_dir, included_xcconfig)
    fix_xcconfig_recursively(included_xcconfig_path, project_dir)
  end
end