Skip to content

Commit 9305cd7

Browse files
authored
Reinstate 5.3 behavior of target-based dependency resolution (#3162)
This brings back the 5.3 implementation of `dependenciesRequired(for:)` (slightly modified) and also makes it so that `targetsRequired(for:)` for non-root packages only includes targets required by any products. Together this brings the behaviour of dependency resolution to the state of #2424.
1 parent f563425 commit 9305cd7

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

Sources/PackageGraph/DependencyResolutionNode.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ public enum DependencyResolutionNode {
7878

7979
/// Assembles the product filter to use on the manifest for this node to determine its dependencies.
8080
public var productFilter: ProductFilter {
81-
#if ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION
8281
switch self {
8382
case .empty:
8483
return .specific([])
@@ -87,9 +86,6 @@ public enum DependencyResolutionNode {
8786
case .root:
8887
return .everything
8988
}
90-
#else
91-
return .everything
92-
#endif
9389
}
9490

9591
/// Returns the dependency that a product has on its own package, if relevant.

Sources/PackageModel/Manifest.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,13 @@ public final class Manifest: ObjectIdentifierProtocol {
148148
return targets
149149
}
150150
#else
151-
return self.targets
151+
return packageKind == .root ? self.targets : targetsRequired(for: products)
152152
#endif
153153
}
154154

155155
/// Returns the package dependencies required for a particular products filter.
156156
public func dependenciesRequired(for productFilter: ProductFilter) -> [PackageDependencyDescription] {
157+
#if ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION
157158
// If we have already calcualted it, returned the cached value.
158159
if let dependencies = _requiredDependencies[productFilter] {
159160
return dependencies
@@ -163,6 +164,23 @@ public final class Manifest: ObjectIdentifierProtocol {
163164
_requiredDependencies[productFilter] = dependencies
164165
return dependencies
165166
}
167+
#else
168+
guard toolsVersion >= .v5_2 && productFilter != .everything else {
169+
return dependencies
170+
}
171+
172+
var requiredDependencies: Set<PackageDependencyDescription> = []
173+
174+
for target in targetsRequired(for: products) {
175+
for targetDependency in target.dependencies {
176+
if let dependency = packageDependency(referencedBy: targetDependency) {
177+
requiredDependencies.insert(dependency)
178+
}
179+
}
180+
}
181+
182+
return Array(requiredDependencies)
183+
#endif
166184
}
167185

168186
/// Returns the targets required for building the provided products.
@@ -190,7 +208,7 @@ public final class Manifest: ObjectIdentifierProtocol {
190208
/// Returns the package dependencies required for building the provided targets.
191209
///
192210
/// The returned dependencies have their particular product filters registered. (To determine product filters without removing any dependencies from the list, specify `keepUnused: true`.)
193-
public func dependenciesRequired(
211+
private func dependenciesRequired(
194212
for targets: [TargetDescription],
195213
keepUnused: Bool = false
196214
) -> [PackageDependencyDescription] {

Sources/PackageModel/Manifest/PackageDependencyDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import TSCBasic
1212

1313
/// Represents a package dependency.
14-
public struct PackageDependencyDescription: Equatable, Codable {
14+
public struct PackageDependencyDescription: Equatable, Codable, Hashable {
1515

1616
/// The dependency requirement.
1717
public enum Requirement: Equatable, Hashable {

0 commit comments

Comments
 (0)