Skip to content

Commit 5af3bf3

Browse files
kinnarryonaskolb
andauthored
Add support for local Swift packages in Xcode 15 (#1465)
* Add support for local Swift packages in Xcode 15 Solves #1396 * Updated CHANGELOG.md * add test for local package creation --------- Co-authored-by: Yonas Kolb <yonaskolb@users.noreply.github.com>
1 parent 02f9ea4 commit 5af3bf3

6 files changed

Lines changed: 30 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
### Added
88

9+
- Better support for local Swift packages in Xcode 15 #1465 @kinnarr
910
- Added `macroExpansion` to test actions in schemes #1468 @erneestoc
1011

1112
### Changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let package = Package(
1616
.package(url: "https://github.com/yonaskolb/JSONUtilities.git", from: "4.2.0"),
1717
.package(url: "https://github.com/kylef/Spectre.git", from: "0.9.2"),
1818
.package(url: "https://github.com/onevcat/Rainbow.git", from: "4.0.0"),
19-
.package(url: "https://github.com/tuist/XcodeProj.git", exact: "8.13.0"),
19+
.package(url: "https://github.com/tuist/XcodeProj.git", exact: "8.16.0"),
2020
.package(url: "https://github.com/jakeheis/SwiftCLI.git", from: "6.0.3"),
2121
.package(url: "https://github.com/mxcl/Version", from: "2.0.0"),
2222
.package(url: "https://github.com/freddi-kit/ArtifactBundleGen", exact: "0.0.6")

Sources/XcodeGenKit/PBXProjGenerator.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class PBXProjGenerator {
2222
var targetFileReferences: [String: PBXFileReference] = [:]
2323
var sdkFileReferences: [String: PBXFileReference] = [:]
2424
var packageReferences: [String: XCRemoteSwiftPackageReference] = [:]
25+
var localPackageReferences: [String: XCLocalSwiftPackageReference] = [:]
2526

2627
var carthageFrameworksByPlatform: [String: Set<PBXFileElement>] = [:]
2728
var frameworkFiles: [PBXFileElement] = []
@@ -30,7 +31,6 @@ public class PBXProjGenerator {
3031
var generated = false
3132

3233
private var projects: [ProjectReference: PBXProj] = [:]
33-
lazy private var localPackageReferences: [String] = project.packages.compactMap { $0.value.isLocal ? $0.key : nil }
3434

3535
public init(project: Project, projectDirectory: Path? = nil) {
3636
self.project = project
@@ -170,6 +170,10 @@ public class PBXProjGenerator {
170170
packageReferences[name] = packageReference
171171
addObject(packageReference)
172172
case let .local(path, group):
173+
let packageReference = XCLocalSwiftPackageReference(relativePath: path)
174+
localPackageReferences[name] = packageReference
175+
addObject(packageReference)
176+
173177
try sourceGenerator.createLocalPackage(path: Path(path), group: group.map { Path($0) })
174178
}
175179
}
@@ -310,7 +314,8 @@ public class PBXProjGenerator {
310314
}
311315
pbxProject.knownRegions = knownRegions.sorted()
312316

313-
pbxProject.packages = packageReferences.sorted { $0.key < $1.key }.map { $1 }
317+
pbxProject.remotePackages = packageReferences.sorted { $0.key < $1.key }.map { $1 }
318+
pbxProject.localPackages = localPackageReferences.sorted { $0.key < $1.key }.map { $1 }
314319

315320
let allTargets: [PBXTarget] = targetObjects.valueArray + targetAggregateObjects.valueArray
316321
pbxProject.targets = allTargets
@@ -945,7 +950,7 @@ public class PBXProjGenerator {
945950

946951
// If package's reference is none and there is no specified package in localPackages,
947952
// then ignore the package specified as dependency.
948-
if packageReference == nil, !localPackageReferences.contains(dependency.reference) {
953+
if packageReference == nil, localPackageReferences[dependency.reference] == nil {
949954
continue
950955
}
951956

@@ -1469,7 +1474,7 @@ public class PBXProjGenerator {
14691474
func makePackagePluginDependency(for target: ProjectTarget) -> [PBXTargetDependency] {
14701475
target.buildToolPlugins.compactMap { buildToolPlugin in
14711476
let packageReference = packageReferences[buildToolPlugin.package]
1472-
if packageReference == nil, !localPackageReferences.contains(buildToolPlugin.package) {
1477+
if packageReference == nil, localPackageReferences[buildToolPlugin.package] == nil {
14731478
return nil
14741479
}
14751480

Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@
251251
5BA91390AE78D2EE15C60091 /* XCRemoteSwiftPackageReference "Codability" */,
252252
348C81C327DB1710B742C370 /* XCRemoteSwiftPackageReference "Prefire" */,
253253
E3887F3CB2C069E70D98092F /* XCRemoteSwiftPackageReference "SwiftRoaring" */,
254+
630A8CE9F2BE39704ED9D461 /* XCLocalSwiftPackageReference "FooFeature" */,
255+
C6539B364583AE96C18CE377 /* XCLocalSwiftPackageReference "../../.." */,
254256
);
255257
projectDirPath = "";
256258
projectRoot = "";
@@ -662,6 +664,17 @@
662664
};
663665
/* End XCRemoteSwiftPackageReference section */
664666

667+
/* Begin XCLocalSwiftPackageReference section */
668+
630A8CE9F2BE39704ED9D461 /* XCLocalSwiftPackageReference "FooFeature" */ = {
669+
isa = XCLocalSwiftPackageReference;
670+
relativePath = FooFeature;
671+
};
672+
C6539B364583AE96C18CE377 /* XCLocalSwiftPackageReference "../../.." */ = {
673+
isa = XCLocalSwiftPackageReference;
674+
relativePath = ../../..;
675+
};
676+
/* End XCLocalSwiftPackageReference section */
677+
665678
/* Begin XCSwiftPackageProductDependency section */
666679
15DB49096E2978F6BCA8D604 /* FooUI */ = {
667680
isa = XCSwiftPackageProductDependency;

Tests/XcodeGenKitTests/ProjectGeneratorTests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,6 +1586,10 @@ class ProjectGeneratorTests: XCTestCase {
15861586
let nativeTarget = try unwrap(pbxProject.nativeTargets.first(where: { $0.name == app.name }))
15871587
let localPackageFile = try unwrap(pbxProject.fileReferences.first(where: { $0.path == "../XcodeGen" }))
15881588
try expect(localPackageFile.lastKnownFileType) == "folder"
1589+
1590+
let localPackageReference = try unwrap(pbxProject.rootObject?.localPackages.first)
1591+
try expect(pbxProject.rootObject?.localPackages.count) == 1
1592+
try expect(localPackageReference.relativePath) == "../XcodeGen"
15891593

15901594
let frameworkPhases = nativeTarget.buildPhases.compactMap { $0 as? PBXFrameworksBuildPhase }
15911595

0 commit comments

Comments
 (0)