Skip to content

Commit b8bbe4b

Browse files
authored
List package uses aliases as pivot when printing packages; Fix list package not supporting aliased frameworks (#7146)
1 parent 60d1ab4 commit b8bbe4b

30 files changed

Lines changed: 514 additions & 136 deletions

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/PackageReferenceCommands/ListPackage/FrameworkPackages.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace NuGet.CommandLine.XPlat
1515
internal class FrameworkPackages
1616
{
1717
public string Framework { get; }
18+
public string TargetAlias { get; }
1819
public IEnumerable<InstalledPackageReference> TopLevelPackages { get; set; }
1920
public IEnumerable<InstalledPackageReference> TransitivePackages { get; set; }
2021

@@ -24,7 +25,8 @@ internal class FrameworkPackages
2425
/// lists
2526
/// </summary>
2627
/// <param name="framework">Framework name</param>
27-
public FrameworkPackages(string framework) : this(framework, new List<InstalledPackageReference>(), new List<InstalledPackageReference>())
28+
/// <param name="targetAlias">Target alias</param>
29+
public FrameworkPackages(string framework, string targetAlias) : this(framework, targetAlias, new List<InstalledPackageReference>(), new List<InstalledPackageReference>())
2830
{
2931

3032
}
@@ -35,13 +37,16 @@ internal class FrameworkPackages
3537
/// packages
3638
/// </summary>
3739
/// <param name="framework">Framework name that we have packages for</param>
40+
/// <param name="targetAlias">Target alias</param>
3841
/// <param name="topLevelPackages">Top-level packages. Shouldn't be null</param>
3942
/// <param name="transitivePackages">Transitive packages. Shouldn't be null</param>
4043
public FrameworkPackages(string framework,
44+
string targetAlias,
4145
IEnumerable<InstalledPackageReference> topLevelPackages,
4246
IEnumerable<InstalledPackageReference> transitivePackages)
4347
{
4448
Framework = framework ?? throw new ArgumentNullException(nameof(framework));
49+
TargetAlias = targetAlias ?? throw new ArgumentNullException(nameof(targetAlias));
4550
TopLevelPackages = topLevelPackages ?? throw new ArgumentNullException(nameof(topLevelPackages));
4651
TransitivePackages = transitivePackages ?? throw new ArgumentNullException(nameof(transitivePackages));
4752
}

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/PackageReferenceCommands/ListPackage/ListPackageCommand.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using NuGet.Common;
1616
using NuGet.Configuration;
1717
using NuGet.Credentials;
18-
using NuGet.Frameworks;
1918

2019
namespace NuGet.CommandLine.XPlat
2120
{
@@ -123,8 +122,6 @@ public static void Register(
123122

124123
var packageSources = GetPackageSources(settings, sources, config);
125124

126-
VerifyValidFrameworks(framework);
127-
128125
var reportType = GetReportType(
129126
isOutdated: outdatedReport.HasValue(),
130127
isDeprecated: deprecatedReport.HasValue(),
@@ -218,16 +215,6 @@ private static void WarnAboutIncompatibleOptions(ListPackageArgs packageRefArgs,
218215
}
219216
}
220217

221-
private static void VerifyValidFrameworks(CommandOption framework)
222-
{
223-
var frameworks = framework.Values.Select(f =>
224-
NuGetFramework.Parse(f.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()[0]));
225-
if (frameworks.Any(f => f.Framework.Equals("Unsupported", StringComparison.OrdinalIgnoreCase)))
226-
{
227-
throw new ArgumentException(Strings.ListPkg_InvalidFramework, nameof(framework));
228-
}
229-
}
230-
231218
private static ISettings ProcessConfigFile(string configFile, string projectOrSolution)
232219
{
233220
if (string.IsNullOrEmpty(configFile))

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/PackageReferenceCommands/ListPackage/ListPackageCommandRunner.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,16 @@ private async Task GetProjectMetadataAsync(
113113
return;
114114
}
115115

116+
foreach (string frameworkAlias in listPackageArgs.Frameworks)
117+
{
118+
if (assetsFile.PackageSpec?.GetTargetFramework(frameworkAlias) == null)
119+
{
120+
projectModel.AddProjectInformation(problemType: ProblemType.Error,
121+
string.Format(CultureInfo.CurrentCulture, Strings.ListPkg_InvalidFramework, frameworkAlias, projectPath));
122+
return;
123+
}
124+
}
125+
116126
List<FrameworkPackages> frameworks;
117127

118128
try
@@ -186,7 +196,7 @@ private static async Task GetVulnerabilitiesFromAuditSourcesAsync(
186196

187197
foreach (var frameworkPackages in frameworks)
188198
{
189-
var frameworkPackage = new ListPackageReportFrameworkPackage(frameworkPackages.Framework)
199+
var frameworkPackage = new ListPackageReportFrameworkPackage(frameworkPackages.Framework, frameworkPackages.TargetAlias)
190200
{
191201
TransitivePackages = new List<ListReportPackage>(),
192202
TopLevelPackages = new List<ListReportPackage>()

src/NuGet.Core/NuGet.CommandLine.XPlat/ListPackage/ListPackageConsoleRenderer.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,25 +140,26 @@ private static void WriteProjects(TextWriter consoleOut, TextWriter consoleError
140140
List<ListReportPackage> frameworkTopLevelPackages = frameworkPackages.TopLevelPackages;
141141
List<ListReportPackage> frameworkTransitivePackages = frameworkPackages.TransitivePackages;
142142

143-
// If no packages exist for this framework, print the
144-
// appropriate message
143+
string frameworkHeader = frameworkPackages.TargetAlias;
144+
145+
// If no packages exist for this framework, print the appropriate message
145146
if (frameworkTopLevelPackages?.Any() != true && frameworkTransitivePackages?.Any() != true)
146147
{
147148
Console.ForegroundColor = ConsoleColor.Blue;
148149

149150
switch (listPackageArgs.ReportType)
150151
{
151152
case ReportType.Outdated:
152-
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoUpdatesForFramework, frameworkPackages.Framework));
153+
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoUpdatesForFramework, frameworkHeader));
153154
break;
154155
case ReportType.Deprecated:
155-
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoDeprecationsForFramework, frameworkPackages.Framework));
156+
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoDeprecationsForFramework, frameworkHeader));
156157
break;
157158
case ReportType.Vulnerable:
158-
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoVulnerabilitiesForFramework, frameworkPackages.Framework));
159+
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoVulnerabilitiesForFramework, frameworkHeader));
159160
break;
160161
case ReportType.Default:
161-
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoPackagesForFramework, frameworkPackages.Framework));
162+
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: " + Strings.ListPkg_NoPackagesForFramework, frameworkHeader));
162163
break;
163164
}
164165

@@ -168,7 +169,7 @@ private static void WriteProjects(TextWriter consoleOut, TextWriter consoleError
168169
{
169170
// Print name of the framework
170171
Console.ForegroundColor = ConsoleColor.Blue;
171-
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: ", frameworkPackages.Framework));
172+
consoleOut.WriteLine(string.Format(CultureInfo.CurrentCulture, " [{0}]: ", frameworkHeader));
172173
Console.ResetColor();
173174

174175
// Print top-level packages

src/NuGet.Core/NuGet.CommandLine.XPlat/ListPackage/ListPackageJsonRenderer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ internal class ListPackageJsonRenderer : IReportRenderer
5151
protected readonly List<ReportProblem> _problems = new();
5252
protected TextWriter _writer;
5353

54-
private ListPackageJsonRenderer()
55-
{ }
56-
5754
public ListPackageJsonRenderer(TextWriter textWriter = null)
5855
{
5956
_writer = textWriter ?? Console.Out;
@@ -200,7 +197,7 @@ private static void WriteFrameworkPackage(JsonWriter writer, List<ListPackageRep
200197
{
201198
writer.WriteStartObject();
202199
writer.WritePropertyName(FrameworkProperty);
203-
writer.WriteValue(reportFrameworkPackage.Framework);
200+
writer.WriteValue(reportFrameworkPackage.TargetAlias);
204201
WriteTopLevelPackages(writer, TopLevelPackagesProperty, reportFrameworkPackage.TopLevelPackages, listPackageArgs);
205202
WriteTransitivePackages(writer, TransitivePackagesProperty, reportFrameworkPackage.TransitivePackages, listPackageArgs);
206203
writer.WriteEndObject();

src/NuGet.Core/NuGet.CommandLine.XPlat/ListPackage/ListPackageReportFrameworkPackage.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#nullable disable
55

6+
using System;
67
using System.Collections.Generic;
78

89
namespace NuGet.CommandLine.XPlat.ListPackage
@@ -12,12 +13,14 @@ namespace NuGet.CommandLine.XPlat.ListPackage
1213
/// </summary>
1314
internal class ListPackageReportFrameworkPackage
1415
{
15-
internal string Framework { get; set; }
16+
internal string Framework { get; }
17+
internal string TargetAlias { get; }
1618
internal List<ListReportPackage> TopLevelPackages { get; set; }
1719
internal List<ListReportPackage> TransitivePackages { get; set; }
18-
public ListPackageReportFrameworkPackage(string frameWork)
20+
public ListPackageReportFrameworkPackage(string framework, string targetAlias)
1921
{
20-
Framework = frameWork;
22+
Framework = framework ?? throw new ArgumentNullException(nameof(framework));
23+
TargetAlias = targetAlias ?? throw new ArgumentNullException(nameof(targetAlias));
2124
}
2225
}
2326
}

src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.resx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,8 @@ For more information, visit https://docs.nuget.org/docs/reference/command-line-r
401401
<value>Unable to read a package reference from the project `{0}`. Please make sure that your project file and project.assets.json file are in sync by running restore.</value>
402402
</data>
403403
<data name="ListPkg_InvalidFramework" xml:space="preserve">
404-
<value>Failed to parse one of the given frameworks. Please make sure the given frameworks are valid.</value>
404+
<value>The specified TargetFramework '{0}' is not found in the project '{1}'.</value>
405+
<comment>0 - alias, 1 - project path, {Locked="TargetFramework"}</comment>
405406
</data>
406407
<data name="ListPkg_Latest" xml:space="preserve">
407408
<value>Latest</value>

src/NuGet.Core/NuGet.CommandLine.XPlat/Utility/MSBuildAPIUtility.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using Microsoft.Build.Evaluation;
1616
using Microsoft.Build.Execution;
1717
using NuGet.Common;
18-
using NuGet.Frameworks;
1918
using NuGet.LibraryModel;
2019
using NuGet.Packaging.Core;
2120
using NuGet.ProjectModel;
@@ -745,26 +744,29 @@ internal static List<FrameworkPackages> GetResolvedVersions(
745744
if (userInputFrameworks.Any())
746745
{
747746
//Target frameworks filtering
748-
var parsedUserFrameworks = userInputFrameworks.Select(f =>
749-
NuGetFramework.Parse(f.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()[0]));
750-
requestedTargetFrameworks = requestedTargetFrameworks.Where(tfm => parsedUserFrameworks.Contains(tfm.FrameworkName)).ToList();
747+
var userFrameworkInputs = userInputFrameworks.Select(f =>
748+
f.Split(['/'], StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()[0]).ToList();
749+
requestedTargetFrameworks = requestedTargetFrameworks.Where(tfm =>
750+
userFrameworkInputs.Any(f => string.Equals(f, tfm.TargetAlias, StringComparison.OrdinalIgnoreCase))).ToList();
751751

752752
//Assets file targets filtering by framework and RID
753753
var filteredTargets = new List<LockFileTarget>();
754754
foreach (var frameworkAndRID in userInputFrameworks)
755755
{
756-
var splitFrameworkAndRID = frameworkAndRID.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray();
756+
var splitFrameworkAndRID = frameworkAndRID.Split(['/'], StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray();
757757
// If a / is not present in the string, we get all of the targets that
758758
// have matching framework regardless of RID.
759759
if (splitFrameworkAndRID.Length == 1)
760760
{
761-
filteredTargets.AddRange(requestedTargets.Where(target => target.TargetFramework.Equals(NuGetFramework.Parse(splitFrameworkAndRID[0]))));
761+
filteredTargets.AddRange(requestedTargets.Where(target =>
762+
string.Equals(target.TargetAlias, splitFrameworkAndRID[0], StringComparison.OrdinalIgnoreCase)));
762763
}
763764
else
764765
{
765766
//RID is present in the user input, so we filter using it as well
766-
filteredTargets.AddRange(requestedTargets.Where(target => target.TargetFramework.Equals(NuGetFramework.Parse(splitFrameworkAndRID[0])) &&
767-
target.RuntimeIdentifier != null && target.RuntimeIdentifier.Equals(splitFrameworkAndRID[1], StringComparison.OrdinalIgnoreCase)));
767+
filteredTargets.AddRange(requestedTargets.Where(target =>
768+
string.Equals(target.TargetAlias, splitFrameworkAndRID[0], StringComparison.OrdinalIgnoreCase) &&
769+
target.RuntimeIdentifier != null && target.RuntimeIdentifier.Equals(splitFrameworkAndRID[1], StringComparison.OrdinalIgnoreCase)));
768770
}
769771
}
770772
requestedTargets = filteredTargets;
@@ -782,7 +784,7 @@ internal static List<FrameworkPackages> GetResolvedVersions(
782784

783785
try
784786
{
785-
tfmInformation = requestedTargetFrameworks.First(tfm => tfm.FrameworkName.Equals(target.TargetFramework));
787+
tfmInformation = requestedTargetFrameworks.First(tfm => tfm.TargetAlias.Equals(target.TargetAlias));
786788
}
787789
catch (Exception)
788790
{
@@ -791,7 +793,8 @@ internal static List<FrameworkPackages> GetResolvedVersions(
791793

792794
//The packages for the framework that were retrieved with GetRequestedVersions
793795
var frameworkDependencies = tfmInformation.Dependencies;
794-
var projectPackages = GetPackageReferencesFromTargets(projectPath, tfmInformation.ToString());
796+
var targetAlias = tfmInformation.TargetAlias;
797+
var projectPackages = GetPackageReferencesFromTargets(projectPath, targetAlias);
795798
var topLevelPackages = new List<InstalledPackageReference>();
796799
var transitivePackages = new List<InstalledPackageReference>();
797800

@@ -861,6 +864,7 @@ internal static List<FrameworkPackages> GetResolvedVersions(
861864

862865
var frameworkPackages = new FrameworkPackages(
863866
target.TargetFramework.GetShortFolderName(),
867+
targetAlias,
864868
topLevelPackages,
865869
transitivePackages);
866870

src/NuGet.Core/NuGet.CommandLine.XPlat/Utility/ProjectPackagesPrintUtility.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal static List<ListPackageReportFrameworkPackage> GetPackagesMetadata(
3535
foreach (FrameworkPackages frameworkPackages in packages)
3636
{
3737
string frameWork = frameworkPackages.Framework;
38-
ListPackageReportFrameworkPackage targetFrameworkPackageMetadata = new ListPackageReportFrameworkPackage(frameWork);
38+
ListPackageReportFrameworkPackage targetFrameworkPackageMetadata = new ListPackageReportFrameworkPackage(frameWork, frameworkPackages.TargetAlias);
3939
projectFrameworkPackages.Add(targetFrameworkPackageMetadata);
4040
var frameworkTopLevelPackages = frameworkPackages.TopLevelPackages;
4141
var frameworkTransitivePackages = frameworkPackages.TransitivePackages;

0 commit comments

Comments
 (0)