Skip to content

Commit ee68be3

Browse files
authored
Add packages lock file support for aliased projects with duplicate frameworks (#7105)
1 parent d67b7f8 commit ee68be3

21 files changed

Lines changed: 1144 additions & 3256 deletions

File tree

src/NuGet.Core/NuGet.Commands/GlobalSuppressions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
[assembly: SuppressMessage("Build", "CA2000:Call System.IDisposable.Dispose on object created by 'new LocalPackageArchiveDownloader(' before all references to it are out of scope.", Justification = "The following using statement disposes LocalPackageArchiveDownloader instance", Scope = "member", Target = "~M:NuGet.Commands.OriginalCaseGlobalPackageFolder.CopyPackagesToOriginalCaseAsync(System.Collections.Generic.IEnumerable{NuGet.Commands.RestoreTargetGraph},System.Threading.CancellationToken)~System.Threading.Tasks.Task")]
8080
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'Task OriginalCaseGlobalPackageFolder.CopyPackagesToOriginalCaseAsync(IEnumerable<RestoreTargetGraph> graphs, CancellationToken token)', validate parameter 'graphs' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.OriginalCaseGlobalPackageFolder.CopyPackagesToOriginalCaseAsync(System.Collections.Generic.IEnumerable{NuGet.Commands.RestoreTargetGraph},System.Threading.CancellationToken)~System.Threading.Tasks.Task")]
8181
[assembly: SuppressMessage("Build", "CA1308:In method 'CreateNuGetLockFile', replace the call to 'ToLowerInvariant' with 'ToUpperInvariant'.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile)~NuGet.ProjectModel.PackagesLockFile")]
82-
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'PackagesLockFile PackagesLockFileBuilder.CreateNuGetLockFile(LockFile assetsFile)', validate parameter 'assetsFile' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile)~NuGet.ProjectModel.PackagesLockFile")]
8382
[assembly: SuppressMessage("Build", "CA1822:Member CreateNuGetLockFile does not access instance data and can be marked as static (Shared in VisualBasic)", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile)~NuGet.ProjectModel.PackagesLockFile")]
8483
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'string PackageSourceProviderExtensions.ResolveAndValidateSource(IPackageSourceProvider sourceProvider, string source)', validate parameter 'sourceProvider' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackageSourceProviderExtensions.ResolveAndValidateSource(NuGet.Configuration.IPackageSourceProvider,System.String)~System.String")]
8584
[assembly: SuppressMessage("Build", "CA1062:In externally visible method 'PackageSpecificWarningProperties PackageSpecificWarningProperties.CreatePackageSpecificWarningProperties(PackageSpec packageSpec)', validate parameter 'packageSpec' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument.", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackageSpecificWarningProperties.CreatePackageSpecificWarningProperties(NuGet.ProjectModel.PackageSpec)~NuGet.Commands.PackageSpecificWarningProperties")]
@@ -177,7 +176,6 @@
177176
[assembly: SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.VulnerabilityInformationProvider.GetVulnerabilityInfoAsync(System.Threading.CancellationToken)~System.Threading.Tasks.Task{NuGet.Protocol.Model.GetVulnerabilityInfoResult}")]
178177
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.ListCommandRunner.PrintPackages(NuGet.Commands.ListArgs,NuGet.Common.IEnumeratorAsync{NuGet.Protocol.Core.Types.IPackageSearchMetadata})~System.Threading.Tasks.Task")]
179178
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.LockFileBuilder.EnsureUniqueLockFileLibraries(NuGet.ProjectModel.LockFile)~System.Collections.Generic.Dictionary{System.ValueTuple{System.String,NuGet.Versioning.NuGetVersion},NuGet.ProjectModel.LockFileLibrary}")]
180-
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.PackagesLockFileBuilder.GetPackagesLockFileVersion(NuGet.ProjectModel.LockFile)~System.Int32")]
181179
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.RestoreCommand.ConcatAsString``1(System.Collections.Generic.IEnumerable{``0})~System.String")]
182180
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.TrustedSignersCommandRunner.ValidateAndParseFingerprintAlgorithm(System.String)~NuGet.Common.HashAlgorithmName")]
183181
[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>", Scope = "member", Target = "~M:NuGet.Commands.TrustedSignersCommandRunner.ValidateAndParseV3ServiceIndexUrl(System.String)~System.Uri")]

src/NuGet.Core/NuGet.Commands/PackagesLockFileBuilder.cs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4-
#nullable disable
5-
64
using System;
75
using System.Collections.Generic;
86
using System.IO;
@@ -19,6 +17,7 @@ public class PackagesLockFileBuilder
1917
{
2018
public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile)
2119
{
20+
if (assetsFile == null) throw new ArgumentNullException(nameof(assetsFile));
2221
var lockFile = new PackagesLockFile(GetPackagesLockFileVersion(assetsFile));
2322

2423
var libraryLookup = assetsFile.Libraries.Where(e => e.Type == LibraryType.Package)
@@ -29,18 +28,17 @@ public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile)
2928
var nuGettarget = new PackagesLockFileTarget()
3029
{
3130
TargetFramework = target.TargetFramework,
32-
RuntimeIdentifier = target.RuntimeIdentifier
31+
RuntimeIdentifier = target.RuntimeIdentifier,
32+
TargetAlias = lockFile.Version >= 3 ? target.TargetAlias : null
3333
};
3434

35-
var framework = assetsFile.PackageSpec.TargetFrameworks.FirstOrDefault(
36-
f => EqualityUtility.EqualsWithNullCheck(f.FrameworkName, target.TargetFramework));
37-
35+
TargetFrameworkInformation? framework = assetsFile.PackageSpec.GetTargetFramework(target.TargetAlias);
3836
IEnumerable<LockFileTargetLibrary> libraries = target.Libraries;
3937

4038
// check if this is RID-based graph then only add those libraries which differ from original TFM.
4139
if (!string.IsNullOrEmpty(target.RuntimeIdentifier))
4240
{
43-
var onlyTFM = assetsFile.Targets.First(t => EqualityUtility.EqualsWithNullCheck(t.TargetFramework, target.TargetFramework));
41+
LockFileTarget onlyTFM = assetsFile.Targets.First(t => EqualityUtility.EqualsWithNullCheck(t.TargetAlias, target.TargetAlias));
4442

4543
libraries = target.Libraries.Where(lib => !onlyTFM.Libraries.Any(tfmLib => tfmLib.Equals(lib)));
4644
}
@@ -60,7 +58,7 @@ public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile)
6058
var framework_dep = framework?.Dependencies.FirstOrDefault(
6159
dep => StringComparer.OrdinalIgnoreCase.Equals(dep.Name, library.Name));
6260

63-
CentralPackageVersion centralPackageVersion = null;
61+
CentralPackageVersion? centralPackageVersion = null;
6462
framework?.CentralPackageVersions.TryGetValue(library.Name, out centralPackageVersion);
6563

6664
if (framework_dep != null)
@@ -118,15 +116,20 @@ public PackagesLockFile CreateNuGetLockFile(LockFile assetsFile)
118116
return lockFile;
119117
}
120118

121-
private int GetPackagesLockFileVersion(LockFile assetsFile)
119+
private static int GetPackagesLockFileVersion(LockFile assetsFile)
122120
{
121+
if (RestoreCommand.HasDuplicateFrameworks(assetsFile.PackageSpec))
122+
{
123+
return 3; // Version 3 for alias support
124+
}
125+
123126
// Increase the version only for the projects opted-in central version management
124127
if (assetsFile.PackageSpec.RestoreMetadata.CentralPackageVersionsEnabled)
125128
{
126-
return PackagesLockFileFormat.PackagesLockFileVersion;
129+
return 2;
127130
}
128131

129-
return PackagesLockFileFormat.Version;
132+
return 1;
130133
}
131134
}
132135
}

src/NuGet.Core/NuGet.Commands/PublicAPI/net472/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ NuGet.Commands.PackageSpecificWarningProperties
419419
NuGet.Commands.PackageSpecificWarningProperties.PackageSpecificWarningProperties() -> void
420420
~NuGet.Commands.PackageSpecificWarningProperties.Properties.get -> System.Collections.Generic.IDictionary<NuGet.Common.NuGetLogCode, System.Collections.Generic.IDictionary<string, System.Collections.Generic.ISet<NuGet.Frameworks.NuGetFramework>>>
421421
NuGet.Commands.PackagesLockFileBuilder
422-
~NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile assetsFile) -> NuGet.ProjectModel.PackagesLockFile
422+
NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile! assetsFile) -> NuGet.ProjectModel.PackagesLockFile!
423423
NuGet.Commands.PackagesLockFileBuilder.PackagesLockFileBuilder() -> void
424424
NuGet.Commands.PushRunner
425425
NuGet.Commands.RemoveClientCertArgs

src/NuGet.Core/NuGet.Commands/PublicAPI/net8.0/PublicAPI.Shipped.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ NuGet.Commands.PackageSpecificWarningProperties
419419
NuGet.Commands.PackageSpecificWarningProperties.PackageSpecificWarningProperties() -> void
420420
~NuGet.Commands.PackageSpecificWarningProperties.Properties.get -> System.Collections.Generic.IDictionary<NuGet.Common.NuGetLogCode, System.Collections.Generic.IDictionary<string, System.Collections.Generic.ISet<NuGet.Frameworks.NuGetFramework>>>
421421
NuGet.Commands.PackagesLockFileBuilder
422-
~NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile assetsFile) -> NuGet.ProjectModel.PackagesLockFile
422+
NuGet.Commands.PackagesLockFileBuilder.CreateNuGetLockFile(NuGet.ProjectModel.LockFile! assetsFile) -> NuGet.ProjectModel.PackagesLockFile!
423423
NuGet.Commands.PackagesLockFileBuilder.PackagesLockFileBuilder() -> void
424424
NuGet.Commands.PushRunner
425425
NuGet.Commands.RemoveClientCertArgs

0 commit comments

Comments
 (0)