From f099f5402abfa201e9f7ec2ef21a8918c30c4095 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 10 Feb 2025 12:33:11 +0100 Subject: [PATCH 1/2] fix: correctly map project target framework --- Package.resolved | 10 +-- .../Mappers/Graph/XcodeGraphMapper.swift | 21 +++++-- .../PBXFrameworksBuildPhaseMapper.swift | 40 +++++++++--- .../Mappers/Project/PBXProjectMapper.swift | 16 ++++- .../Mappers/Targets/PBXTargetMapper.swift | 22 +++++-- .../Utilities/ProjectNativeTarget.swift | 7 +++ .../PBXFrameworksBuildPhaseMapperTests.swift | 63 ++++++++++++++++++- .../Project/PBXProjectMapperTests.swift | 14 ++--- .../Target/PBXTargetMapperTests.swift | 22 +++---- 9 files changed, 169 insertions(+), 46 deletions(-) create mode 100644 Sources/XcodeGraphMapper/Utilities/ProjectNativeTarget.swift diff --git a/Package.resolved b/Package.resolved index e900c7e0..9b9bd94d 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "d85d2800ade4b7815fc45dc86a042a0565bf66be2c0a52d40c24b35d11f9a0be", + "originHash" : "252c1ee702d5bd9c4155485fe13cdca178e46fc497b3f48683ff138bb43d7492", "pins" : [ { "identity" : "aexml", @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/Command.git", "state" : { - "revision" : "437e0c0ca18d1a16194c55b4690971b5bfb1f185", - "version" : "0.12.0" + "revision" : "9d03a95faa94b961edc1cf2c5f4379b0108ee97a", + "version" : "0.12.1" } }, { @@ -141,8 +141,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-service-context", "state" : { - "revision" : "0c62c5b4601d6c125050b5c3a97f20cce881d32b", - "version" : "1.1.0" + "revision" : "8946c930cae601452149e45d31d8ddfac973c3c7", + "version" : "1.2.0" } }, { diff --git a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift index 0d6615be..6249548f 100644 --- a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift @@ -168,12 +168,25 @@ public struct XcodeGraphMapper: XcodeGraphMapping { private func loadProjects(_ projectPaths: [AbsolutePath]) async throws -> [AbsolutePath: Project] { var projects = [AbsolutePath: Project]() + let xcodeProjects = try projectPaths.map { + try XcodeProj(pathString: $0.pathString) + } + let projectNativeTargets: [String: ProjectNativeTarget] = xcodeProjects.reduce(into: [:]) { acc, xcodeProject in + for nativeTarget in xcodeProject.pbxproj.nativeTargets { + acc[nativeTarget.name] = ProjectNativeTarget( + nativeTarget: nativeTarget, + project: xcodeProject + ) + } + } - for path in projectPaths { - let xcodeProj = try XcodeProj(pathString: path.pathString) + for xcodeProject in xcodeProjects { let projectMapper = PBXProjectMapper() - let project = try await projectMapper.map(xcodeProj: xcodeProj) - projects[path.parentDirectory] = project + let project = try await projectMapper.map( + xcodeProj: xcodeProject, + projectNativeTargets: projectNativeTargets + ) + projects[project.path] = project } return projects diff --git a/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift b/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift index e87851ab..1df1474a 100644 --- a/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift @@ -14,7 +14,8 @@ protocol PBXFrameworksBuildPhaseMapping { /// - Throws: If any file paths or references cannot be resolved. func map( _ frameworksBuildPhase: PBXFrameworksBuildPhase, - xcodeProj: XcodeProj + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] ) throws -> [TargetDependency] } @@ -28,10 +29,17 @@ struct PBXFrameworksBuildPhaseMapper: PBXFrameworksBuildPhaseMapping { func map( _ frameworksBuildPhase: PBXFrameworksBuildPhase, - xcodeProj: XcodeProj + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] ) throws -> [TargetDependency] { let files = frameworksBuildPhase.files ?? [] - return try files.map { try mapFrameworkDependency($0, xcodeProj: xcodeProj) } + return try files.map { + try mapFrameworkDependency( + $0, + xcodeProj: xcodeProj, + projectNativeTargets: projectNativeTargets + ) + } } // MARK: - Private Helpers @@ -39,22 +47,34 @@ struct PBXFrameworksBuildPhaseMapper: PBXFrameworksBuildPhaseMapping { /// Maps a single PBXBuildFile from the frameworks build phase to a `TargetDependency`. private func mapFrameworkDependency( _ buildFile: PBXBuildFile, - xcodeProj: XcodeProj + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] ) throws -> TargetDependency { let fileRef = try buildFile.file.throwing(PBXFrameworksBuildPhaseMappingError.missingFileReference) switch fileRef.sourceTree { case .buildProductsDir: guard let path = fileRef.path else { break } let name = path.replacingOccurrences(of: ".framework", with: "") - return .target( - name: name, - status: .required, - condition: nil - ) + let linkingStatus: LinkingStatus = (buildFile.settings?["ATTRIBUTES"] as? [String])? + .contains("Weak") == true ? .optional : .required + if let target = xcodeProj.pbxproj.targets(named: name).first { + return .target( + name: target.name, + status: linkingStatus, + condition: nil + ) + } else if let projectNativeTarget = projectNativeTargets[name] { + return .project( + target: projectNativeTarget.nativeTarget.name, + path: projectNativeTarget.project.projectPath.parentDirectory, + status: linkingStatus, + condition: nil + ) + } default: break } - let filePathString = try fileRef.fullPath(sourceRoot: xcodeProj.srcPathString) + let filePathString = try! fileRef.fullPath(sourceRoot: xcodeProj.srcPathString) .throwing(PBXFrameworksBuildPhaseMappingError.missingFilePath(name: fileRef.name)) let absolutePath = try AbsolutePath(validating: filePathString) diff --git a/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift b/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift index 9e01a7d8..b5518349 100644 --- a/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift @@ -14,7 +14,10 @@ protocol PBXProjectMapping { /// - Parameter xcodeProj: The Xcode project to be transformed. /// - Returns: A fully constructed `Project` model. /// - Throws: If reading or transforming project data fails. - func map(xcodeProj: XcodeProj) async throws -> Project + func map( + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] + ) async throws -> Project } /// A mapper that transforms a `.xcodeproj` into a `Project` domain model. @@ -31,7 +34,10 @@ struct PBXProjectMapper: PBXProjectMapping { /// - Parameter xcodeProj: The Xcode project reference containing `.pbxproj` data. /// - Returns: A fully constructed `Project` model. /// - Throws: If reading or transforming project data fails. - func map(xcodeProj: XcodeProj) async throws -> Project { + func map( + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] + ) async throws -> Project { let settingsMapper = XCConfigurationMapper() let pbxProject = try xcodeProj.mainPBXProject() let xcodeProjPath = xcodeProj.projectPath @@ -48,7 +54,11 @@ struct PBXProjectMapper: PBXProjectMapping { let targets = try await withThrowingTaskGroup(of: Target.self, returning: [Target].self) { taskGroup in for pbxTarget in pbxProject.targets { taskGroup.addTask { - try await targetMapper.map(pbxTarget: pbxTarget, xcodeProj: xcodeProj) + try await targetMapper.map( + pbxTarget: pbxTarget, + xcodeProj: xcodeProj, + projectNativeTargets: projectNativeTargets + ) } } diff --git a/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift b/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift index 692df994..32bde8d5 100644 --- a/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift @@ -45,7 +45,11 @@ protocol PBXTargetMapping { /// - Returns: A fully mapped `Target` model. /// - Throws: `PBXTargetMappingError` if required data (like a bundle identifier) is missing, /// or if necessary files/groups cannot be found. - func map(pbxTarget: PBXTarget, xcodeProj: XcodeProj) async throws -> Target + func map( + pbxTarget: PBXTarget, + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] + ) async throws -> Target } // swiftlint:disable function_body_length @@ -93,7 +97,11 @@ struct PBXTargetMapper: PBXTargetMapping { self.fileSystem = fileSystem } - func map(pbxTarget: PBXTarget, xcodeProj: XcodeProj) async throws -> Target { + func map( + pbxTarget: PBXTarget, + xcodeProj: XcodeProj, + projectNativeTargets: [String: ProjectNativeTarget] + ) async throws -> Target { let platform = try pbxTarget.platform() let deploymentTargets = pbxTarget.deploymentTargets() let productType = pbxTarget.productType?.mapProductType() @@ -146,7 +154,11 @@ struct PBXTargetMapper: PBXTargetMapping { // Frameworks & libraries let frameworksPhase = try pbxTarget.frameworksBuildPhase() var frameworks = try frameworksPhase.map { - try frameworksMapper.map($0, xcodeProj: xcodeProj) + try frameworksMapper.map( + $0, + xcodeProj: xcodeProj, + projectNativeTargets: projectNativeTargets + ) } ?? [] frameworks = try await fileSystemSynchronizedGroupsFrameworks( @@ -181,10 +193,10 @@ struct PBXTargetMapper: PBXTargetMapping { let metadata = try pbxTarget.metadata() // Dependencies - let targetDependencies = try pbxTarget.dependencies.compactMap { + let projectNativeTargets = try pbxTarget.dependencies.compactMap { try dependencyMapper.map($0, xcodeProj: xcodeProj) } - let allDependencies = (targetDependencies + frameworks).sorted { $0.name < $1.name } + let allDependencies = (projectNativeTargets + frameworks).sorted { $0.name < $1.name } // Construct final Target return Target( diff --git a/Sources/XcodeGraphMapper/Utilities/ProjectNativeTarget.swift b/Sources/XcodeGraphMapper/Utilities/ProjectNativeTarget.swift new file mode 100644 index 00000000..0352ad06 --- /dev/null +++ b/Sources/XcodeGraphMapper/Utilities/ProjectNativeTarget.swift @@ -0,0 +1,7 @@ +import XcodeProj + +/// Model representing a `PBXNativeTarget` in a give `XcodeProj` +struct ProjectNativeTarget { + let nativeTarget: PBXNativeTarget + let project: XcodeProj +} diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift index 1df5df19..923ff7d9 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift @@ -28,10 +28,31 @@ struct PBXFrameworksBuildPhaseMapperTests { ) let targetFrameworkBuildFile = PBXBuildFile(file: targetFrameworkRef).add(to: pbxProj) + let projectTargetPath = xcodeProj.projectPath.parentDirectory.appending( + components: "AnotherProject", + "AnotherProject.xcodeproj" + ) + let projectTargetFrameworkRef = PBXFileReference( + sourceTree: .buildProductsDir, + path: "ProjectTarget.framework" + ) + let projectTargetFrameworkBuildFile = PBXBuildFile(file: projectTargetFrameworkRef).add(to: pbxProj) + + let weakProjectTargetFrameworkRef = PBXFileReference( + sourceTree: .buildProductsDir, + path: "WeakProjectTarget.framework" + ) + let weakProjectTargetFrameworkBuildFile = PBXBuildFile( + file: weakProjectTargetFrameworkRef, + settings: ["ATTRIBUTES": ["Weak"]] + ).add(to: pbxProj) + let frameworksPhase = PBXFrameworksBuildPhase( files: [ frameworkBuildFile, targetFrameworkBuildFile, + projectTargetFrameworkBuildFile, + weakProjectTargetFrameworkBuildFile, ] ).add(to: pbxProj) @@ -43,10 +64,38 @@ struct PBXFrameworksBuildPhaseMapperTests { .add(to: pbxProj) .add(to: pbxProj.rootObject) + PBXNativeTarget( + name: "Target", + buildPhases: [frameworksPhase], + productType: .framework + ) + .add(to: pbxProj) + let mapper = PBXFrameworksBuildPhaseMapper() // When - let frameworks = try mapper.map(frameworksPhase, xcodeProj: xcodeProj) + let frameworks = try await mapper.map( + frameworksPhase, + xcodeProj: xcodeProj, + projectNativeTargets: [ + "ProjectTarget": ProjectNativeTarget( + nativeTarget: .test( + name: "ProjectTarget" + ), + project: .test( + path: projectTargetPath + ) + ), + "WeakProjectTarget": ProjectNativeTarget( + nativeTarget: .test( + name: "WeakProjectTarget" + ), + project: .test( + path: projectTargetPath + ) + ), + ] + ) // Then let frameworkPath = try AbsolutePath(validating: "/tmp/TestProject/Frameworks/MyFramework.framework") @@ -57,11 +106,23 @@ struct PBXFrameworksBuildPhaseMapperTests { status: .required, condition: nil ), + .project( + target: "ProjectTarget", + path: projectTargetPath.parentDirectory, + status: .required, + condition: nil + ), .target( name: "Target", status: .required, condition: nil ), + .project( + target: "WeakProjectTarget", + path: projectTargetPath.parentDirectory, + status: .optional, + condition: nil + ), ] ) } diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Project/PBXProjectMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Project/PBXProjectMapperTests.swift index 02b6ef8d..a36d42a5 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Project/PBXProjectMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Project/PBXProjectMapperTests.swift @@ -13,7 +13,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.name == "TestProject") @@ -38,7 +38,7 @@ struct PBXProjectMapperTests { xcodeProj.pbxproj.projects.first?.attributes = customAttributes // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.name == "TestProject") @@ -62,7 +62,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.packages.count == 1) @@ -82,7 +82,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.defaultKnownRegions?.count == 3) @@ -99,7 +99,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.developmentRegion == "fr") @@ -112,7 +112,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) let synthesizers = project.resourceSynthesizers // Then @@ -145,7 +145,7 @@ struct PBXProjectMapperTests { let mapper = PBXProjectMapper() // When - let project = try await mapper.map(xcodeProj: xcodeProj) + let project = try await mapper.map(xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(project.schemes.count == 1) diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift index e8ab4d73..5ecf87c4 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift @@ -26,7 +26,7 @@ struct PBXTargetMapperTests: Sendable { // When let mapper = PBXTargetMapper() - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(mapped.name == "App") @@ -50,7 +50,7 @@ struct PBXTargetMapperTests: Sendable { // When / Then await #expect(throws: PBXTargetMappingError.missingBundleIdentifier(targetName: "App")) { - _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) } } @@ -70,7 +70,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(mapped.environmentVariables["TEST_VAR"]?.value == "test_value") @@ -94,7 +94,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then let expected = [ @@ -130,7 +130,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(mapped.sources.count == 1) @@ -212,7 +212,7 @@ struct PBXTargetMapperTests: Sendable { ) // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect( @@ -285,7 +285,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(mapped.metadata.tags == Set(["tag1", "tag2", "tag3"])) @@ -338,7 +338,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect(mapped.entitlements == .file( @@ -361,7 +361,7 @@ struct PBXTargetMapperTests: Sendable { // When / Then do { - _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) Issue.record("Should throw an error") } catch { let err = try #require(error as? PBXObjectError) @@ -400,7 +400,7 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + let mapped = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) // Then #expect({ @@ -439,7 +439,7 @@ struct PBXTargetMapperTests: Sendable { // When / Then await #expect { - _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj) + _ = try await mapper.map(pbxTarget: target, xcodeProj: xcodeProj, projectNativeTargets: [:]) } throws: { error in error.localizedDescription == "Failed to read a valid plist dictionary from file at: \(invalidPlistPath.pathString)." From d81a5aa7473c0483cc9f351f109a6a6804f01d83 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 10 Feb 2025 13:57:43 +0100 Subject: [PATCH 2/2] Fix mapping package framework --- .../Phases/PBXFrameworksBuildPhaseMapper.swift | 9 ++++++++- .../Phases/PBXFrameworksBuildPhaseMapperTests.swift | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift b/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift index 1df1474a..0f008e1d 100644 --- a/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Phases/PBXFrameworksBuildPhaseMapper.swift @@ -50,6 +50,13 @@ struct PBXFrameworksBuildPhaseMapper: PBXFrameworksBuildPhaseMapping { xcodeProj: XcodeProj, projectNativeTargets: [String: ProjectNativeTarget] ) throws -> TargetDependency { + if let product = buildFile.product { + return .package( + product: product.productName, + type: .runtime, + condition: nil + ) + } let fileRef = try buildFile.file.throwing(PBXFrameworksBuildPhaseMappingError.missingFileReference) switch fileRef.sourceTree { case .buildProductsDir: @@ -74,7 +81,7 @@ struct PBXFrameworksBuildPhaseMapper: PBXFrameworksBuildPhaseMapping { default: break } - let filePathString = try! fileRef.fullPath(sourceRoot: xcodeProj.srcPathString) + let filePathString = try fileRef.fullPath(sourceRoot: xcodeProj.srcPathString) .throwing(PBXFrameworksBuildPhaseMappingError.missingFilePath(name: fileRef.name)) let absolutePath = try AbsolutePath(validating: filePathString) diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift index 923ff7d9..c87c2f7e 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Phases/PBXFrameworksBuildPhaseMapperTests.swift @@ -47,12 +47,18 @@ struct PBXFrameworksBuildPhaseMapperTests { settings: ["ATTRIBUTES": ["Weak"]] ).add(to: pbxProj) + let packageProduct = XCSwiftPackageProductDependency(productName: "PackageProduct") + let packageProductBuildFile = PBXBuildFile( + product: packageProduct + ).add(to: pbxProj) + let frameworksPhase = PBXFrameworksBuildPhase( files: [ frameworkBuildFile, targetFrameworkBuildFile, projectTargetFrameworkBuildFile, weakProjectTargetFrameworkBuildFile, + packageProductBuildFile, ] ).add(to: pbxProj) @@ -106,6 +112,11 @@ struct PBXFrameworksBuildPhaseMapperTests { status: .required, condition: nil ), + .package( + product: "PackageProduct", + type: .runtime, + condition: nil + ), .project( target: "ProjectTarget", path: projectTargetPath.parentDirectory,