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. ///