Skip to content

Commit ab22d60

Browse files
committed
Reuse the RestoreCommandProvidersCache across all projects
1 parent 89cfa81 commit ab22d60

File tree

1 file changed

+40
-51
lines changed

1 file changed

+40
-51
lines changed

src/PackagesConfigConverter/ProjectConverter.cs

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ internal sealed class ProjectConverter : IProjectConverter
4040
private readonly ISettings _nugetSettings;
4141
private readonly ProjectCollection _projectCollection = new ();
4242
private readonly string _repositoryPath;
43+
private readonly RestoreCommandProvidersCache _restoreCommandProvidersCache;
44+
private readonly RestoreArgs _restoreArgs;
4345

4446
public ProjectConverter(ProjectConverterSettings converterSettings)
4547
: this(converterSettings, GetNuGetSettings(converterSettings))
@@ -60,6 +62,19 @@ public ProjectConverter(ProjectConverterSettings converterSettings, ISettings nu
6062
PackagePathResolver = new PackagePathResolver(_repositoryPath);
6163

6264
VersionFolderPathResolver = new VersionFolderPathResolver(_globalPackagesFolder);
65+
66+
_restoreCommandProvidersCache = new RestoreCommandProvidersCache();
67+
_restoreArgs = new RestoreArgs
68+
{
69+
AllowNoOp = true,
70+
CacheContext = new SourceCacheContext()
71+
{
72+
IgnoreFailedSources = true,
73+
},
74+
CachingSourceProvider = new CachingSourceProvider(new PackageSourceProvider(_nugetSettings)),
75+
GlobalPackagesFolder = _globalPackagesFolder,
76+
Log = NullLogger.Instance,
77+
};
6378
}
6479

6580
public ILogger Log => _converterSettings.Log;
@@ -113,7 +128,8 @@ public void ConvertRepository(CancellationToken cancellationToken)
113128

114129
public void Dispose()
115130
{
116-
_projectCollection?.Dispose();
131+
_projectCollection.Dispose();
132+
_restoreArgs.CacheContext.Dispose();
117133
}
118134

119135
private static ISettings GetNuGetSettings(ProjectConverterSettings converterSettings)
@@ -202,7 +218,14 @@ private bool ConvertProject(string projectPath, string packagesConfigPath)
202218

203219
List<PackageReference> packages = packagesConfigReader.GetPackages(allowDuplicatePackageIds: true).Select(i => new PackageReference(i.PackageIdentity, i.TargetFramework, i.IsUserInstalled, i.IsDevelopmentDependency, i.RequireReinstallation, i.AllowedVersions, PackagePathResolver, VersionFolderPathResolver)).ToList();
204220

205-
DetectMissingTransitiveDependencies(packages, projectPath);
221+
List<NuGetFramework> targetFrameworks = new List<NuGetFramework>
222+
{
223+
FrameworkConstants.CommonFrameworks.Net45,
224+
};
225+
226+
RestoreTargetGraph restoreTargetGraph = GetRestoreTargetGraph(packages, projectPath, targetFrameworks);
227+
228+
DetectMissingTransitiveDependencies(packages, projectPath, restoreTargetGraph);
206229

207230
ProjectRootElement project = ProjectRootElement.Open(projectPath, _projectCollection, preserveFormatting: true);
208231

@@ -236,18 +259,7 @@ private bool ConvertProject(string projectPath, string packagesConfigPath)
236259

237260
if (_converterSettings.TrimPackages)
238261
{
239-
List<NuGetFramework> targetFrameworks = new List<NuGetFramework>
240-
{
241-
FrameworkConstants.CommonFrameworks.Net45,
242-
};
243-
244-
using SourceCacheContext sourceCacheContext = new SourceCacheContext
245-
{
246-
IgnoreFailedSources = true,
247-
};
248-
249-
RestoreTargetGraph packageRestoreGraph = GetRestoreTargetGraph(packages, projectPath, targetFrameworks, sourceCacheContext);
250-
TrimPackages(packages, projectPath, packageRestoreGraph.Flattened);
262+
TrimPackages(packages, projectPath, restoreTargetGraph.Flattened);
251263
}
252264

253265
Log.LogDebug(" Converted package references:");
@@ -281,37 +293,22 @@ private bool ConvertProject(string projectPath, string packagesConfigPath)
281293
return true;
282294
}
283295

284-
private void DetectMissingTransitiveDependencies(List<PackageReference> packages, string projectPath)
296+
private void DetectMissingTransitiveDependencies(List<PackageReference> packages, string projectPath, RestoreTargetGraph restoreTargetGraph)
285297
{
286-
List<NuGetFramework> targetFrameworks = new List<NuGetFramework>
298+
IEnumerable<GraphItem<RemoteResolveResult>> flatPackageDependencies = restoreTargetGraph.Flattened.Where(i => i.Key.Type == LibraryType.Package);
299+
foreach (GraphItem<RemoteResolveResult> packageDependency in flatPackageDependencies)
287300
{
288-
FrameworkConstants.CommonFrameworks.Net45,
289-
};
290-
291-
using SourceCacheContext sourceCacheContext = new SourceCacheContext
292-
{
293-
IgnoreFailedSources = true,
294-
};
301+
(LibraryIdentity library, _) = (packageDependency.Key, packageDependency.Data);
302+
PackageReference packageReference = packages.FirstOrDefault(i => i.PackageId.Equals(library.Name, StringComparison.OrdinalIgnoreCase));
295303

296-
RestoreTargetGraph restoreTargetGraph = GetRestoreTargetGraph(packages, projectPath, targetFrameworks, sourceCacheContext);
297-
298-
if (restoreTargetGraph != null)
299-
{
300-
IEnumerable<GraphItem<RemoteResolveResult>> flatPackageDependencies = restoreTargetGraph.Flattened.Where(i => i.Key.Type == LibraryType.Package);
301-
foreach (GraphItem<RemoteResolveResult> packageDependency in flatPackageDependencies)
304+
if (packageReference == null)
302305
{
303-
(LibraryIdentity library, _) = (packageDependency.Key, packageDependency.Data);
304-
PackageReference packageReference = packages.FirstOrDefault(i => i.PackageId.Equals(library.Name, StringComparison.OrdinalIgnoreCase));
306+
Log.LogWarning($"{projectPath}: The transitive package dependency \"{library.Name} {library.Version}\" was not in the packages.config. After converting to PackageReference, new dependencies will be pulled in transitively which could lead to restore or build errors");
305307

306-
if (packageReference == null)
308+
packages.Add(new PackageReference(new PackageIdentity(library.Name, library.Version), NuGetFramework.AnyFramework, true, false, true, new VersionRange(library.Version), PackagePathResolver, VersionFolderPathResolver)
307309
{
308-
Log.LogWarning($"{projectPath}: The transitive package dependency \"{library.Name} {library.Version}\" was not in the packages.config. After converting to PackageReference, new dependencies will be pulled in transitively which could lead to restore or build errors");
309-
310-
packages.Add(new PackageReference(new PackageIdentity(library.Name, library.Version), NuGetFramework.AnyFramework, true, false, true, new VersionRange(library.Version), PackagePathResolver, VersionFolderPathResolver)
311-
{
312-
IsMissingTransitiveDependency = true,
313-
});
314-
}
310+
IsMissingTransitiveDependency = true,
311+
});
315312
}
316313
}
317314
}
@@ -366,7 +363,7 @@ private Match GetElementMatch(ElementPath elementPath, PackageReference package)
366363
return match;
367364
}
368365

369-
private RestoreTargetGraph GetRestoreTargetGraph(List<PackageReference> packages, string projectPath, List<NuGetFramework> targetFrameworks, SourceCacheContext sourceCacheContext)
366+
private RestoreTargetGraph GetRestoreTargetGraph(List<PackageReference> packages, string projectPath, List<NuGetFramework> targetFrameworks)
370367
{
371368
// The package spec details what packages to restore
372369
PackageSpec packageSpec = new PackageSpec(targetFrameworks.Select(i => new TargetFrameworkInformation
@@ -401,21 +398,13 @@ private RestoreTargetGraph GetRestoreTargetGraph(List<PackageReference> packages
401398

402399
dependencyGraphSpec.AddRestore(packageSpec.RestoreMetadata.ProjectUniqueName);
403400

404-
IPreLoadedRestoreRequestProvider requestProvider = new DependencyGraphSpecRequestProvider(new RestoreCommandProvidersCache(), dependencyGraphSpec);
405-
406-
RestoreArgs restoreArgs = new RestoreArgs
407-
{
408-
AllowNoOp = true,
409-
CacheContext = sourceCacheContext,
410-
CachingSourceProvider = new CachingSourceProvider(new PackageSourceProvider(_nugetSettings)),
411-
Log = NullLogger.Instance,
412-
};
401+
IPreLoadedRestoreRequestProvider requestProvider = new DependencyGraphSpecRequestProvider(_restoreCommandProvidersCache, dependencyGraphSpec);
413402

414403
// Create requests from the arguments
415-
IReadOnlyList<RestoreSummaryRequest> requests = requestProvider.CreateRequests(restoreArgs).Result;
404+
IReadOnlyList<RestoreSummaryRequest> requests = requestProvider.CreateRequests(_restoreArgs).Result;
416405

417406
// Restore the package without generating extra files
418-
RestoreResultPair restoreResult = RestoreRunner.RunWithoutCommit(requests, restoreArgs).Result.FirstOrDefault();
407+
RestoreResultPair restoreResult = RestoreRunner.RunWithoutCommit(requests, _restoreArgs).Result.FirstOrDefault();
419408

420409
RestoreTargetGraph restoreTargetGraph = restoreResult?.Result.RestoreGraphs.FirstOrDefault();
421410
return restoreTargetGraph;

0 commit comments

Comments
 (0)