Skip to content

Commit eb32a82

Browse files
committed
enable updating transitive via top level with solver
1 parent db94a53 commit eb32a82

File tree

4 files changed

+190
-54
lines changed

4 files changed

+190
-54
lines changed

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,66 @@ await TestUpdateForProject("Some.Package", "9.0.1", "13.0.1",
9595
);
9696
}
9797

98+
[Theory]
99+
[InlineData(true)]
100+
[InlineData(false)]
101+
public async Task PeerDependenciesAreUpdatedEvenWhenNotExplicit(bool useDependencySolver)
102+
{
103+
using var _ = new DependencySolverEnvironment(useDependencySolver);
104+
await TestUpdateForProject("AspNetCore.HealthChecks.Rabbitmq", "5.0.2", "7.0.0",
105+
projectFile: ("a/a.csproj", """
106+
<Project Sdk="Microsoft.NET.Sdk">
107+
<PropertyGroup>
108+
<OutputType>Exe</OutputType>
109+
<TargetFramework>net6.0</TargetFramework>
110+
<ImplicitUsings>enable</ImplicitUsings>
111+
<Nullable>enable</Nullable>
112+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
113+
</PropertyGroup>
114+
<ItemGroup>
115+
<PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" />
116+
</ItemGroup>
117+
</Project>
118+
"""),
119+
additionalFiles:
120+
[
121+
("Directory.Packages.props", """
122+
<Project>
123+
<ItemGroup>
124+
<PackageVersion Include="AspNetCore.HealthChecks.Rabbitmq" Version="5.0.2" />
125+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="5.0.17" />
126+
</ItemGroup>
127+
</Project>
128+
""")
129+
],
130+
expectedProjectContents: """
131+
<Project Sdk="Microsoft.NET.Sdk">
132+
<PropertyGroup>
133+
<OutputType>Exe</OutputType>
134+
<TargetFramework>net6.0</TargetFramework>
135+
<ImplicitUsings>enable</ImplicitUsings>
136+
<Nullable>enable</Nullable>
137+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
138+
</PropertyGroup>
139+
<ItemGroup>
140+
<PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" />
141+
</ItemGroup>
142+
</Project>
143+
""",
144+
additionalFilesExpected:
145+
[
146+
("Directory.Packages.props", """
147+
<Project>
148+
<ItemGroup>
149+
<PackageVersion Include="AspNetCore.HealthChecks.Rabbitmq" Version="7.0.0" />
150+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="7.0.9" />
151+
</ItemGroup>
152+
</Project>
153+
""")
154+
]
155+
);
156+
}
157+
98158
[Fact]
99159
public async Task CallingResolveDependencyConflictsNew()
100160
{
@@ -2914,6 +2974,45 @@ await TestUpdateForProject("Some.Package", "12.0.1", "13.0.1",
29142974
);
29152975
}
29162976

2977+
[Fact]
2978+
public async Task UpdatingTransitiveDependencyWithNewSolverCanUpdateJustTheTopLevelPackage()
2979+
{
2980+
// we've been asked to explicitly update a transitive dependency, but we can solve it by updating the top-level package instead
2981+
using var _ = new DependencySolverEnvironment();
2982+
await TestUpdateForProject("Transitive.Package", "1.0.0", "2.0.0",
2983+
isTransitive: true,
2984+
packages:
2985+
[
2986+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[1.0.0]")])]),
2987+
MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[2.0.0]")])]),
2988+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "1.0.0", "net8.0"),
2989+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "2.0.0", "net8.0"),
2990+
],
2991+
projectContents: """
2992+
<Project Sdk="Microsoft.NET.Sdk">
2993+
<PropertyGroup>
2994+
<TargetFramework>net8.0</TargetFramework>
2995+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
2996+
</PropertyGroup>
2997+
<ItemGroup>
2998+
<PackageReference Include="Some.Package" Version="1.0.0" />
2999+
</ItemGroup>
3000+
</Project>
3001+
""",
3002+
expectedProjectContents: """
3003+
<Project Sdk="Microsoft.NET.Sdk">
3004+
<PropertyGroup>
3005+
<TargetFramework>net8.0</TargetFramework>
3006+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
3007+
</PropertyGroup>
3008+
<ItemGroup>
3009+
<PackageReference Include="Some.Package" Version="2.0.0" />
3010+
</ItemGroup>
3011+
</Project>
3012+
"""
3013+
);
3014+
}
3015+
29173016
[Theory]
29183017
[InlineData(true)]
29193018
[InlineData(false)]

nuget/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,9 @@ [new Dependency("Package.A", "1.0.0", DependencyType.Unknown)]
442442
}
443443

444444
[Fact]
445-
public async Task DependencyConflictsCanBeResolved()
445+
public async Task DependencyConflictsCanBeResolvedWithBruteForce()
446446
{
447-
var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolved)}_");
447+
var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedWithBruteForce)}_");
448448
MockNuGetPackage[] testPackages =
449449
[
450450
// some base packages
@@ -483,7 +483,7 @@ await File.WriteAllTextAsync(projectPath, """
483483
{
484484
new Dependency("Some.Other.Package", "1.2.0", DependencyType.PackageReference),
485485
};
486-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
486+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(repoRoot.FullName, projectPath, "net8.0", dependencies, new TestLogger());
487487
Assert.NotNull(resolvedDependencies);
488488
Assert.Equal(2, resolvedDependencies.Length);
489489
Assert.Equal("Some.Package", resolvedDependencies[0].Name);
@@ -533,7 +533,7 @@ await File.WriteAllTextAsync(projectPath, """
533533
new Dependency("CS-Script.Core", "2.0.0", DependencyType.PackageReference),
534534
};
535535

536-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
536+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
537537
Assert.NotNull(resolvedDependencies);
538538
Assert.Equal(3, resolvedDependencies.Length);
539539
Assert.Equal("CS-Script.Core", resolvedDependencies[0].Name);
@@ -578,7 +578,7 @@ await File.WriteAllTextAsync(projectPath, """
578578
new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.1.1", DependencyType.Unknown)
579579
};
580580

581-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
581+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
582582
Assert.NotNull(resolvedDependencies);
583583
Assert.Single(resolvedDependencies);
584584
Assert.Equal("Azure.Core", resolvedDependencies[0].Name);
@@ -621,7 +621,7 @@ await File.WriteAllTextAsync(projectPath, """
621621
new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
622622
};
623623

624-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
624+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
625625
Assert.NotNull(resolvedDependencies);
626626
Assert.Equal(2, resolvedDependencies.Length);
627627
Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[0].Name);
@@ -671,7 +671,7 @@ await File.WriteAllTextAsync(projectPath, """
671671
new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
672672
};
673673

674-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
674+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
675675
Assert.NotNull(resolvedDependencies);
676676
Assert.Equal(3, resolvedDependencies.Length);
677677
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -723,7 +723,7 @@ await File.WriteAllTextAsync(projectPath, """
723723
new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
724724
};
725725

726-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
726+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
727727
Assert.NotNull(resolvedDependencies);
728728
Assert.Equal(4, resolvedDependencies.Length);
729729
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -779,7 +779,7 @@ await File.WriteAllTextAsync(projectPath, """
779779
new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
780780
};
781781

782-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
782+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
783783
Assert.NotNull(resolvedDependencies);
784784
Assert.Equal(5, resolvedDependencies.Length);
785785
Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -838,7 +838,7 @@ await File.WriteAllTextAsync(projectPath, """
838838
new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
839839
};
840840

841-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
841+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
842842
Assert.NotNull(resolvedDependencies);
843843
Assert.Equal(4, resolvedDependencies.Length);
844844
Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
@@ -895,7 +895,7 @@ await File.WriteAllTextAsync(projectPath, """
895895
new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
896896
};
897897

898-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
898+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
899899
Assert.NotNull(resolvedDependencies);
900900
Assert.Equal(4, resolvedDependencies.Length);
901901
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -952,7 +952,7 @@ await File.WriteAllTextAsync(projectPath, """
952952
new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
953953
};
954954

955-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
955+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
956956
Assert.NotNull(resolvedDependencies);
957957
Assert.Equal(5, resolvedDependencies.Length);
958958
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -1007,7 +1007,7 @@ await File.WriteAllTextAsync(projectPath, """
10071007
new Dependency("AutoMapper.Collection", "10.0.0", DependencyType.PackageReference)
10081008
};
10091009

1010-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1010+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
10111011
Assert.NotNull(resolvedDependencies);
10121012
Assert.Equal(3, resolvedDependencies.Length);
10131013
Assert.Equal("AutoMapper.Extensions.Microsoft.DependencyInjection", resolvedDependencies[0].Name);
@@ -1054,7 +1054,7 @@ await File.WriteAllTextAsync(projectPath, """
10541054
new Dependency("Microsoft.Extensions.Caching.Memory", "8.0.0", DependencyType.PackageReference)
10551055
};
10561056

1057-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1057+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
10581058
Assert.NotNull(resolvedDependencies);
10591059
Assert.Equal(2, resolvedDependencies.Length);
10601060
Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[0].Name);
@@ -1104,7 +1104,7 @@ await File.WriteAllTextAsync(projectPath, """
11041104
new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
11051105
};
11061106

1107-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1107+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
11081108
Assert.NotNull(resolvedDependencies);
11091109
Assert.Equal(4, resolvedDependencies.Length);
11101110
Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
@@ -1156,7 +1156,7 @@ await File.WriteAllTextAsync(projectPath, """
11561156
new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
11571157
};
11581158

1159-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1159+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
11601160
Assert.NotNull(resolvedDependencies);
11611161
Assert.Equal(3, resolvedDependencies.Length);
11621162
Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
@@ -1208,7 +1208,7 @@ await File.WriteAllTextAsync(projectPath, """
12081208
new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
12091209
};
12101210

1211-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1211+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
12121212
Assert.NotNull(resolvedDependencies);
12131213
Assert.Equal(4, resolvedDependencies.Length);
12141214
Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -1260,7 +1260,7 @@ await File.WriteAllTextAsync(projectPath, """
12601260
new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
12611261
};
12621262

1263-
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsNew(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1263+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
12641264
Assert.NotNull(resolvedDependencies);
12651265
Assert.Equal(3, resolvedDependencies.Length);
12661266
Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[0].Name);

0 commit comments

Comments
 (0)