Skip to content

Commit 9373d6b

Browse files
authored
Add package and update package treat --framework as aliases correctly for aliased projects (#7130)
1 parent c209a43 commit 9373d6b

6 files changed

Lines changed: 402 additions & 34 deletions

File tree

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/Update/PackageUpdateIO.cs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
using NuGet.Commands;
1515
using NuGet.Common;
1616
using NuGet.Configuration;
17-
using NuGet.Frameworks;
1817
using NuGet.Packaging.Core;
1918
using NuGet.ProjectModel;
2019
using NuGet.Protocol;
@@ -169,18 +168,11 @@ public void UpdatePackageReference(PackageSpec updatedPackageSpec, IPackageUpdat
169168
{
170169
PackageDependency packageDependency = new PackageDependency(packageToUpdate.Id, packageToUpdate.NewVersion);
171170

172-
List<NuGetFramework> packageTfms = new List<NuGetFramework>(packageTfmAliases.Count);
173-
foreach (var alias in packageTfmAliases)
174-
{
175-
var targetFramework = updatedPackageSpec.TargetFrameworks.Single(tfm => tfm.TargetAlias == alias);
176-
packageTfms.Add(targetFramework.FrameworkName);
177-
}
178-
179171
var restoreResult = (RestoreResult)restorePreviewResult;
180172
var restoreResultPair = restoreResult.RestoreResultPairs.Single(pair =>
181173
string.Equals(pair.SummaryRequest.Request.Project.FilePath, updatedPackageSpec.FilePath, StringComparison.OrdinalIgnoreCase));
182174

183-
if (!AddPackageReferenceCommandRunner.TryFindResolvedVersion(packageTfms,
175+
if (!AddPackageReferenceCommandRunner.TryFindResolvedVersion(packageTfmAliases,
184176
packageDependency.Id,
185177
restoreResultPair.Result,
186178
logger,
@@ -200,18 +192,14 @@ public void UpdatePackageReference(PackageSpec updatedPackageSpec, IPackageUpdat
200192
const bool noVersion = false;
201193

202194
// Determine whether to add package reference conditionally or unconditionally
203-
if (packageTfms.Count == updatedPackageSpec.TargetFrameworks.Count)
195+
if (packageTfmAliases.Count == updatedPackageSpec.TargetFrameworks.Count)
204196
{
205197
// package is used by all project TFMs (no condition)
206198
_msbuildUtility.AddPackageReference(updatedPackageSpec.FilePath, libraryDependency, noVersion);
207199
}
208200
else
209201
{
210-
var frameworkAliases = packageTfms
211-
.Select(e => AddPackageReferenceCommandRunner.GetAliasForFramework(updatedPackageSpec, e))
212-
.Where(originalFramework => originalFramework != null);
213-
214-
_msbuildUtility.AddPackageReferencePerTFM(updatedPackageSpec.FilePath, libraryDependency, frameworkAliases, noVersion);
202+
_msbuildUtility.AddPackageReferencePerTFM(updatedPackageSpec.FilePath, libraryDependency, packageTfmAliases, noVersion);
215203
}
216204
}
217205

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/PackageReferenceCommands/AddPackageReferenceCommandRunner.cs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,11 @@ public async Task<int> ExecuteCommand(PackageReferenceArgs packageReferenceArgs,
9494
packageReferenceArgs.ProjectPath));
9595
}
9696

97-
// Parse the user specified frameworks once to avoid re-do's
98-
var userSpecifiedFrameworks = new List<NuGetFramework>();
97+
// Keep the user specified frameworks as aliases to match against TargetAlias
98+
var userSpecifiedFrameworks = new List<string>();
9999
if (packageReferenceArgs.Frameworks?.Any() == true)
100100
{
101-
userSpecifiedFrameworks.AddRange(packageReferenceArgs
102-
.Frameworks
103-
.Select(NuGetFramework.Parse));
101+
userSpecifiedFrameworks.AddRange(packageReferenceArgs.Frameworks);
104102
}
105103

106104
var originalPackageSpec = matchingPackageSpecs.FirstOrDefault();
@@ -198,19 +196,19 @@ public async Task<int> ExecuteCommand(PackageReferenceArgs packageReferenceArgs,
198196
packageReferenceArgs.Logger.LogDebug("Restore Review completed");
199197

200198
// 4. Process Restore Result
201-
var compatibleFrameworks = new HashSet<NuGetFramework>(
199+
var compatibleFrameworks = new HashSet<string>(
202200
restorePreviewResult
203201
.Result
204202
.CompatibilityCheckResults
205203
.Where(t => t.Success)
206-
.Select(t => t.Graph.Framework), NuGetFrameworkFullComparer.Instance);
204+
.Select(t => t.Graph.TargetAlias), StringComparer.OrdinalIgnoreCase);
207205

208206
if (packageReferenceArgs.Frameworks?.Any() == true)
209207
{
210208
// If the user has specified frameworks then we intersect that with the compatible frameworks.
211-
var userSpecifiedFrameworkSet = new HashSet<NuGetFramework>(
209+
var userSpecifiedFrameworkSet = new HashSet<string>(
212210
userSpecifiedFrameworks,
213-
NuGetFrameworkFullComparer.Instance);
211+
StringComparer.OrdinalIgnoreCase);
214212

215213
compatibleFrameworks.IntersectWith(userSpecifiedFrameworkSet);
216214
}
@@ -260,16 +258,13 @@ public async Task<int> ExecuteCommand(PackageReferenceArgs packageReferenceArgs,
260258
packageReferenceArgs.PackageId,
261259
packageReferenceArgs.ProjectPath));
262260

263-
var compatibleOriginalFrameworks = compatibleFrameworks
264-
.Select(e => GetAliasForFramework(originalPackageSpec, e))
265-
.Where(originalFramework => originalFramework != null);
266-
267261
// generate a library dependency with all the metadata like Include, Exlude and SuppressParent
268262
var libraryDependency = GenerateLibraryDependency(updatedPackageSpec, packageReferenceArgs.PackageDirectory, packageDependency, resolvedVersion);
269263

264+
// compatibleFrameworks already contains aliases from TargetAlias
270265
msBuild.AddPackageReferencePerTFM(packageReferenceArgs.ProjectPath,
271266
libraryDependency,
272-
compatibleOriginalFrameworks,
267+
compatibleFrameworks,
273268
packageReferenceArgs.NoVersion);
274269
}
275270

@@ -279,7 +274,7 @@ public async Task<int> ExecuteCommand(PackageReferenceArgs packageReferenceArgs,
279274
return 0;
280275
}
281276

282-
internal static bool TryFindResolvedVersion(List<NuGetFramework> userSpecifiedFrameworks, string packageId, RestoreResult restoreResult, ILogger logger, out NuGetVersion resolvedVersion)
277+
internal static bool TryFindResolvedVersion(List<string> userSpecifiedFrameworks, string packageId, RestoreResult restoreResult, ILogger logger, out NuGetVersion resolvedVersion)
283278
{
284279
// get the package resolved version from restore preview result
285280
(LibraryType libraryType, resolvedVersion) = GetPackageVersionFromRestoreResult(restoreResult, packageId, userSpecifiedFrameworks);
@@ -454,7 +449,7 @@ private static DependencyGraphSpec ReadProjectDependencyGraph(PackageReferenceAr
454449

455450
private static (LibraryType, NuGetVersion) GetPackageVersionFromRestoreResult(RestoreResult restoreResult,
456451
string packageId,
457-
List<NuGetFramework> userSpecifiedFrameworks)
452+
List<string> userSpecifiedFrameworks)
458453
{
459454
// Get the restore graphs from the restore result
460455
var restoreGraphs = restoreResult
@@ -463,12 +458,12 @@ private static (LibraryType, NuGetVersion) GetPackageVersionFromRestoreResult(Re
463458
if (userSpecifiedFrameworks.Count > 1)
464459
{
465460
// If the user specified frameworks then we get the flattened graphs only from the compatible frameworks.
466-
var userSpecifiedFrameworkSet = new HashSet<NuGetFramework>(
461+
var userSpecifiedFrameworkSet = new HashSet<string>(
467462
userSpecifiedFrameworks,
468-
NuGetFrameworkFullComparer.Instance);
463+
StringComparer.OrdinalIgnoreCase);
469464

470465
restoreGraphs = restoreGraphs
471-
.Where(r => userSpecifiedFrameworkSet.Contains(r.Framework));
466+
.Where(r => userSpecifiedFrameworkSet.Contains(r.TargetAlias));
472467
}
473468

474469
foreach (var restoreGraph in restoreGraphs)

0 commit comments

Comments
 (0)