Skip to content

Commit 2c41c56

Browse files
authored
Actually skip not needed dependencies during dependency resolution (#3166) (#3185)
Actually skip not needed dependencies during dependency resolution This is a follow-up to #3162. While that brought back the code for `dependenciesRequired(for:)`, the guard based on `productFilter` actually made it so that it was practically never executed. Instead, the guard should be based on whether the package in question is a root package. Additionally, this made the order of the returned dependencies unstable, due to use of `Set`. Since `dependenciesRequired(for: keepUnused:)` is now only used if `ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION` is set, I removed some dead code from there as well. (cherry picked from commit da4d643)
1 parent cacba6f commit 2c41c56

File tree

2 files changed

+19
-21
lines changed

2 files changed

+19
-21
lines changed

Sources/PackageModel/Manifest.swift

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -165,21 +165,21 @@ public final class Manifest: ObjectIdentifierProtocol {
165165
return dependencies
166166
}
167167
#else
168-
guard toolsVersion >= .v5_2 && productFilter != .everything else {
168+
guard toolsVersion >= .v5_2 && packageKind != .root else {
169169
return dependencies
170170
}
171-
172-
var requiredDependencies: Set<PackageDependencyDescription> = []
173-
171+
172+
var requiredDependencyURLs: Set<String> = []
173+
174174
for target in targetsRequired(for: products) {
175175
for targetDependency in target.dependencies {
176176
if let dependency = packageDependency(referencedBy: targetDependency) {
177-
requiredDependencies.insert(dependency)
177+
requiredDependencyURLs.insert(dependency.url)
178178
}
179179
}
180180
}
181-
182-
return Array(requiredDependencies)
181+
182+
return dependencies.filter { requiredDependencyURLs.contains($0.url) }
183183
#endif
184184
}
185185

@@ -233,7 +233,6 @@ public final class Manifest: ObjectIdentifierProtocol {
233233
}
234234

235235
return dependencies.compactMap { dependency in
236-
#if ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION
237236
if let filter = associations[dependency.name] {
238237
return dependency.filtered(by: filter)
239238
} else if keepUnused {
@@ -243,9 +242,6 @@ public final class Manifest: ObjectIdentifierProtocol {
243242
// Dependencies known to not have any relevant products are discarded.
244243
return nil
245244
}
246-
#else
247-
return dependency.filtered(by: .everything)
248-
#endif
249245
}
250246
}
251247

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4067,14 +4067,17 @@ final class WorkspaceTests: XCTestCase {
40674067
}
40684068

40694069
func testTargetBasedDependency() throws {
4070+
let sandbox = AbsolutePath("/tmp/ws/")
4071+
let fs = InMemoryFileSystem()
4072+
4073+
let barProducts: [MockProduct]
40704074
#if ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION
4075+
barProducts = [MockProduct(name: "Bar", targets: ["Bar"]), MockProduct(name: "BarUnused", targets: ["BarUnused"])]
40714076
#else
4072-
try XCTSkipIf(true)
4077+
// Whether a product is being used does not affect dependency resolution in this case, so we omit the unused product.
4078+
barProducts = [MockProduct(name: "Bar", targets: ["Bar"])]
40734079
#endif
40744080

4075-
let sandbox = AbsolutePath("/tmp/ws/")
4076-
let fs = InMemoryFileSystem()
4077-
40784081
let workspace = try MockWorkspace(
40794082
sandbox: sandbox,
40804083
fs: fs,
@@ -4119,10 +4122,7 @@ final class WorkspaceTests: XCTestCase {
41194122
MockTarget(name: "BarUnused", dependencies: ["Biz"]),
41204123
MockTarget(name: "BarTests", dependencies: ["TestHelper2"], type: .test),
41214124
],
4122-
products: [
4123-
MockProduct(name: "Bar", targets: ["Bar"]),
4124-
MockProduct(name: "BarUnused", targets: ["BarUnused"]),
4125-
],
4125+
products: barProducts,
41264126
dependencies: [
41274127
MockDependency(name: "TestHelper2", requirement: .upToNextMajor(from: "1.0.0")),
41284128
MockDependency(name: "Biz", requirement: .upToNextMajor(from: "1.0.0")),
@@ -5068,7 +5068,8 @@ final class WorkspaceTests: XCTestCase {
50685068
dependencies: [
50695069
MockDependency(name: nil, path: "bar", requirement: .upToNextMajor(from: "1.0.0")),
50705070
],
5071-
versions: ["1.0.0"]
5071+
versions: ["1.0.0"],
5072+
toolsVersion: .v5
50725073
),
50735074
MockPackage(
50745075
name: "BarPackage",
@@ -5084,7 +5085,8 @@ final class WorkspaceTests: XCTestCase {
50845085
dependencies: [
50855086
MockDependency(name: nil, path: "other/utility", requirement: .upToNextMajor(from: "1.0.0")),
50865087
],
5087-
versions: ["1.0.0"]
5088+
versions: ["1.0.0"],
5089+
toolsVersion: .v5
50885090
),
50895091
// this package never gets loaded since its identity is the same as "FooPackage"
50905092
MockPackage(

0 commit comments

Comments
 (0)