diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs index 5b7ad5adbf2..8630a9117f7 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs @@ -1546,13 +1546,32 @@ private async Task ValidateConflictsAsync(IEnumerable { foreach (var versionConflict in graph.AnalyzeResult.VersionConflicts) { - var message = string.Format( - CultureInfo.CurrentCulture, - Strings.Log_VersionConflict, - versionConflict.Selected.Key.Name, - versionConflict.Selected.GetIdAndVersionOrRange(), - _request.Project.Name) - + $" {Environment.NewLine} {versionConflict.Selected.GetPathWithLastRange()} {Environment.NewLine} {versionConflict.Conflicting.GetPathWithLastRange()}."; + string message; + + bool isPinningEnabled = _request.Project.RestoreMetadata?.CentralPackageVersionsEnabled == true && _request.Project.RestoreMetadata?.CentralPackageTransitivePinningEnabled == true; // If pinning is enabled for this project, the error message can provide details about adding a PackageVersion. + // If pinning is enabled, then this package is not centrally managed yet. + // If the conflicting package was centrally managed, it'd be pinned and a pinned package cannot cause downgrades or version conflicts. + // A pinned package would basically raise NU1109 if downgraded or no error otherwise. + + if (isPinningEnabled) + { + message = string.Format( + CultureInfo.CurrentCulture, + Strings.Log_VersionConflictForCentralTransitive, + versionConflict.Selected.Key.Name, + versionConflict.Selected.GetIdAndVersionOrRange()) + + $" {Environment.NewLine} {versionConflict.Selected.GetPathWithLastRange()} {Environment.NewLine} {versionConflict.Conflicting.GetPathWithLastRange()}."; + } + else + { + message = string.Format( + CultureInfo.CurrentCulture, + Strings.Log_VersionConflict, + versionConflict.Selected.Key.Name, + versionConflict.Selected.GetIdAndVersionOrRange(), + _request.Project.Name) + + $" {Environment.NewLine} {versionConflict.Selected.GetPathWithLastRange()} {Environment.NewLine} {versionConflict.Conflicting.GetPathWithLastRange()}."; + } await logger.LogAsync(RestoreLogMessage.CreateError(NuGetLogCode.NU1107, message, versionConflict.Selected.Key.Name, graph.TargetGraphName)); return false; diff --git a/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs b/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs index 43b322ddfd6..b3079ef935f 100644 --- a/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs +++ b/src/NuGet.Core/NuGet.Commands/Strings.Designer.cs @@ -1763,6 +1763,15 @@ internal static string Log_VersionConflict { } } + /// + /// Looks up a localized string similar to Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue.. + /// + internal static string Log_VersionConflictForCentralTransitive { + get { + return ResourceManager.GetString("Log_VersionConflictForCentralTransitive", resourceCulture); + } + } + /// /// Looks up a localized string similar to Writing assets file to disk. Path: {0}. /// diff --git a/src/NuGet.Core/NuGet.Commands/Strings.resx b/src/NuGet.Core/NuGet.Commands/Strings.resx index 169ac0ec224..33e5d574943 100644 --- a/src/NuGet.Core/NuGet.Commands/Strings.resx +++ b/src/NuGet.Core/NuGet.Commands/Strings.resx @@ -179,6 +179,9 @@ Version conflict detected for {0}. Install/reference {1} directly to project {2} to resolve this issue. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Package '{0}' specifies an invalid build action '{1}' for file '{2}'. diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.cs.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.cs.xlf index 8d045dbbf49..f6e49a20542 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.cs.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.cs.xlf @@ -995,6 +995,11 @@ Upgradujte svou sadu .NET SDK nebo odeberte RestoreUseLegacyDependencyResolver, Pro {0} se zjistil konflikt. Pokud chcete tento problém vyřešit, nainstalujte nebo vytvořte odkaz na {1} přímo do projektu {2}. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Soubor prostředků se zapisuje na disk. Cesta: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.de.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.de.xlf index fb51958d874..4c973d1d3e7 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.de.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.de.xlf @@ -995,6 +995,11 @@ Aktualisieren Sie Ihr .NET SDK oder entfernen Sie RestoreUseLegacyDependencyReso Versionskonflikt entdeckt für "{0}". Installieren bzw. referenzieren Sie "{1}" direkt in Projekt "{2}", um dieses Problem zu beheben. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Die Assetdatei wird auf den Datenträger geschrieben. Pfad: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.es.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.es.xlf index 08e8a0537a0..5e78e218ffe 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.es.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.es.xlf @@ -995,6 +995,11 @@ Actualice el SDK de .NET o quite RestoreUseLegacyDependencyResolver para usar es Se detectó un conflicto de versiones para {0}. Para resolver este problema, instale o haga referencia a {1} directamente en el proyecto {2}. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Escribiendo el archivo de recursos en el disco. Ruta de acceso: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.fr.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.fr.xlf index 689c429363f..ca4eea0c2bc 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.fr.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.fr.xlf @@ -995,6 +995,11 @@ Mettez à niveau votre Kit de développement logiciel (SDK) .NET ou supprimez Re Conflit de version détecté pour {0}. Installez/référencez {1} directement au projet {2} pour résoudre ce problème. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Écriture du fichier des composants sur le disque. Chemin : {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.it.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.it.xlf index af232eb51ff..d9ac30969db 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.it.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.it.xlf @@ -995,6 +995,11 @@ Per usare questa funzionalità, aggiornare .NET SDK o rimuovere RestoreUseLegacy È stato rilevato un conflitto di versioni per {0}. Per risolvere questo problema, installare {1} o farvi riferimento direttamente nel progetto {2}. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Scrittura del file di asset sul disco. Percorso: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ja.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ja.xlf index a9849704ef0..ee7ed5ed793 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ja.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ja.xlf @@ -995,6 +995,11 @@ Upgrade your .NET SDK or remove RestoreUseLegacyDependencyResolver to use this f {0} のバージョンの競合が検出されました。この問題を解決するには、{1} をプロジェクト {2} に直接インストールするか、参照します。 + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} アセット ファイルをディスクに書き込んでいます。パス: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ko.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ko.xlf index a8367bf4303..c376f820507 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ko.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ko.xlf @@ -995,6 +995,11 @@ Upgrade your .NET SDK or remove RestoreUseLegacyDependencyResolver to use this f {0}에 대해 버전 충돌이 검색되었습니다. 이 문제를 해결하려면 {1}을(를) {2} 프로젝트에 직접 설치/참조하세요. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} 자산 파일을 디스크에 쓰는 중입니다. 경로: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.pl.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.pl.xlf index 19335382ff2..c68e8dafc87 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.pl.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.pl.xlf @@ -995,6 +995,11 @@ Uaktualnij zestaw .NET SDK lub usuń RestoreUseLegacyDependencyResolver, aby kor Wykryto konflikt wersji dla elementu {0}. Zainstaluj element {1} lub utwórz jego odwołanie bezpośrednio w projekcie {2}, aby rozwiązać ten problem. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Zapisywanie pliku zasobów na dysk. Ścieżka: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.pt-BR.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.pt-BR.xlf index a6477b4eaed..984c9b9cf24 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.pt-BR.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.pt-BR.xlf @@ -995,6 +995,11 @@ Atualize o SDK do .NET ou remova RestoreUseLegacyDependencyResolver para usar es Conflito de versão detectado para {0}. Instale/referencie {1} diretamente no projeto {2} para resolver esse problema. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Gravando o arquivo de ativos no disco. Caminho: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ru.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ru.xlf index ec691099784..548628058e5 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.ru.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.ru.xlf @@ -995,6 +995,11 @@ Upgrade your .NET SDK or remove RestoreUseLegacyDependencyResolver to use this f Обнаружен конфликт версий для {0}. Установите или укажите прямую ссылку {1} на проект {2}, чтобы устранить эту проблему. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Запись файла ресурсов на диск. Путь: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.tr.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.tr.xlf index e7d3d260263..eaade8586f1 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.tr.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.tr.xlf @@ -995,6 +995,11 @@ Bu özelliği kullanmak için .NET SDK'nizi yükseltin veya RestoreUseLegacyDepe {0} için sürüm çakışması algılandı. Bu sorunu çözmek için {1} öğesini doğrudan {2} projesine ekleyin veya burada başvurun. + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} Varlıklar dosyası diske yazılıyor. Yol: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hans.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hans.xlf index fa45230aee2..455043afbff 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hans.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hans.xlf @@ -995,6 +995,11 @@ Upgrade your .NET SDK or remove RestoreUseLegacyDependencyResolver to use this f {0} 中检测到版本冲突。直接安装/引用 {1} 到项目 {2} 可解决此问题。 + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {0} 将资产文件写入磁盘。路径: {0} diff --git a/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hant.xlf b/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hant.xlf index 519e11a6bce..04dc1eba8fd 100644 --- a/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hant.xlf +++ b/src/NuGet.Core/NuGet.Commands/xlf/Strings.zh-Hant.xlf @@ -995,6 +995,11 @@ Upgrade your .NET SDK or remove RestoreUseLegacyDependencyResolver to use this f 偵測到 {0} 有版本衝突。請將 {1} 直接安裝/參考到專案 {2} 來解決此問題。 + + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + Version conflict detected for {0}. Central Package Management transitive pinning is enabled. Add a PackageVersion for {1} to resolve this issue. + + Writing assets file to disk. Path: {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 cc91e0228e6..9d2e501e2ae 100644 --- a/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommandTests/RestoreCommandTests.cs @@ -2024,6 +2024,83 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( } } + // P -> X -> Z [1.0.0] + // P -> Y -> Z >= 2.0.0 + // This creates a conflict. + [Fact] + public async Task RestoreCommand_VersionConflict_CentralTransitive_ShowsCorrectErrorMessage() + { + // Arrange + using var pathContext = new SimpleTestPathContext(); + var logger = new TestLogger(); + var projectName = "TestProject"; + var sources = new List { new PackageSource(pathContext.PackageSource) }; + + var packageX = new SimpleTestPackageContext("x", "1.0.0"); + packageX.Dependencies.Add(new SimpleTestPackageContext("z", "[1.0.0]")); + + var packageY = new SimpleTestPackageContext("y", "1.0.0"); + var packageZ2 = new SimpleTestPackageContext("z", "2.0.0"); + packageY.Dependencies.Add(packageZ2); + + await SimpleTestPackageUtility.CreatePackagesWithoutDependenciesAsync( + pathContext.PackageSource, + packageX, + packageY, + new SimpleTestPackageContext("z", "1.0.0"), + packageZ2, + new SimpleTestPackageContext("z", "3.0.0") + ); + + var packageSpec = @" + { + ""restore"": { + ""centralPackageVersionsManagementEnabled"": true, + ""CentralPackageTransitivePinningEnabled"": true + }, + ""frameworks"": { + ""net472"": { + ""dependencies"": { + ""x"": { + ""version"": ""[1.0.0,)"", + ""target"": ""Package"", + ""versionCentrallyManaged"": true + }, + ""y"": { + ""version"": ""[1.0.0,)"", + ""target"": ""Package"", + ""versionCentrallyManaged"": true + } + }, + ""centralPackageVersions"": { + ""x"": ""[1.0.0,)"", + ""y"": ""[1.0.0,)"", + } + } + } + }"; + + var spec = ProjectTestHelpers.GetPackageSpecWithProjectNameAndSpec(projectName, pathContext.SolutionRoot, packageSpec); + spec.RestoreMetadata.UseLegacyDependencyResolver = true; + var request = new TestRestoreRequest(spec, sources, pathContext.UserPackagesFolder, logger); + var command = new RestoreCommand(request); + + // Act + var result = await command.ExecuteAsync(); + + // Assert + result.Success.Should().BeFalse(logger.ShowMessages()); + + result.LockFile.LogMessages.Should().Contain(e => e.Code == NuGetLogCode.NU1107); + + var errorMessage = result.LockFile.LogMessages[0].Message; + + var expectedMessage = string.Format( + Strings.Log_VersionConflictForCentralTransitive, + "z", "z 2.0.0"); + errorMessage.Should().StartWith(expectedMessage); + } + [Theory] [InlineData(true)] [InlineData(false)] @@ -3654,3 +3731,4 @@ private Task> DoWalkAsync(RemoteDependencyWalker } } } +