diff --git a/CHANGELOG.md b/CHANGELOG.md index bc18bf44..339d4301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Next Version +### Fixed +- Fix missing productRefGroup in generated projects #1591 @ruslic19 + ## 2.44.1 ### Fixed diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 8dcad5af..256ac5e1 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -190,6 +190,7 @@ public class PBXProjGenerator { ) ) derivedGroups.append(productGroup) + pbxProject.productsGroup = productGroup let sortedProjectReferences = project.projectReferences.sorted { $0.name < $1.name } let subprojectFileReferences: [PBXFileReference] = sortedProjectReferences.map { projectReference in diff --git a/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj index 5b62b813..85329cbd 100644 --- a/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj @@ -334,6 +334,7 @@ mainGroup = 293D0FF827366B513839236A; minimizedProjectReferenceProxies = 1; preferredProjectObjectVersion = 77; + productRefGroup = AC523591AC7BE9275003D2DB /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( diff --git a/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj b/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj index eef5a9d7..107d5ccb 100644 --- a/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj @@ -262,6 +262,7 @@ C6539B364583AE96C18CE377 /* XCLocalSwiftPackageReference "../../.." */, ); preferredProjectObjectVersion = 77; + productRefGroup = 5D68FDDE55EE935627A1B376 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( diff --git a/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj index 00cc8462..d589aabb 100644 --- a/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj @@ -131,6 +131,7 @@ mainGroup = 4E8CFA4275C972686621210C; minimizedProjectReferenceProxies = 1; preferredProjectObjectVersion = 77; + productRefGroup = 6BB7980FAF18A93459B051A1 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 6aa8bed9..6fd1e9ed 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -2460,6 +2460,7 @@ 4EDA79334592CBBA0E507AD2 /* XCRemoteSwiftPackageReference "Swinject" */, ); preferredProjectObjectVersion = 77; + productRefGroup = AC523591AC7BE9275003D2DB /* Products */; projectDirPath = ""; projectReferences = ( { diff --git a/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj b/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj index baed78ca..85e0a447 100644 --- a/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj @@ -84,6 +84,7 @@ mainGroup = 2D08B11F4EE060D112B7BCA1; minimizedProjectReferenceProxies = 1; preferredProjectObjectVersion = 77; + productRefGroup = 5B8D13EAC88739DF2D92F8AE /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( diff --git a/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift b/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift index 31873cdc..5e3ea007 100644 --- a/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift @@ -391,6 +391,57 @@ class PBXProjGeneratorTests: XCTestCase { } } + func testProductsGroupIsSet() throws { + let target = Target(name: "TestApp", type: .application, platform: .iOS) + let project = Project(name: "Test", targets: [target]) + let projGenerator = PBXProjGenerator(project: project) + + let pbxProj = try projGenerator.generate() + + let pbxProject = try XCTUnwrap(pbxProj.projects.first) + let productsGroup = try XCTUnwrap(pbxProject.productsGroup) + + XCTAssertEqual(productsGroup.name, "Products") + XCTAssertEqual(productsGroup.children.count, 1) + + let productReference = try XCTUnwrap(productsGroup.children.first as? PBXFileReference) + XCTAssertEqual(productReference.path, "TestApp.app") + } + + func testProductsGroupIsSetWithMultipleTargets() throws { + let appTarget = Target(name: "TestApp", type: .application, platform: .iOS) + let frameworkTarget = Target(name: "TestFramework", type: .framework, platform: .iOS) + let project = Project(name: "Test", targets: [appTarget, frameworkTarget]) + let projGenerator = PBXProjGenerator(project: project) + + let pbxProj = try projGenerator.generate() + + let pbxProject = try XCTUnwrap(pbxProj.projects.first) + let productsGroup = try XCTUnwrap(pbxProject.productsGroup) + + XCTAssertEqual(productsGroup.name, "Products") + XCTAssertEqual(productsGroup.children.count, 2) + + let productNames = productsGroup.children + .compactMap { $0 as? PBXFileReference } + .compactMap { $0.path } + .sorted() + XCTAssertEqual(productNames, ["TestApp.app", "TestFramework.framework"]) + } + + func testProductsGroupIsSetWithNoTargets() throws { + let project = Project(name: "Test") + let projGenerator = PBXProjGenerator(project: project) + + let pbxProj = try projGenerator.generate() + + let pbxProject = try XCTUnwrap(pbxProj.projects.first) + let productsGroup = try XCTUnwrap(pbxProject.productsGroup) + + XCTAssertEqual(productsGroup.name, "Products") + XCTAssertEqual(productsGroup.children.count, 0) + } + func testPlatformDependencies() { describe { let directoryPath = Path("TestDirectory")