diff --git a/Sources/XcodeProj/Objects/Project/PBXProjEncoder.swift b/Sources/XcodeProj/Objects/Project/PBXProjEncoder.swift index 7321fb1d0..6e38c4747 100644 --- a/Sources/XcodeProj/Objects/Project/PBXProjEncoder.swift +++ b/Sources/XcodeProj/Objects/Project/PBXProjEncoder.swift @@ -54,6 +54,7 @@ final class PBXProjEncoder { sort(buildPhases: proj.objects.resourcesBuildPhases, outputSettings: outputSettings) sort(buildPhases: proj.objects.sourcesBuildPhases, outputSettings: outputSettings) sort(navigatorGroups: proj.objects.groups, outputSettings: outputSettings) + sortProjectReferences(for: proj.projects, outputSettings: outputSettings) var output = [String]() var stateHolder = StateHolder() @@ -468,4 +469,23 @@ final class PBXProjEncoder { navigatorGroups.values.forEach { $0.children = $0.children.sorted(by: sort) } } } + + private func sortProjectReferences(for projects: [PBXProject], outputSettings: PBXOutputSettings) { + guard outputSettings.projReferenceFormat == .xcode else { + return + } + + for project in projects { + /// The project references are sorted alphabetically based on the name of the project it's being referenced. + project.projectReferences = project.projectReferences.sorted(by: { lhs, rhs in + let lProjectRef = lhs["ProjectRef"]! + let lFile: PBXFileElement = lProjectRef.getObject()! + let rProjectRef = rhs["ProjectRef"]! + let rFile: PBXFileElement = rProjectRef.getObject()! + let lName = lFile.name! + let rName = rFile.name! + return lName.compare(rName, options: .caseInsensitive) == .orderedAscending + }) + } + } } diff --git a/Tests/XcodeProjTests/Objects/Project/PBXProjEncoderTests.swift b/Tests/XcodeProjTests/Objects/Project/PBXProjEncoderTests.swift index 482bf8cce..fe3b9e54b 100644 --- a/Tests/XcodeProjTests/Objects/Project/PBXProjEncoderTests.swift +++ b/Tests/XcodeProjTests/Objects/Project/PBXProjEncoderTests.swift @@ -328,6 +328,8 @@ class PBXProjEncoderTests: XCTestCase { line = lines.validate(line: "/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */", after: line) } + // MARK: - Projects + // MARK: - Build phases func test_build_phase_sources_unsorted_when_iOSProject() throws {