dependabot-nuget 0.287.0 → 0.289.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/.gitignore +1 -0
- data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
- data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.props +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +17 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +7 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +74 -20
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +8 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +8 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
- data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
- data/lib/dependabot/nuget/file_fetcher.rb +12 -393
- data/lib/dependabot/nuget/file_parser.rb +23 -54
- data/lib/dependabot/nuget/file_updater.rb +21 -16
- data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
- data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
- data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
- data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
- data/lib/dependabot/nuget/native_helpers.rb +13 -4
- data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
- metadata +15 -12
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
- data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
- data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
- data/lib/dependabot/nuget/native_discovery/native_directory_packages_props_discovery.rb +0 -44
@@ -10,21 +10,17 @@ public record ExpectedWorkspaceDiscoveryResult : NativeResult
|
|
10
10
|
public bool IsSuccess { get; init; } = true;
|
11
11
|
public ImmutableArray<ExpectedSdkProjectDiscoveryResult> Projects { get; init; }
|
12
12
|
public int? ExpectedProjectCount { get; init; }
|
13
|
-
public ExpectedDirectoryPackagesPropsDiscovertyResult? DirectoryPackagesProps { get; init; }
|
14
13
|
public ExpectedDependencyDiscoveryResult? GlobalJson { get; init; }
|
15
14
|
public ExpectedDependencyDiscoveryResult? DotNetToolsJson { get; init; }
|
16
15
|
}
|
17
16
|
|
18
|
-
public record ExpectedDirectoryPackagesPropsDiscovertyResult : ExpectedDependencyDiscoveryResult
|
19
|
-
{
|
20
|
-
public bool IsTransitivePinningEnabled { get; init; }
|
21
|
-
}
|
22
|
-
|
23
17
|
public record ExpectedSdkProjectDiscoveryResult : ExpectedDependencyDiscoveryResult
|
24
18
|
{
|
25
|
-
public ImmutableArray<Property> Properties { get; init; }
|
26
|
-
public ImmutableArray<string> TargetFrameworks { get; init; }
|
27
|
-
public ImmutableArray<string> ReferencedProjectPaths { get; init; }
|
19
|
+
public required ImmutableArray<Property> Properties { get; init; }
|
20
|
+
public required ImmutableArray<string> TargetFrameworks { get; init; }
|
21
|
+
public required ImmutableArray<string> ReferencedProjectPaths { get; init; }
|
22
|
+
public required ImmutableArray<string> ImportedFiles { get; init; }
|
23
|
+
public required ImmutableArray<string> AdditionalFiles { get; init; }
|
28
24
|
}
|
29
25
|
|
30
26
|
public record ExpectedDependencyDiscoveryResult : IDiscoveryResultWithDependencies
|
@@ -0,0 +1,494 @@
|
|
1
|
+
using System.Collections.Immutable;
|
2
|
+
|
3
|
+
using NuGetUpdater.Core.Discover;
|
4
|
+
using NuGetUpdater.Core.Test.Update;
|
5
|
+
|
6
|
+
using Xunit;
|
7
|
+
|
8
|
+
using TestFile = (string Path, string Content);
|
9
|
+
|
10
|
+
namespace NuGetUpdater.Core.Test.Discover;
|
11
|
+
|
12
|
+
public class SdkProjectDiscoveryTests : DiscoveryWorkerTestBase
|
13
|
+
{
|
14
|
+
[Fact]
|
15
|
+
public async Task DiscoveryInSingleProject_TopLevelAndTransitive()
|
16
|
+
{
|
17
|
+
await TestDiscoverAsync(
|
18
|
+
packages:
|
19
|
+
[
|
20
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
|
21
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
|
22
|
+
],
|
23
|
+
startingDirectory: "src",
|
24
|
+
projectPath: "src/library.csproj",
|
25
|
+
files:
|
26
|
+
[
|
27
|
+
("src/library.csproj", """
|
28
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
29
|
+
<PropertyGroup>
|
30
|
+
<TargetFramework>net8.0</TargetFramework>
|
31
|
+
</PropertyGroup>
|
32
|
+
<ItemGroup>
|
33
|
+
<PackageReference Include="Top.Level.Package" Version="1.2.3" />
|
34
|
+
</ItemGroup>
|
35
|
+
</Project>
|
36
|
+
""")
|
37
|
+
],
|
38
|
+
expectedProjects:
|
39
|
+
[
|
40
|
+
new()
|
41
|
+
{
|
42
|
+
FilePath = "library.csproj",
|
43
|
+
Dependencies =
|
44
|
+
[
|
45
|
+
new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
46
|
+
new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
|
47
|
+
],
|
48
|
+
ImportedFiles = [],
|
49
|
+
Properties =
|
50
|
+
[
|
51
|
+
new("TargetFramework", "net8.0", "src/library.csproj"),
|
52
|
+
],
|
53
|
+
TargetFrameworks = ["net8.0"],
|
54
|
+
ReferencedProjectPaths = [],
|
55
|
+
AdditionalFiles = [],
|
56
|
+
}
|
57
|
+
]
|
58
|
+
);
|
59
|
+
}
|
60
|
+
|
61
|
+
[Fact]
|
62
|
+
public async Task DiscoveryInSingleProject_PackageAddedInTargetsFile()
|
63
|
+
{
|
64
|
+
await TestDiscoverAsync(
|
65
|
+
packages:
|
66
|
+
[
|
67
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
|
68
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
|
69
|
+
],
|
70
|
+
startingDirectory: "src",
|
71
|
+
projectPath: "src/library.csproj",
|
72
|
+
files:
|
73
|
+
[
|
74
|
+
("src/library.csproj", """
|
75
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
76
|
+
<PropertyGroup>
|
77
|
+
<TargetFramework>net8.0</TargetFramework>
|
78
|
+
</PropertyGroup>
|
79
|
+
</Project>
|
80
|
+
"""),
|
81
|
+
("Directory.Build.targets", """
|
82
|
+
<Project>
|
83
|
+
<ItemGroup>
|
84
|
+
<PackageReference Include="Top.Level.Package" Version="1.2.3" />
|
85
|
+
</ItemGroup>
|
86
|
+
</Project>
|
87
|
+
""")
|
88
|
+
],
|
89
|
+
expectedProjects:
|
90
|
+
[
|
91
|
+
new()
|
92
|
+
{
|
93
|
+
FilePath = "library.csproj",
|
94
|
+
Dependencies =
|
95
|
+
[
|
96
|
+
// dependencies come from `Directory.Build.targets`, but it's through the evaluation of `src/library.csproj` that it's found
|
97
|
+
new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
98
|
+
new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
|
99
|
+
],
|
100
|
+
Properties =
|
101
|
+
[
|
102
|
+
new("TargetFramework", "net8.0", "src/library.csproj"),
|
103
|
+
],
|
104
|
+
TargetFrameworks = ["net8.0"],
|
105
|
+
ReferencedProjectPaths = [],
|
106
|
+
ImportedFiles = [
|
107
|
+
"../Directory.Build.targets"
|
108
|
+
],
|
109
|
+
AdditionalFiles = [],
|
110
|
+
}
|
111
|
+
]
|
112
|
+
);
|
113
|
+
}
|
114
|
+
|
115
|
+
[Fact]
|
116
|
+
public async Task DiscoveryThroughProjectReference()
|
117
|
+
{
|
118
|
+
await TestDiscoverAsync(
|
119
|
+
packages:
|
120
|
+
[
|
121
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0"),
|
122
|
+
MockNuGetPackage.CreateSimplePackage("Dependency.From.Other.Project", "4.5.6", "net8.0"),
|
123
|
+
],
|
124
|
+
startingDirectory: "src/library1",
|
125
|
+
projectPath: "src/library1/library1.csproj",
|
126
|
+
files:
|
127
|
+
[
|
128
|
+
("src/library1/library1.csproj", """
|
129
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
130
|
+
<PropertyGroup>
|
131
|
+
<TargetFramework>net8.0</TargetFramework>
|
132
|
+
</PropertyGroup>
|
133
|
+
<ItemGroup>
|
134
|
+
<ProjectReference Include="../library2/library2.csproj" />
|
135
|
+
</ItemGroup>
|
136
|
+
<ItemGroup>
|
137
|
+
<PackageReference Include="Top.Level.Package" Version="1.2.3" />
|
138
|
+
</ItemGroup>
|
139
|
+
</Project>
|
140
|
+
"""),
|
141
|
+
("src/library2/library2.csproj", """
|
142
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
143
|
+
<PropertyGroup>
|
144
|
+
<TargetFramework>net8.0</TargetFramework>
|
145
|
+
</PropertyGroup>
|
146
|
+
<ItemGroup>
|
147
|
+
<PackageReference Include="Dependency.From.Other.Project" Version="4.5.6" />
|
148
|
+
</ItemGroup>
|
149
|
+
</Project>
|
150
|
+
"""),
|
151
|
+
],
|
152
|
+
expectedProjects:
|
153
|
+
[
|
154
|
+
new()
|
155
|
+
{
|
156
|
+
FilePath = "library1.csproj",
|
157
|
+
Dependencies =
|
158
|
+
[
|
159
|
+
new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
160
|
+
new("Dependency.From.Other.Project", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
|
161
|
+
],
|
162
|
+
ImportedFiles = [],
|
163
|
+
ReferencedProjectPaths = [
|
164
|
+
"../library2/library2.csproj"
|
165
|
+
],
|
166
|
+
Properties =
|
167
|
+
[
|
168
|
+
new("TargetFramework", "net8.0", "src/library1/library1.csproj"),
|
169
|
+
],
|
170
|
+
TargetFrameworks = ["net8.0"],
|
171
|
+
AdditionalFiles = [],
|
172
|
+
},
|
173
|
+
new()
|
174
|
+
{
|
175
|
+
FilePath = "../library2/library2.csproj",
|
176
|
+
Dependencies =
|
177
|
+
[
|
178
|
+
new("Dependency.From.Other.Project", "4.5.6", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true)
|
179
|
+
],
|
180
|
+
Properties =
|
181
|
+
[
|
182
|
+
new("TargetFramework", "net8.0", "src/library2/library2.csproj"),
|
183
|
+
],
|
184
|
+
TargetFrameworks = ["net8.0"],
|
185
|
+
ReferencedProjectPaths = [],
|
186
|
+
ImportedFiles = [],
|
187
|
+
AdditionalFiles = [],
|
188
|
+
}
|
189
|
+
]
|
190
|
+
);
|
191
|
+
}
|
192
|
+
|
193
|
+
[Fact]
|
194
|
+
public async Task DiscoveryThroughProjectReferenceThroughTransitiveDependency()
|
195
|
+
{
|
196
|
+
await TestDiscoverAsync(
|
197
|
+
packages:
|
198
|
+
[
|
199
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.2.3", "net8.0", [("net8.0", [("Transitive.Dependency", "4.5.6")])]),
|
200
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Dependency", "4.5.6", "net8.0"),
|
201
|
+
],
|
202
|
+
startingDirectory: "src/library1",
|
203
|
+
projectPath: "src/library1/library1.csproj",
|
204
|
+
files:
|
205
|
+
[
|
206
|
+
("src/library1/library1.csproj", """
|
207
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
208
|
+
<PropertyGroup>
|
209
|
+
<TargetFramework>net8.0</TargetFramework>
|
210
|
+
</PropertyGroup>
|
211
|
+
<ItemGroup>
|
212
|
+
<ProjectReference Include="../library2/library2.csproj" />
|
213
|
+
</ItemGroup>
|
214
|
+
</Project>
|
215
|
+
"""),
|
216
|
+
("src/library2/library2.csproj", """
|
217
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
218
|
+
<PropertyGroup>
|
219
|
+
<TargetFramework>net8.0</TargetFramework>
|
220
|
+
</PropertyGroup>
|
221
|
+
<ItemGroup>
|
222
|
+
<PackageReference Include="Top.Level.Package" Version="1.2.3" />
|
223
|
+
</ItemGroup>
|
224
|
+
</Project>
|
225
|
+
"""),
|
226
|
+
],
|
227
|
+
expectedProjects:
|
228
|
+
[
|
229
|
+
new()
|
230
|
+
{
|
231
|
+
FilePath = "library1.csproj",
|
232
|
+
Dependencies =
|
233
|
+
[
|
234
|
+
// these are all transitive through the ProjectReference
|
235
|
+
new("Top.Level.Package", "1.2.3", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true),
|
236
|
+
new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
|
237
|
+
],
|
238
|
+
ImportedFiles = [],
|
239
|
+
ReferencedProjectPaths = [
|
240
|
+
"../library2/library2.csproj",
|
241
|
+
],
|
242
|
+
Properties =
|
243
|
+
[
|
244
|
+
new("TargetFramework", "net8.0", "src/library1/library1.csproj"),
|
245
|
+
],
|
246
|
+
TargetFrameworks = ["net8.0"],
|
247
|
+
AdditionalFiles = [],
|
248
|
+
},
|
249
|
+
new()
|
250
|
+
{
|
251
|
+
FilePath = "../library2/library2.csproj",
|
252
|
+
Dependencies =
|
253
|
+
[
|
254
|
+
new("Top.Level.Package", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
255
|
+
new("Transitive.Dependency", "4.5.6", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true)
|
256
|
+
],
|
257
|
+
ImportedFiles = [],
|
258
|
+
Properties =
|
259
|
+
[
|
260
|
+
new("TargetFramework", "net8.0", "src/library2/library2.csproj"),
|
261
|
+
],
|
262
|
+
TargetFrameworks = ["net8.0"],
|
263
|
+
ReferencedProjectPaths = [],
|
264
|
+
AdditionalFiles = [],
|
265
|
+
}
|
266
|
+
]
|
267
|
+
);
|
268
|
+
}
|
269
|
+
|
270
|
+
[Fact]
|
271
|
+
public async Task DiscoverWithMultipleTargetFrameworks()
|
272
|
+
{
|
273
|
+
await TestDiscoverAsync(
|
274
|
+
packages:
|
275
|
+
[
|
276
|
+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "net7.0"),
|
277
|
+
],
|
278
|
+
startingDirectory: "src",
|
279
|
+
projectPath: "src/library.csproj",
|
280
|
+
files:
|
281
|
+
[
|
282
|
+
("src/library.csproj", """
|
283
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
284
|
+
<PropertyGroup>
|
285
|
+
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
286
|
+
</PropertyGroup>
|
287
|
+
<ItemGroup>
|
288
|
+
<PackageReference Include="Some.Dependency" Version="1.2.3" />
|
289
|
+
</ItemGroup>
|
290
|
+
</Project>
|
291
|
+
"""),
|
292
|
+
],
|
293
|
+
expectedProjects:
|
294
|
+
[
|
295
|
+
new()
|
296
|
+
{
|
297
|
+
FilePath = "library.csproj",
|
298
|
+
Dependencies =
|
299
|
+
[
|
300
|
+
new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net7.0"], IsDirect: true),
|
301
|
+
new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
302
|
+
],
|
303
|
+
ImportedFiles = [],
|
304
|
+
Properties =
|
305
|
+
[
|
306
|
+
new("TargetFrameworks", "net7.0;net8.0", "src/library.csproj"),
|
307
|
+
],
|
308
|
+
TargetFrameworks = ["net7.0", "net8.0"],
|
309
|
+
ReferencedProjectPaths = [],
|
310
|
+
AdditionalFiles = [],
|
311
|
+
},
|
312
|
+
]
|
313
|
+
);
|
314
|
+
}
|
315
|
+
|
316
|
+
[Fact]
|
317
|
+
public async Task DiscoveryIgnoresNetStandardLibrary()
|
318
|
+
{
|
319
|
+
await TestDiscoverAsync(
|
320
|
+
packages:
|
321
|
+
[
|
322
|
+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
|
323
|
+
],
|
324
|
+
startingDirectory: "src",
|
325
|
+
projectPath: "src/library.csproj",
|
326
|
+
files:
|
327
|
+
[
|
328
|
+
("src/library.csproj", """
|
329
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
330
|
+
<PropertyGroup>
|
331
|
+
<TargetFramework>netstandard2.0</TargetFramework>
|
332
|
+
</PropertyGroup>
|
333
|
+
<ItemGroup>
|
334
|
+
<PackageReference Include="Some.Dependency" Version="1.2.3" />
|
335
|
+
</ItemGroup>
|
336
|
+
</Project>
|
337
|
+
"""),
|
338
|
+
],
|
339
|
+
expectedProjects:
|
340
|
+
[
|
341
|
+
new()
|
342
|
+
{
|
343
|
+
FilePath = "library.csproj",
|
344
|
+
Dependencies =
|
345
|
+
[
|
346
|
+
new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["netstandard2.0"], IsDirect: true),
|
347
|
+
],
|
348
|
+
ImportedFiles = [],
|
349
|
+
Properties =
|
350
|
+
[
|
351
|
+
new("TargetFramework", "netstandard2.0", "src/library.csproj"),
|
352
|
+
],
|
353
|
+
TargetFrameworks = ["netstandard2.0"],
|
354
|
+
ReferencedProjectPaths = [],
|
355
|
+
AdditionalFiles = [],
|
356
|
+
},
|
357
|
+
]
|
358
|
+
);
|
359
|
+
}
|
360
|
+
|
361
|
+
[Fact]
|
362
|
+
public async Task GlobalPackages()
|
363
|
+
{
|
364
|
+
await TestDiscoverAsync(
|
365
|
+
packages:
|
366
|
+
[
|
367
|
+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
|
368
|
+
],
|
369
|
+
startingDirectory: "src",
|
370
|
+
projectPath: "src/library.csproj",
|
371
|
+
files:
|
372
|
+
[
|
373
|
+
("src/library.csproj", """
|
374
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
375
|
+
<PropertyGroup>
|
376
|
+
<TargetFramework>net8.0</TargetFramework>
|
377
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
378
|
+
</PropertyGroup>
|
379
|
+
</Project>
|
380
|
+
"""),
|
381
|
+
("src/Directory.Build.props", """
|
382
|
+
<Project>
|
383
|
+
<ItemGroup>
|
384
|
+
<GlobalPackageReference Include="Some.Dependency" Version="1.2.3" />
|
385
|
+
</ItemGroup>
|
386
|
+
</Project>
|
387
|
+
""")
|
388
|
+
],
|
389
|
+
expectedProjects:
|
390
|
+
[
|
391
|
+
new()
|
392
|
+
{
|
393
|
+
FilePath = "library.csproj",
|
394
|
+
Dependencies =
|
395
|
+
[
|
396
|
+
new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
397
|
+
],
|
398
|
+
ImportedFiles =
|
399
|
+
[
|
400
|
+
"Directory.Build.props",
|
401
|
+
],
|
402
|
+
Properties =
|
403
|
+
[
|
404
|
+
new("ManagePackageVersionsCentrally", "true", "src/library.csproj"),
|
405
|
+
new("TargetFramework", "net8.0", "src/library.csproj"),
|
406
|
+
],
|
407
|
+
TargetFrameworks = ["net8.0"],
|
408
|
+
ReferencedProjectPaths = [],
|
409
|
+
AdditionalFiles = [],
|
410
|
+
},
|
411
|
+
]
|
412
|
+
);
|
413
|
+
}
|
414
|
+
|
415
|
+
[Fact]
|
416
|
+
public async Task CentralPackageManagementAlternatePackagesPropsLocation()
|
417
|
+
{
|
418
|
+
// when using central package management, the well-known file `Directory.Packages.props` can be overridden with
|
419
|
+
// the `$(DirectoryPackagesPropsPath)` property
|
420
|
+
await TestDiscoverAsync(
|
421
|
+
packages:
|
422
|
+
[
|
423
|
+
MockNuGetPackage.CreateSimplePackage("Some.Dependency", "1.2.3", "netstandard2.0"),
|
424
|
+
],
|
425
|
+
startingDirectory: "src",
|
426
|
+
projectPath: "src/library.csproj",
|
427
|
+
files:
|
428
|
+
[
|
429
|
+
("src/library.csproj", """
|
430
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
431
|
+
<PropertyGroup>
|
432
|
+
<TargetFramework>net8.0</TargetFramework>
|
433
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
434
|
+
</PropertyGroup>
|
435
|
+
<ItemGroup>
|
436
|
+
<PackageReference Include="Some.Dependency" />
|
437
|
+
</ItemGroup>
|
438
|
+
</Project>
|
439
|
+
"""),
|
440
|
+
("src/Directory.Build.props", """
|
441
|
+
<Project>
|
442
|
+
<PropertyGroup>
|
443
|
+
<DirectoryPackagesPropsPath>$(MSBuildThisFileDirectory)..\NonStandardPackages.props</DirectoryPackagesPropsPath>
|
444
|
+
</PropertyGroup>
|
445
|
+
</Project>
|
446
|
+
"""),
|
447
|
+
("NonStandardPackages.props", """
|
448
|
+
<Project>
|
449
|
+
<ItemGroup>
|
450
|
+
<PackageVersion Include="Some.Dependency" Version="1.2.3" />
|
451
|
+
</ItemGroup>
|
452
|
+
</Project>
|
453
|
+
""")
|
454
|
+
],
|
455
|
+
expectedProjects:
|
456
|
+
[
|
457
|
+
new()
|
458
|
+
{
|
459
|
+
FilePath = "library.csproj",
|
460
|
+
Dependencies =
|
461
|
+
[
|
462
|
+
new("Some.Dependency", "1.2.3", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
463
|
+
],
|
464
|
+
ImportedFiles =
|
465
|
+
[
|
466
|
+
"../NonStandardPackages.props",
|
467
|
+
"Directory.Build.props",
|
468
|
+
],
|
469
|
+
Properties =
|
470
|
+
[
|
471
|
+
new("ManagePackageVersionsCentrally", "true", "src/library.csproj"),
|
472
|
+
new("TargetFramework", "net8.0", "src/library.csproj"),
|
473
|
+
],
|
474
|
+
TargetFrameworks = ["net8.0"],
|
475
|
+
ReferencedProjectPaths = [],
|
476
|
+
AdditionalFiles = [],
|
477
|
+
},
|
478
|
+
]
|
479
|
+
);
|
480
|
+
}
|
481
|
+
|
482
|
+
private static async Task TestDiscoverAsync(string startingDirectory, string projectPath, TestFile[] files, ImmutableArray<ExpectedSdkProjectDiscoveryResult> expectedProjects, MockNuGetPackage[]? packages = null)
|
483
|
+
{
|
484
|
+
using var testDirectory = await TemporaryDirectory.CreateWithContentsAsync(files);
|
485
|
+
|
486
|
+
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, testDirectory.DirectoryPath);
|
487
|
+
|
488
|
+
var logger = new TestLogger();
|
489
|
+
var fullProjectPath = Path.Combine(testDirectory.DirectoryPath, projectPath);
|
490
|
+
var experimentsManager = new ExperimentsManager() { UseDirectDiscovery = true }; // the following method is direct discovery; this just makes the call to Validate... happy
|
491
|
+
var projectDiscovery = await SdkProjectDiscovery.DiscoverWithBinLogAsync(testDirectory.DirectoryPath, Path.GetDirectoryName(fullProjectPath)!, fullProjectPath, logger);
|
492
|
+
ValidateProjectResults(expectedProjects, projectDiscovery, experimentsManager);
|
493
|
+
}
|
494
|
+
}
|
@@ -291,9 +291,12 @@ namespace NuGetUpdater.Core.Test
|
|
291
291
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
292
292
|
<!-- this is a simplified version of this package used for testing -->
|
293
293
|
<PropertyGroup>
|
294
|
-
|
294
|
+
<CentralPackagesFile Condition=" '$(CentralPackagesFile)' == '' ">$([MSBuild]::GetPathOfFileAbove('Packages.props', $(MSBuildProjectDirectory)))</CentralPackagesFile>
|
295
295
|
</PropertyGroup>
|
296
296
|
<Import Project="$(CentralPackagesFile)" Condition="Exists('$(CentralPackagesFile)')" />
|
297
|
+
<ItemGroup Condition=" '$(EnableGlobalPackageReferences)' != 'false' ">
|
298
|
+
<PackageReference Include="@(GlobalPackageReference)" Condition=" '$(EnableGlobalPackageReferences)' != 'false' " />
|
299
|
+
</ItemGroup>
|
297
300
|
</Project>
|
298
301
|
"""
|
299
302
|
);
|
@@ -384,6 +387,47 @@ namespace NuGetUpdater.Core.Test
|
|
384
387
|
return WellKnownPackages[key];
|
385
388
|
}
|
386
389
|
|
390
|
+
public static MockNuGetPackage WellKnownHostPackage(string packageName, string targetFramework, (string Path, byte[] Content)[]? files = null)
|
391
|
+
{
|
392
|
+
string key = $"{packageName}/{targetFramework}";
|
393
|
+
if (!WellKnownPackages.ContainsKey(key))
|
394
|
+
{
|
395
|
+
// for the current SDK, the file `Microsoft.NETCoreSdk.BundledVersions.props` contains the version of the
|
396
|
+
// `Microsoft.WindowsDesktop.App.Ref` package that will be needed to build, so we find it by TFM
|
397
|
+
XDocument propsDocument = XDocument.Load(BundledVersionsPropsPath.Value);
|
398
|
+
XElement? ridElement = propsDocument.XPathSelectElement("/Project/PropertyGroup/NETCoreSdkRuntimeIdentifier");
|
399
|
+
if (ridElement is null)
|
400
|
+
{
|
401
|
+
throw new Exception($"Unable to find RID property.");
|
402
|
+
}
|
403
|
+
|
404
|
+
string expectedRid = ridElement.Value.Trim();
|
405
|
+
|
406
|
+
XElement? matchingAppHostPack = propsDocument.XPathSelectElement(
|
407
|
+
$"""
|
408
|
+
/Project/ItemGroup/KnownAppHostPack
|
409
|
+
[
|
410
|
+
@Include='{packageName}' and
|
411
|
+
@AppHostPackNamePattern='{packageName}.Host.**RID**' and
|
412
|
+
@TargetFramework='{targetFramework}'
|
413
|
+
]
|
414
|
+
""");
|
415
|
+
if (matchingAppHostPack is null)
|
416
|
+
{
|
417
|
+
throw new Exception($"Unable to find {packageName}.Host.**RID** version for target framework '{targetFramework}'");
|
418
|
+
}
|
419
|
+
|
420
|
+
string expectedVersion = matchingAppHostPack.Attribute("AppHostPackVersion")!.Value;
|
421
|
+
return new(
|
422
|
+
$"{packageName}.Host.{expectedRid}",
|
423
|
+
expectedVersion,
|
424
|
+
Files: files
|
425
|
+
);
|
426
|
+
}
|
427
|
+
|
428
|
+
return WellKnownPackages[key];
|
429
|
+
}
|
430
|
+
|
387
431
|
public static MockNuGetPackage[] CommonPackages { get; } =
|
388
432
|
[
|
389
433
|
CreateSimplePackage("NETStandard.Library", "2.0.3", "netstandard2.0"),
|
@@ -424,6 +468,7 @@ namespace NuGetUpdater.Core.Test
|
|
424
468
|
WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net7.0"),
|
425
469
|
WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net8.0"),
|
426
470
|
WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net9.0"),
|
471
|
+
WellKnownHostPackage("Microsoft.NETCore.App", "net8.0"),
|
427
472
|
];
|
428
473
|
}
|
429
474
|
}
|