diff --git a/CHANGELOG.md b/CHANGELOG.md index 39e58042..3fef5af1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next Version +- Fix missing productRefGroup in generated projects #1591 @ruslic19 + ## 2.45.1 ### Added diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 48fc8810..2aca0696 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 79aeefb4..b1cbbabc 100644 --- a/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj @@ -335,6 +335,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 aba46c9a..2799afcc 100644 --- a/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj @@ -263,6 +263,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 af01fcbe..306e8a0d 100644 --- a/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj @@ -132,6 +132,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 03e2a542..8a2c46fc 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -2499,6 +2499,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 ddb2e470..38d8c07a 100644 --- a/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/scheme_test/TestProject.xcodeproj/project.pbxproj @@ -85,6 +85,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 232995c8..842cb86c 100644 --- a/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/PBXProjGeneratorTests.swift @@ -436,6 +436,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")