diff --git a/eng/SourceBuildPrebuiltBaseline.xml b/eng/SourceBuildPrebuiltBaseline.xml
deleted file mode 100644
index ace032bcf0b..00000000000
--- a/eng/SourceBuildPrebuiltBaseline.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 2785f6a7a44..c4fdd253047 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -52,10 +52,5 @@
-
- https://github.com/dotnet/arcade
- 986a55a9c7f1ef547bc705d6adada5e0c2217819
-
-
diff --git a/eng/Versions.props b/eng/Versions.props
new file mode 100644
index 00000000000..815a2831e7c
--- /dev/null
+++ b/eng/Versions.props
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/eng/dotnet-build/global.json b/eng/dotnet-build/global.json
index 428dc562c74..87e8485b8c6 100644
--- a/eng/dotnet-build/global.json
+++ b/eng/dotnet-build/global.json
@@ -1,8 +1,8 @@
{
"tools": {
- "dotnet": "10.0.100-alpha.1.24551.9"
+ "dotnet": "10.0.100-preview.3.25201.16"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.24555.1"
+ "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25252.107"
}
}
diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs
index 34c838eace7..39be8c028b7 100644
--- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs
+++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs
@@ -765,62 +765,153 @@ private async Task AreCentralVersionRequirementsSatisfiedAsync(RestoreRequ
return true;
}
- IEnumerable dependenciesWithVersionOverride = restoreRequest.Project.TargetFrameworks.SelectMany(tfm => tfm.Dependencies.Where(d => !d.AutoReferenced && d.VersionOverride != null));
+ bool result = true;
- if (restoreRequest.Project.RestoreMetadata.CentralPackageVersionOverrideDisabled)
+ if (!restoreRequest.PackageSourceMapping.IsEnabled && httpSourcesCount > 1)
+ {
+ // Log a warning if there are more than one configured HTTP source and package source mapping is not enabled
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateWarning(
+ NuGetLogCode.NU1507,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Warning_CentralPackageManagement_MultipleSourcesWithoutPackageSourceMapping,
+ httpSourcesCount,
+ string.Join(", ", restoreRequest.DependencyProviders.RemoteProviders.Where(i => i.IsHttp).Select(i => i.Source.Name)))));
+ }
+
+ List packageVersionItemsWithFloatingVersion = null;
+ List implicitPackageReferenceItemsWithPackageVersion = null;
+ List packageReferenceItemsWithNoPackageVersion = null;
+ List packageReferenceItemsWithVersion = null;
+ List packageReferenceItemsWithVersionOverride = null;
+
+ foreach (TargetFrameworkInformation targetFrameworkInformation in _request.Project.TargetFrameworks)
{
- // Emit a error if VersionOverride was specified for a package reference but that functionality is disabled
- bool hasVersionOverrides = false;
- foreach (var item in dependenciesWithVersionOverride)
+ foreach (LibraryDependency libraryDependency in targetFrameworkInformation.Dependencies)
{
- await _logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1013, string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageVersions_VersionOverrideDisabled, item.Name)));
- hasVersionOverrides = true;
+ if (libraryDependency.AutoReferenced)
+ {
+ // Implicitly defined packages that the user specified a version for
+ if (targetFrameworkInformation.CentralPackageVersions.ContainsKey(libraryDependency.Name))
+ {
+ implicitPackageReferenceItemsWithPackageVersion ??= new();
+
+ implicitPackageReferenceItemsWithPackageVersion.Add(libraryDependency);
+ }
+ }
+ else
+ {
+ // VersionOverride is specified but that functionality is disabled
+ if (restoreRequest.Project.RestoreMetadata.CentralPackageVersionOverrideDisabled && libraryDependency.VersionOverride != null)
+ {
+ packageReferenceItemsWithVersionOverride ??= new();
+
+ packageReferenceItemsWithVersionOverride.Add(libraryDependency);
+ }
+
+ // Dependencies that have a version specified
+ if (!libraryDependency.VersionCentrallyManaged && libraryDependency.LibraryRange.VersionRange != null && libraryDependency.VersionOverride == null)
+ {
+ packageReferenceItemsWithVersion ??= new();
+
+ packageReferenceItemsWithVersion.Add(libraryDependency);
+ }
+
+ // Dependencies that have no version specified
+ if (libraryDependency.LibraryRange?.VersionRange == null)
+ {
+ packageReferenceItemsWithNoPackageVersion ??= new();
+
+ packageReferenceItemsWithNoPackageVersion.Add(libraryDependency);
+ }
+ }
}
- if (hasVersionOverrides)
+ if (!restoreRequest.Project.RestoreMetadata.CentralPackageFloatingVersionsEnabled)
{
- return false;
+ foreach (KeyValuePair centralPackageVersion in targetFrameworkInformation.CentralPackageVersions.NoAllocEnumerate())
+ {
+ // Floating version dependencies
+ if (centralPackageVersion.Value.VersionRange.IsFloating)
+ {
+ packageVersionItemsWithFloatingVersion ??= new();
+
+ packageVersionItemsWithFloatingVersion.Add(centralPackageVersion.Value);
+ }
+ }
}
}
- if (!restoreRequest.PackageSourceMapping.IsEnabled && httpSourcesCount > 1)
+ if (packageReferenceItemsWithVersion != null && packageReferenceItemsWithVersion.Count > 0)
{
- // Log a warning if there are more than one configured source and package source mapping is not enabled
- await _logger.LogAsync(RestoreLogMessage.CreateWarning(NuGetLogCode.NU1507, string.Format(CultureInfo.CurrentCulture, Strings.Warning_CentralPackageVersions_MultipleSourcesWithoutPackageSourceMapping, httpSourcesCount, string.Join(", ", restoreRequest.DependencyProviders.RemoteProviders.Where(i => i.IsHttp).Select(i => i.Source.Name)))));
+ result = false;
+
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateError(
+ NuGetLogCode.NU1008,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Error_CentralPackageManagement_PackageReferenceWithVersionNotAllowed,
+ string.Join(", ", packageReferenceItemsWithVersion.Select(d => d.Name)))));
}
- // The dependencies should not have versions explicitly defined if cpvm is enabled.
- IEnumerable dependenciesWithDefinedVersion = _request.Project.TargetFrameworks.SelectMany(tfm => tfm.Dependencies.Where(d => !d.VersionCentrallyManaged && !d.AutoReferenced && d.VersionOverride == null));
- if (dependenciesWithDefinedVersion.Any())
+ if (implicitPackageReferenceItemsWithPackageVersion != null && implicitPackageReferenceItemsWithPackageVersion.Count > 0)
{
- await _logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1008, string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageVersions_VersionsNotAllowed, string.Join(";", dependenciesWithDefinedVersion.Select(d => d.Name)))));
- return false;
+ result = false;
+
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateError(
+ NuGetLogCode.NU1009,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Error_CentralPackageManagement_ImplicitPackageReferenceWithVersionNotAllowed,
+ string.Join(", ", implicitPackageReferenceItemsWithPackageVersion.Select(d => d.Name)))));
}
- IEnumerable autoReferencedAndDefinedInCentralFile = _request.Project.TargetFrameworks.SelectMany(tfm => tfm.Dependencies.Where(d => d.AutoReferenced && tfm.CentralPackageVersions.ContainsKey(d.Name)));
- if (autoReferencedAndDefinedInCentralFile.Any())
+
+ if (packageReferenceItemsWithNoPackageVersion != null && packageReferenceItemsWithNoPackageVersion.Count > 0)
{
- await _logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1009, string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageVersions_AutoreferencedReferencesNotAllowed, string.Join(";", autoReferencedAndDefinedInCentralFile.Select(d => d.Name)))));
+ result = false;
- return false;
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateError(
+ NuGetLogCode.NU1010,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Error_CentralPackageManagement_MissingPackageVersion,
+ string.Join(", ", packageReferenceItemsWithNoPackageVersion.Select(d => d.Name)))));
}
- IEnumerable packageReferencedDependenciesWithoutCentralVersionDefined = _request.Project.TargetFrameworks.SelectMany(tfm => tfm.Dependencies.Where(d => d.LibraryRange.VersionRange == null));
- if (packageReferencedDependenciesWithoutCentralVersionDefined.Any())
+
+ if (packageVersionItemsWithFloatingVersion != null && packageVersionItemsWithFloatingVersion.Count > 0)
{
- await _logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1010, string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageVersions_MissingPackageVersion, string.Join(";", packageReferencedDependenciesWithoutCentralVersionDefined.Select(d => d.Name)))));
- return false;
+ result = false;
+
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateError(
+ NuGetLogCode.NU1011,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Error_CentralPackageManagement_FloatingVersionsNotAllowed,
+ string.Join(", ", packageVersionItemsWithFloatingVersion.Select(i => i.Name)))));
}
- if (!restoreRequest.Project.RestoreMetadata.CentralPackageFloatingVersionsEnabled)
+ if (packageReferenceItemsWithVersionOverride != null && packageReferenceItemsWithVersionOverride.Count > 0)
{
- var floatingVersionDependencies = _request.Project.TargetFrameworks.SelectMany(tfm => tfm.CentralPackageVersions.Values).Where(cpv => cpv.VersionRange.IsFloating);
- if (floatingVersionDependencies.Any())
+ result = false;
+
+ foreach (var item in packageReferenceItemsWithVersionOverride)
{
- await _logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1011, Strings.Error_CentralPackageVersions_FloatingVersionsAreNotAllowed));
- return false;
+ await _logger.LogAsync(
+ RestoreLogMessage.CreateError(
+ NuGetLogCode.NU1013,
+ string.Format(
+ CultureInfo.CurrentCulture,
+ Strings.Error_CentralPackageManagement_VersionOverrideNotAllowed,
+ item.Name)));
}
}
- return true;
+ return result;
}
private string ConcatAsString(IEnumerable enumerable)
diff --git a/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs b/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs
index a60c9da7e19..b26f433088a 100644
--- a/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs
+++ b/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs
@@ -223,47 +223,47 @@ internal static string Error_CannotTrustOwnersForAuthor {
}
///
- /// Looks up a localized string similar to The packages {0} are implicitly referenced. You do not typically need to reference them from your project or in your central package versions management file. For more information, see https://aka.ms/sdkimplicitrefs.
+ /// Looks up a localized string similar to The following PackageVersion items cannot specify a floating version: {0}. For more information on how to enable this functionality for projects using Central Package Management, visit https://aka.ms/nu1011.
///
- internal static string Error_CentralPackageVersions_AutoreferencedReferencesNotAllowed {
+ internal static string Error_CentralPackageManagement_FloatingVersionsNotAllowed {
get {
- return ResourceManager.GetString("Error_CentralPackageVersions_AutoreferencedReferencesNotAllowed", resourceCulture);
+ return ResourceManager.GetString("Error_CentralPackageManagement_FloatingVersionsNotAllowed", resourceCulture);
}
}
///
- /// Looks up a localized string similar to Centrally defined floating package versions are not allowed..
+ /// Looks up a localized string similar to The following PackageReference items are implicitly defined and cannot define a PackageVersion item: {0}. Projects using Central Package Management require that implicit package versions be specified by the PackageReference item. For more information, visit https://aka.ms/sdkimplicitrefs.
///
- internal static string Error_CentralPackageVersions_FloatingVersionsAreNotAllowed {
+ internal static string Error_CentralPackageManagement_ImplicitPackageReferenceWithVersionNotAllowed {
get {
- return ResourceManager.GetString("Error_CentralPackageVersions_FloatingVersionsAreNotAllowed", resourceCulture);
+ return ResourceManager.GetString("Error_CentralPackageManagement_ImplicitPackageReferenceWithVersionNotAllowed", resourceCulture);
}
}
///
- /// Looks up a localized string similar to The PackageReference items {0} do not have corresponding PackageVersion..
+ /// Looks up a localized string similar to The following PackageReference items do not define a corresponding PackageVersion item: {0}. Projects using Central Package Management must declare PackageReference and PackageVersion items with matching names. For more information, visit https://aka.ms/nuget/cpm/gettingstarted.
///
- internal static string Error_CentralPackageVersions_MissingPackageVersion {
+ internal static string Error_CentralPackageManagement_MissingPackageVersion {
get {
- return ResourceManager.GetString("Error_CentralPackageVersions_MissingPackageVersion", resourceCulture);
+ return ResourceManager.GetString("Error_CentralPackageManagement_MissingPackageVersion", resourceCulture);
}
}
///
- /// Looks up a localized string similar to The package reference {0} specifies a VersionOverride but the ability to override a centrally defined version is currently disabled..
+ /// Looks up a localized string similar to The following PackageReference items cannot define a value for Version: {0}. Projects using Central Package Management must define a Version value on a PackageVersion item. For more information, visit https://aka.ms/nuget/cpm/gettingstarted.
///
- internal static string Error_CentralPackageVersions_VersionOverrideDisabled {
+ internal static string Error_CentralPackageManagement_PackageReferenceWithVersionNotAllowed {
get {
- return ResourceManager.GetString("Error_CentralPackageVersions_VersionOverrideDisabled", resourceCulture);
+ return ResourceManager.GetString("Error_CentralPackageManagement_PackageReferenceWithVersionNotAllowed", resourceCulture);
}
}
///
- /// Looks up a localized string similar to Projects that use central package version management should not define the version on the PackageReference items but on the PackageVersion items: {0}..
+ /// Looks up a localized string similar to The following PackageReference items cannot specify a value for VersionOverride: {0}. Projects using Central Package Management are currently configured to disable this functionality. For more information, visit https://aka.ms/nuget/cpm/versionoverride.
///
- internal static string Error_CentralPackageVersions_VersionsNotAllowed {
+ internal static string Error_CentralPackageManagement_VersionOverrideNotAllowed {
get {
- return ResourceManager.GetString("Error_CentralPackageVersions_VersionsNotAllowed", resourceCulture);
+ return ResourceManager.GetString("Error_CentralPackageManagement_VersionOverrideNotAllowed", resourceCulture);
}
}
@@ -2512,9 +2512,9 @@ internal static string Warning_AuditSourceWithoutVulnerabilityData {
///
/// Looks up a localized string similar to There are {0} package sources defined in your configuration. When using central package management, please map your package sources with package source mapping (https://aka.ms/nuget-package-source-mapping) or specify a single package source. The following sources are defined: {1}.
///
- internal static string Warning_CentralPackageVersions_MultipleSourcesWithoutPackageSourceMapping {
+ internal static string Warning_CentralPackageManagement_MultipleSourcesWithoutPackageSourceMapping {
get {
- return ResourceManager.GetString("Warning_CentralPackageVersions_MultipleSourcesWithoutPackageSourceMapping", resourceCulture);
+ return ResourceManager.GetString("Warning_CentralPackageManagement_MultipleSourcesWithoutPackageSourceMapping", resourceCulture);
}
}
diff --git a/src/NuGet.Core/NuGet.Commands/Strings.resx b/src/NuGet.Core/NuGet.Commands/Strings.resx
index d674e4f0e21..e7c1c716f23 100644
--- a/src/NuGet.Core/NuGet.Commands/Strings.resx
+++ b/src/NuGet.Core/NuGet.Commands/Strings.resx
@@ -792,17 +792,46 @@ For more information, visit https://docs.nuget.org/docs/reference/command-line-r
Package content hash validation failed for {0}. Expected: {1} Actual: {2}
0 - package ID, 1 - expected Sha, 2 - actual sha
-
- Projects that use central package version management should not define the version on the PackageReference items but on the PackageVersion items: {0}.
-
-
- The packages {0} are implicitly referenced. You do not typically need to reference them from your project or in your central package versions management file. For more information, see https://aka.ms/sdkimplicitrefs
-
-
- The package reference {0} specifies a VersionOverride but the ability to override a centrally defined version is currently disabled.
- 0 - The name of a package reference.
-
-
+
+ The following PackageReference items cannot define a value for Version: {0}. Projects using Central Package Management must define a Version value on a PackageVersion item. For more information, visit https://aka.ms/nuget/cpm/gettingstarted
+
+ 0 - Comma delimited list of the package IDs that specified a Version
+ Do not localize `PackageReference`
+ Do not localize `PackageVersion`
+
+
+
+ The following PackageReference items are implicitly defined and cannot define a PackageVersion item: {0}. Projects using Central Package Management require that implicit package versions be specified by the PackageReference item. For more information, visit https://aka.ms/sdkimplicitrefs
+
+ 0 - Comma delimited list of the package IDs that were implicitly defined and should not have a PackageVersion item
+ Do not localize `PackageReference`
+ Do not localize `PackageVersion`
+
+
+
+ The following PackageReference items do not define a corresponding PackageVersion item: {0}. Projects using Central Package Management must declare PackageReference and PackageVersion items with matching names. For more information, visit https://aka.ms/nuget/cpm/gettingstarted
+
+ 0 - The comma delimited list of package names that did not have a version specified.
+ Do not localize `PackageReference`
+ Do not localize `PackageVersion`
+
+
+
+ The following PackageVersion items cannot specify a floating version: {0}. For more information on how to enable this functionality for projects using Central Package Management, visit https://aka.ms/nu1011
+
+ 0 - The comma delimited list of package names that specified a floating version.
+ Do not localize `PackageVersion`
+
+
+
+ The following PackageReference items cannot specify a value for VersionOverride: {0}. Projects using Central Package Management are currently configured to disable this functionality. For more information, visit https://aka.ms/nuget/cpm/versionoverride
+
+ 0 - The comma delimited list of package names that specified a value for VersionOverride.
+ Do not localize `PackageReference`
+ Do not localize `VersionOverride`
+
+
+
There are {0} package sources defined in your configuration. When using central package management, please map your package sources with package source mapping (https://aka.ms/nuget-package-source-mapping) or specify a single package source. The following sources are defined: {1}
0 - The number of package sources, 1 - The URL of the package sources, comma separated.
@@ -983,12 +1012,6 @@ For more information, visit https://docs.nuget.org/docs/reference/command-line-r
Detected package downgrade: {0} from {1} to centrally defined {2}. Update the centrally managed package version to a higher version.
{0} is package id, {1} is the package version, {2} is the downgraded package version.
-
- The PackageReference items {0} do not have corresponding PackageVersion.
-
-
- Centrally defined floating package versions are not allowed.
-
The original target frameworks value must match the aliases. Original target frameworks: {0}, aliases: {1}.
@@ -1137,4 +1160,4 @@ NuGet requires HTTPS sources. Refer to https://aka.ms/nuget-https-everywhere for
One or more invalid frameworks were detected.
-
\ No newline at end of file
+
diff --git a/src/NuGet.Core/NuGet.ProjectModel/ProjectLockFile/PackagesLockFileUtilities.cs b/src/NuGet.Core/NuGet.ProjectModel/ProjectLockFile/PackagesLockFileUtilities.cs
index 5024109e92a..703663890ab 100644
--- a/src/NuGet.Core/NuGet.ProjectModel/ProjectLockFile/PackagesLockFileUtilities.cs
+++ b/src/NuGet.Core/NuGet.ProjectModel/ProjectLockFile/PackagesLockFileUtilities.cs
@@ -410,7 +410,7 @@ private static (bool, string) HasDirectPackageDependencyChanged(IEnumerable 0 ? string.Join(", ", lockFileDependencies.Select(e => e.Id + ":" + e.RequestedVersion.ToNormalizedString()).OrderBy(dep => dep)) : Strings.None,
- newPackageDependenciesCount > 0 ? string.Join(", ", newPackageDependencies.Select(e => e.LibraryRange.Name + ":" + e.LibraryRange.VersionRange.ToNormalizedString()).OrderBy(dep => dep)) : Strings.None)
+ newPackageDependenciesCount > 0 ? string.Join(", ", newPackageDependencies.Select(e => e.LibraryRange.ToLockFileDependencyGroupString()).OrderBy(dep => dep)) : Strings.None)
);
}
diff --git a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs
index 10d0d0e7a97..eebf6ea360c 100644
--- a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs
+++ b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs
@@ -4673,10 +4673,10 @@ public async Task GetInstalledVersion_WithMissingCPMVersion_ReturnsPackageInstal
await result.CommitAsync(logger, CancellationToken.None);
var packages = await project.GetInstalledPackagesAsync(CancellationToken.None);
- // Asert
+ // Assert
result.Success.Should().BeFalse();
result.LockFile.LogMessages.Should().HaveCount(1);
- result.LockFile.LogMessages[0].Code.Should().Be(NuGetLogCode.NU1008);
+ result.LockFile.LogMessages[0].Code.Should().Be(NuGetLogCode.NU1010);
packages.Should().HaveCount(1);
packages.Should().Contain(a => a.PackageIdentity.Equals(new PackageIdentity("packageA", new NuGetVersion("0.0.0"))));
}
diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommand_PackagesLockFileTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommand_PackagesLockFileTests.cs
index 73cfacf3eea..f92f1708ede 100644
--- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommand_PackagesLockFileTests.cs
+++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommand_PackagesLockFileTests.cs
@@ -202,7 +202,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
result.Success.Should().BeFalse();
logger.ErrorMessages.Count.Should().Be(1);
logger.ErrorMessages.Single().Should().Contain("NU1004");
- logger.ErrorMessages.Single().Should().Contain("The package references have changed for net46. Lock file's package references: a:[1.0.0, ), project's package references: a:[1.0.0, ), b:[1.0.0, )");
+ logger.ErrorMessages.Single().Should().Contain("The package references have changed for net46. Lock file's package references: a:[1.0.0, ), project's package references: a >= 1.0.0, b >= 1.0.0");
}
}
diff --git a/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs b/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs
index 0354c28064a..b8020645b84 100644
--- a/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs
+++ b/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs
@@ -5,6 +5,7 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
+using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
@@ -1465,7 +1466,7 @@ public async Task RestoreCommand_MinimalProjectWithAdditionalMessages_WritesAsse
}
[Fact]
- public async Task RestoreCommand_CentralVersion_ErrorWhenDependenciesHaveVersion()
+ public async Task ExecuteAsync_CentralPackageManagementEnabled_WhenPackageReferencesHaveVersion_LogsAnError()
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -1515,17 +1516,17 @@ public async Task RestoreCommand_CentralVersion_ErrorWhenDependenciesHaveVersion
Assert.False(result.Success);
Assert.Equal(1, logger.ErrorMessages.Count);
logger.ErrorMessages.TryDequeue(out var errorMessage);
- Assert.True(errorMessage.Contains("Projects that use central package version management should not define the version on the PackageReference items but on the PackageVersion"));
- Assert.True(errorMessage.Contains("bar"));
- var NU1801Messages = result.LockFile.LogMessages.Where(m => m.Code == NuGetLogCode.NU1008);
- Assert.Equal(1, NU1801Messages.Count());
+ Assert.EndsWith(string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageManagement_PackageReferenceWithVersionNotAllowed, "bar"), errorMessage);
+
+ var NU1008Messages = result.LockFile.LogMessages.Where(m => m.Code == NuGetLogCode.NU1008);
+ Assert.Equal(1, NU1008Messages.Count());
}
}
[Theory]
[InlineData("bar")]
[InlineData("Bar")]
- public async Task RestoreCommand_CentralVersion_ErrorWhenCentralPackageVersionFileContainsAutoReferencedReferences(string autoreferencedpackageId)
+ public async Task RestoreCommand_CentralPackageManagement_ErrorWhenCentralPackageVersionFileContainsAutoReferencedReferences(string autoreferencedpackageId)
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -1579,15 +1580,15 @@ public async Task RestoreCommand_CentralVersion_ErrorWhenCentralPackageVersionFi
Assert.False(result.Success);
Assert.Equal(1, logger.ErrorMessages.Count);
logger.ErrorMessages.TryDequeue(out var errorMessage);
- Assert.True(errorMessage.Contains("You do not typically need to reference them from your project or in your central package versions management file. For more information, see https://aka.ms/sdkimplicitrefs"));
- Assert.True(errorMessage.Contains(autoreferencedpackageId));
+ Assert.EndsWith(string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageManagement_ImplicitPackageReferenceWithVersionNotAllowed, autoreferencedpackageId), errorMessage);
+
var NU1009Messages = result.LockFile.LogMessages.Where(m => m.Code == NuGetLogCode.NU1009);
Assert.Equal(1, NU1009Messages.Count());
}
}
[Fact]
- public async Task RestoreCommand_CentralVersion_NoWarningWhenOnlyOneFeedAndPackageSourceMappingNotUsed()
+ public async Task RestoreCommand_CentralPackageManagement_NoWarningWhenOnlyOneFeedAndPackageSourceMappingNotUsed()
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -1668,7 +1669,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
[Theory]
[InlineData(true)]
[InlineData(false)]
- public async Task RestoreCommand_CentralVersion_WarningWhenMoreThanOneFeedAndPackageSourceMappingNotUsed(bool enablePackageSourceMapping)
+ public async Task RestoreCommand_CentralPackageManagement_WarningWhenMoreThanOneFeedAndPackageSourceMappingNotUsed(bool enablePackageSourceMapping)
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -1986,7 +1987,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
[Theory]
[InlineData(true)]
[InlineData(false)]
- public async Task RestoreCommand_CentralVersion_ErrorWhenFloatingCentralVersions(bool enabled)
+ public async Task RestoreCommand_CentralPackageManagement_ErrorWhenFloatingCentralVersions(bool enabled)
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -2053,7 +2054,8 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
Assert.False(result.Success);
Assert.Equal(1, logger.ErrorMessages.Count);
logger.ErrorMessages.TryDequeue(out var errorMessage);
- Assert.True(errorMessage.Contains("Centrally defined floating package versions are not allowed."));
+ Assert.EndsWith(string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageManagement_FloatingVersionsNotAllowed, "foo"), errorMessage);
+
var messagesForNU1011 = result.LockFile.LogMessages.Where(m => m.Code == NuGetLogCode.NU1011);
Assert.Equal(1, messagesForNU1011.Count());
}
@@ -2061,7 +2063,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
}
[Fact]
- public async Task RestoreCommand_CentralVersion_ErrorWhenNotAllPRItemsHaveCorespondingPackageVersion()
+ public async Task RestoreCommand_CentralPackageManagement_ErrorWhenNotAllPRItemsHaveCorrespondingPackageVersion()
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -2070,7 +2072,7 @@ public async Task RestoreCommand_CentralVersion_ErrorWhenNotAllPRItemsHaveCoresp
var projectPath = Path.Combine(pathContext.SolutionRoot, projectName);
var outputPath = Path.Combine(projectPath, "obj");
// Package Bar does not have a corresponding PackageVersion
- var packageRefDependecyBar = new LibraryDependency()
+ var packageRefDependencyBar = new LibraryDependency()
{
LibraryRange = new LibraryRange("bar", versionRange: null, typeConstraint: LibraryDependencyTarget.Package),
};
@@ -2078,7 +2080,7 @@ public async Task RestoreCommand_CentralVersion_ErrorWhenNotAllPRItemsHaveCoresp
var centralVersionFoo = new CentralPackageVersion("foo", VersionRange.Parse("1.0.0"));
var tfi = CreateTargetFrameworkInformation(
- [packageRefDependecyBar],
+ [packageRefDependencyBar],
new List() { centralVersionFoo });
var packageSpec = new PackageSpec(new List() { tfi });
@@ -2111,14 +2113,15 @@ public async Task RestoreCommand_CentralVersion_ErrorWhenNotAllPRItemsHaveCoresp
Assert.False(result.Success);
Assert.Equal(1, logger.ErrorMessages.Count);
logger.ErrorMessages.TryDequeue(out var errorMessage);
- Assert.True(errorMessage.Contains("The PackageReference items bar do not have corresponding PackageVersion."));
+ Assert.EndsWith(string.Format(CultureInfo.CurrentCulture, Strings.Error_CentralPackageManagement_MissingPackageVersion, "bar"), errorMessage);
+
var messagesForNU1010 = result.LockFile.LogMessages.Where(m => m.Code == NuGetLogCode.NU1010);
Assert.Equal(1, messagesForNU1010.Count());
}
}
[Fact]
- public async Task RestoreCommand_CentralVersion_Multitargeting_NoFailureSamePackageInTwoFrameworsDirectAndTransitive()
+ public async Task RestoreCommand_CentralPackageManagement_Multitargeting_NoFailureSamePackageInTwoFrameworksDirectAndTransitive()
{
// Arrange
using (var pathContext = new SimpleTestPathContext())
@@ -2199,7 +2202,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async(
}
[Fact]
- public async Task RestoreCommand_CentralVersion_AssetsFile_VerifyProjectsReferencesInTargets()
+ public async Task RestoreCommand_CentralPackageManagement_AssetsFile_VerifyProjectsReferencesInTargets()
{
// Arrange
var framework = new NuGetFramework("net46");
@@ -2280,7 +2283,7 @@ public async Task RestoreCommand_CentralVersion_AssetsFile_VerifyProjectsReferen
///
///
[Fact]
- public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithTopLevelDependency()
+ public async Task RestoreCommand_CentralPackageManagement_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithTopLevelDependency()
{
// Arrange
var framework = new NuGetFramework("net46");
@@ -2397,7 +2400,7 @@ public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToP
///
///
[Fact]
- public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithSingleParent()
+ public async Task RestoreCommand_CentralPackageManagement_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithSingleParent()
{
// Arrange
var framework = new NuGetFramework("net46");
@@ -2504,7 +2507,7 @@ public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToP
[Theory]
[InlineData(LibraryIncludeFlags.All, 0)]
[InlineData(LibraryIncludeFlags.None, 1)]
- public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithSingleParentProject(LibraryIncludeFlags privateAssets, int expectedCount)
+ public async Task RestoreCommand_CentralPackageManagement_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithSingleParentProject(LibraryIncludeFlags privateAssets, int expectedCount)
{
// Arrange
using (var testPathContext = new SimpleTestPathContext())
@@ -2596,7 +2599,7 @@ public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToP
[InlineData(LibraryIncludeFlags.All, LibraryIncludeFlags.All, LibraryIncludeFlags.All)] // When both parents have PrivateAssets="All", expect that the dependency does not flow
[InlineData(LibraryIncludeFlags.None, LibraryIncludeFlags.None, LibraryIncludeFlags.None)] // When both parents have PrivateAssets="None", expect all assets of the dependency to flow
[InlineData(LibraryIncludeFlags.None, LibraryIncludeFlags.Runtime | LibraryIncludeFlags.Compile, LibraryIncludeFlags.None)] // When both parents have PrivateAssets="None", expect that the dependency is completely suppressed
- public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithMultipleParents(LibraryIncludeFlags suppressParent1, LibraryIncludeFlags suppressParent2, LibraryIncludeFlags expected)
+ public async Task RestoreCommand_CentralPackageManagement_AssetsFile_PrivateAssetsFlowsToPinnedDependenciesWithMultipleParents(LibraryIncludeFlags suppressParent1, LibraryIncludeFlags suppressParent2, LibraryIncludeFlags expected)
{
// Arrange
var framework = new NuGetFramework("net46");
@@ -2720,7 +2723,7 @@ public async Task RestoreCommand_CentralVersion_AssetsFile_PrivateAssetsFlowsToP
[InlineData(true, false)]
[InlineData(false, true)]
[InlineData(false, false)]
- public async Task RestoreCommand_CentralVersion_ErrorWhenVersionOverrideUsedButIsDisabled(bool isCentralPackageVersionOverrideDisabled, bool isVersionOverrideUsed)
+ public async Task RestoreCommand_CentralPackageManagement_ErrorWhenVersionOverrideUsedButIsDisabled(bool isCentralPackageVersionOverrideDisabled, bool isVersionOverrideUsed)
{
const string projectName = "TestProject";
diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/ProjectLockFile/LockFileUtilitiesTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/ProjectLockFile/LockFileUtilitiesTests.cs
index 654a15fba29..288e5553d88 100644
--- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/ProjectLockFile/LockFileUtilitiesTests.cs
+++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/ProjectLockFile/LockFileUtilitiesTests.cs
@@ -1127,5 +1127,39 @@ public void IsLockFileStillValid_WithProjectToProjectPackagesConfig_WithIncompat
Assert.True(actual.IsValid);
Assert.Empty(actual.InvalidReasons);
}
+
+ [Fact]
+ public void IsLockFileValid_WithNullVersionRange_DoesNotThrow()
+ {
+ // Arrange
+ var framework = CommonFrameworks.NetStandard20;
+
+ PackageSpec projectA = ProjectTestHelpers.GetPackageSpec(
+ projectName: "A",
+ rootPath: @"C:\",
+ framework: framework.GetShortFolderName(),
+ dependencyName: "PackageA",
+ dependencyVersion: "1.0.0")
+ .WithTestRestoreMetadata()
+ .WithDependency(new LibraryDependency(new LibraryRange("PackageA", LibraryDependencyTarget.Package))
+ {
+ ReferenceType = LibraryDependencyReferenceType.Direct,
+ });
+
+ // A -> B
+ var dgSpec = ProjectTestHelpers.GetDGSpecForFirstProject(projectA);
+
+ var lockFile = new PackagesLockFileBuilder()
+ .WithTarget(target => target
+ .WithFramework(framework))
+ .Build();
+
+ var actual = PackagesLockFileUtilities.IsLockFileValid(dgSpec, lockFile);
+ Assert.False(actual.IsValid);
+ Assert.NotNull(actual.InvalidReasons);
+ Assert.Equal(1, actual.InvalidReasons.Count);
+ var invalidReason = actual.InvalidReasons.Single();
+ Assert.Contains("PackageA", invalidReason);
+ }
}
}
diff --git a/test/TestUtilities/Test.Utility/Commands/ProjectTestHelpers.cs b/test/TestUtilities/Test.Utility/Commands/ProjectTestHelpers.cs
index be83f74c771..584aff6f349 100644
--- a/test/TestUtilities/Test.Utility/Commands/ProjectTestHelpers.cs
+++ b/test/TestUtilities/Test.Utility/Commands/ProjectTestHelpers.cs
@@ -149,6 +149,14 @@ public static PackageSpec WithTestRestoreMetadata(this PackageSpec spec)
return updated;
}
+ public static PackageSpec WithDependency(this PackageSpec spec, LibraryDependency libraryDependency)
+ {
+ AddDependency(spec, libraryDependency);
+
+ return spec;
+
+ }
+
///
/// Creates a restore request for the first project in the list. If has any values, it is used for creating the providers, otherwise from will be used.
///