diff --git a/.gitignore b/.gitignore index ba81efe3a..9573da370 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .DS_Store /.build /Packages - +.swiftpm # Created by https://www.gitignore.io/api/macos,swift,xcode,appcode,swiftpm ### AppCode ### diff --git a/CHANGELOG.md b/CHANGELOG.md index a64a8ddee..5de2fa2c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ - **Breaking** Added throwing an error in case group path can't be resolved by @damirdavletov - **Breaking** Added remote project support to PBXContainerItemProxy by @damirdavletov - **Breaking** Add support for `RemoteRunnable` https://github.com/tuist/xcodeproj/pull/400 by @pepibumur. -- Support for Swift Package Manager https://github.com/tuist/xcodeproj/pull/439 by @pepibumur. +- Support for Swift PM Packages https://github.com/tuist/xcodeproj/pull/439 https://github.com/tuist/xcodeproj/pull/444 by @pepibumur @yonaskolb. ### Fixed diff --git a/Sources/xcodeproj/Objects/Project/PBXProject.swift b/Sources/xcodeproj/Objects/Project/PBXProject.swift index f44816f60..1ee873aa6 100644 --- a/Sources/xcodeproj/Objects/Project/PBXProject.swift +++ b/Sources/xcodeproj/Objects/Project/PBXProject.swift @@ -128,12 +128,12 @@ public final class PBXProject: PBXObject { var packageReferences: [PBXObjectReference]? /// Swift packages. - var packages: [XCRemoteSwiftPackageReference]? { + public var packages: [XCRemoteSwiftPackageReference] { set { - packageReferences = newValue?.map { $0.reference } + packageReferences = newValue.references() } get { - return packageReferences?.objects() + return packageReferences?.objects() ?? [] } } @@ -175,14 +175,12 @@ public final class PBXProject: PBXObject { // Reference let reference = XCRemoteSwiftPackageReference(repositoryURL: repositoryURL, versionRules: versionRules) objects.add(object: reference) - if packages == nil { packages = [] } - packages?.append(reference) + packages.append(reference) // Product let productDependency = XCSwiftPackageProductDependency(productName: productName, package: reference) objects.add(object: productDependency) - if target?.packageProductDependencies == nil { target?.packageProductDependencies = [] } - target?.packageProductDependencies?.append(productDependency) + target?.packageProductDependencies.append(productDependency) // Build file let buildFile = PBXBuildFile(product: productDependency) @@ -223,6 +221,7 @@ public final class PBXProject: PBXObject { projects: [[String: PBXFileElement]] = [], projectRoots: [String] = [], targets: [PBXTarget] = [], + packages: [XCRemoteSwiftPackageReference] = [], attributes: [String: Any] = [:], targetAttributes: [PBXTarget: [String: Any]] = [:]) { self.name = name @@ -237,6 +236,7 @@ public final class PBXProject: PBXObject { projectReferences = projects.map { project in project.mapValues { $0.reference } } self.projectRoots = projectRoots targetReferences = targets.references() + packageReferences = packages.references() self.attributes = attributes targetAttributeReferences = [:] super.init() @@ -297,8 +297,8 @@ public final class PBXProject: PBXObject { let targetReferences: [String] = (try container.decodeIfPresent(.targets)) ?? [] self.targetReferences = targetReferences.map { referenceRepository.getOrCreate(reference: $0, objects: objects) } - let packageRefeferenceStrings: [String]? = try container.decodeIfPresent(.packageReferences) - packageReferences = packageRefeferenceStrings?.map { referenceRepository.getOrCreate(reference: $0, objects: objects) } + let packageRefeferenceStrings: [String] = try container.decodeIfPresent(.packageReferences) ?? [] + packageReferences = packageRefeferenceStrings.map { referenceRepository.getOrCreate(reference: $0, objects: objects) } var attributes = (try container.decodeIfPresent([String: Any].self, forKey: .attributes) ?? [:]) var targetAttributeReferences: [PBXObjectReference: [String: Any]] = [:] @@ -356,7 +356,7 @@ extension PBXProject: PlistSerializable { return .string(CommentedString(targetReference.value, comment: target?.name)) }) - if let packages = packages { + if !packages.isEmpty { dictionary["packageReferences"] = PlistValue.array(packages.map { .string(CommentedString($0.reference.value, comment: "XCRemoteSwiftPackageReference \"\($0.name ?? "")\"")) }) diff --git a/Sources/xcodeproj/Objects/SwiftPackage/XCRemoteSwiftPackageReference.swift b/Sources/xcodeproj/Objects/SwiftPackage/XCRemoteSwiftPackageReference.swift index 74e8e72b5..836641136 100644 --- a/Sources/xcodeproj/Objects/SwiftPackage/XCRemoteSwiftPackageReference.swift +++ b/Sources/xcodeproj/Objects/SwiftPackage/XCRemoteSwiftPackageReference.swift @@ -111,17 +111,17 @@ public class XCRemoteSwiftPackageReference: PBXContainerItem, PlistSerializable } /// Repository url. - var repositoryURL: String? + public var repositoryURL: String? /// Version rules. - var versionRules: VersionRules? + public var versionRules: VersionRules? /// Initializes the remote swift package reference with its attributes. /// /// - Parameters: /// - repositoryURL: Package repository url. /// - versionRules: Package version rules. - init(repositoryURL: String, + public init(repositoryURL: String, versionRules: VersionRules? = nil) { self.repositoryURL = repositoryURL self.versionRules = versionRules @@ -143,7 +143,7 @@ public class XCRemoteSwiftPackageReference: PBXContainerItem, PlistSerializable } /// It returns the name of the package reference. - var name: String? { + public var name: String? { return repositoryURL?.split(separator: "/").last?.replacingOccurrences(of: ".git", with: "") } diff --git a/Sources/xcodeproj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift b/Sources/xcodeproj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift index c441e6063..11d5f0fb6 100644 --- a/Sources/xcodeproj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift +++ b/Sources/xcodeproj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift @@ -9,7 +9,7 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl var packageReference: PBXObjectReference? /// Package the product dependency refers to. - var package: XCRemoteSwiftPackageReference? { + public var package: XCRemoteSwiftPackageReference? { get { return packageReference?.getObject() } @@ -20,7 +20,7 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl // MARK: - Init - init(productName: String, + public init(productName: String, package: XCRemoteSwiftPackageReference? = nil) { self.productName = productName packageReference = package?.reference diff --git a/Sources/xcodeproj/Objects/Targets/PBXTarget.swift b/Sources/xcodeproj/Objects/Targets/PBXTarget.swift index 331e85fc1..a159716ad 100644 --- a/Sources/xcodeproj/Objects/Targets/PBXTarget.swift +++ b/Sources/xcodeproj/Objects/Targets/PBXTarget.swift @@ -74,15 +74,15 @@ public class PBXTarget: PBXContainerItem { } /// Swift package product references. - var packageProductDependencyReferences: [PBXObjectReference]? + var packageProductDependencyReferences: [PBXObjectReference] /// Swift packages products. - var packageProductDependencies: [XCSwiftPackageProductDependency]? { + public var packageProductDependencies: [XCSwiftPackageProductDependency] { set { - packageProductDependencyReferences = newValue?.map { $0.reference } + packageProductDependencyReferences = newValue.references() } get { - return packageProductDependencyReferences?.objects() + return packageProductDependencyReferences.objects() } } @@ -105,6 +105,7 @@ public class PBXTarget: PBXContainerItem { buildPhases: [PBXBuildPhase] = [], buildRules: [PBXBuildRule] = [], dependencies: [PBXTargetDependency] = [], + packageProductDependencies: [XCSwiftPackageProductDependency] = [], productName: String? = nil, product: PBXFileReference? = nil, productType: PBXProductType? = nil) { @@ -112,6 +113,7 @@ public class PBXTarget: PBXContainerItem { buildPhaseReferences = buildPhases.references() buildRuleReferences = buildRules.references() dependencyReferences = dependencies.references() + self.packageProductDependencyReferences = packageProductDependencies.references() self.name = name self.productName = productName productReference = product?.reference @@ -157,8 +159,8 @@ public class PBXTarget: PBXContainerItem { productReference = nil } - let packageProductDependencyReferenceStrings: [String]? = try container.decodeIfPresent(.packageProductDependencies) - packageProductDependencyReferences = packageProductDependencyReferenceStrings?.map { objectReferenceRepository.getOrCreate(reference: $0, objects: objects) } + let packageProductDependencyReferenceStrings: [String] = try container.decodeIfPresent(.packageProductDependencies) ?? [] + packageProductDependencyReferences = packageProductDependencyReferenceStrings.map { objectReferenceRepository.getOrCreate(reference: $0, objects: objects) } productType = try container.decodeIfPresent(.productType) try super.init(from: decoder) @@ -195,7 +197,7 @@ public class PBXTarget: PBXContainerItem { let fileElement: PBXFileElement? = productReference.getObject() dictionary["productReference"] = .string(CommentedString(productReference.value, comment: fileElement?.fileName())) } - if let packageProductDependencies = packageProductDependencies { + if !packageProductDependencies.isEmpty { dictionary["packageProductDependencies"] = .array(packageProductDependencies.map { PlistValue.string(.init($0.reference.value, comment: $0.productName)) }) diff --git a/Sources/xcodeproj/Utils/ReferenceGenerator.swift b/Sources/xcodeproj/Utils/ReferenceGenerator.swift index 2cbae7219..b6c61cc3f 100644 --- a/Sources/xcodeproj/Utils/ReferenceGenerator.swift +++ b/Sources/xcodeproj/Utils/ReferenceGenerator.swift @@ -77,7 +77,7 @@ final class ReferenceGenerator: ReferenceGenerating { fixReference(for: project, identifiers: identifiers) // Packages - project.packages?.forEach { + project.packages.forEach { var identifiers = identifiers identifiers.append($0.repositoryURL ?? $0.name ?? "") fixReference(for: $0, identifiers: identifiers) @@ -91,7 +91,7 @@ final class ReferenceGenerator: ReferenceGenerating { identifiers.append(target.name) // Packages - target.packageProductDependencies?.forEach { + target.packageProductDependencies.forEach { var identifiers = identifiers identifiers.append($0.productName) fixReference(for: $0, identifiers: identifiers)