Skip to content

it seems link with new external target is not work due to add sub project can not work properly #1010

@RayCyder

Description

@RayCyder

file :xcodeproj/project/object/helpers/file_references_factory.rb
function:def new_subproject(group, path, source_tree)
can not work properly,so i changed it:

def new_subproject(group, path, source_tree)
  ref = new_file_reference(group.project.main_group, path, source_tree)
  ref.include_in_index = nil

  product_group_ref = find_products_group_ref(group, true)
  #add project ref to main group
  #create a Products group to hold proxy targets and remove it from project add it only to project_reference
  if group == group.project.main_group
    product_group_ref = group.project.new_group("Products")
    product_group_ref.remove_from_project
  end

  subproj = Project.open(path)
  subproj.products_group.files.each do |product_reference|
    container_proxy = group.project.new(PBXContainerItemProxy)
    container_proxy.container_portal = ref.uuid
    container_proxy.proxy_type = Constants::PROXY_TYPES[:reference]
    container_proxy.remote_global_id_string = product_reference.uuid
    container_proxy.remote_info = 'Subproject'

    reference_proxy = group.project.new(PBXReferenceProxy)
    extension = File.extname(product_reference.path)[1..-1]
    reference_proxy.file_type = product_reference.explicit_file_type#Constants::FILE_TYPES_BY_EXTENSION[extension]
    reference_proxy.remote_ref = container_proxy
    reference_proxy.source_tree = product_reference.source_tree #'BUILT_PRODUCTS_DIR'
    #just for correct name
    old_path = product_reference.path.to_s
    name = old_path
    path = old_path
    puts old_path.split('/').first
    if old_path.split('/').first.end_with?(".framework")
    name = old_path  # Get last part after "/"
    path = old_path.split('/').first # Get the framework name
    elsif old_path.split('/').first.end_with?(".app")
    name = File.basename(old_path, ".app") # Remove .app extension
    path = old_path
    end
    reference_proxy.name = name
    reference_proxy.path = path
    #just for correct name end


    product_group_ref << reference_proxy
  end

  attribute = PBXProject.references_by_keys_attributes.find { |attrb| attrb.name == :project_references }
  project_reference = ObjectDictionary.new(attribute, group.project.root_object)
  project_reference[:project_ref] = ref
  project_reference[:product_group] = product_group_ref
  group.project.root_object.project_references << project_reference

  ref
end

usage:

# Add subprojects
def add_subproject(main_project, subproject_path)
    # Check if project reference already exists
    existing_ref = main_project.root_object.project_references.find { |ref| ref[:project_ref].path == subproject_path }
    return existing_ref[:project_ref] if existing_ref
    
    #here should use main_group,in new_reference should create a Products Group
    reference = main_project.main_group.new_reference(subproject_path)
    #puts "reference: #{reference.class}"
    main_project.save()
    return reference
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions