display installed packages v1
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Ardalis.GuardClauses;
|
||||
using Microsoft.Build.Evaluation;
|
||||
using NuGet.ProjectModel;
|
||||
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
|
||||
|
||||
namespace SharpIDE.Application.Features.Evaluation;
|
||||
@@ -55,4 +56,73 @@ public static class ProjectEvaluation
|
||||
return Guid.Parse(userSecretsId);
|
||||
}
|
||||
|
||||
public class InstalledPackage
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
public required string RequestedVersion { get; set; }
|
||||
public required string? ResolvedVersion { get; set; }
|
||||
public required string TargetFramework { get; set; }
|
||||
public required bool IsTopLevel { get; set; }
|
||||
public required bool IsAutoReferenced { get; set; }
|
||||
}
|
||||
public static async Task<List<InstalledPackage>> GetPackageReferencesForProject(SharpIdeProjectModel projectModel, bool includeTransitive = true)
|
||||
{
|
||||
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(ProjectEvaluation)}.{nameof(GetPackageReferencesForProject)}");
|
||||
Guard.Against.Null(projectModel, nameof(projectModel));
|
||||
|
||||
var project = _projectCollection.GetLoadedProjects(projectModel.FilePath).Single();
|
||||
|
||||
var assetsPath = project.GetPropertyValue("ProjectAssetsFile");
|
||||
|
||||
if (File.Exists(assetsPath) is false)
|
||||
{
|
||||
throw new FileNotFoundException("Could not find project.assets.json file", assetsPath);
|
||||
}
|
||||
var lockFileFormat = new LockFileFormat();
|
||||
var lockFile = lockFileFormat.Read(assetsPath);
|
||||
var packages = GetPackagesFromAssetsFile(lockFile, includeTransitive);
|
||||
return packages;
|
||||
}
|
||||
|
||||
// ChatGPT Special
|
||||
private static List<InstalledPackage> GetPackagesFromAssetsFile(LockFile assetsFile, bool includeTransitive)
|
||||
{
|
||||
var packages = new List<InstalledPackage>();
|
||||
|
||||
foreach (var target in assetsFile.Targets.Where(t => t.RuntimeIdentifier == null))
|
||||
{
|
||||
var tfm = target.TargetFramework.GetShortFolderName();
|
||||
var tfmInfo = assetsFile.PackageSpec.TargetFrameworks
|
||||
.FirstOrDefault(t => t.FrameworkName.Equals(target.TargetFramework));
|
||||
|
||||
if (tfmInfo == null) continue;
|
||||
|
||||
var topLevelDependencies = tfmInfo.Dependencies
|
||||
.DistinctBy(s => s.Name)
|
||||
.Select(s => s.Name)
|
||||
.ToHashSet();
|
||||
|
||||
foreach (var library in target.Libraries.Where(l => l.Type == "package"))
|
||||
{
|
||||
var isTopLevel = topLevelDependencies.Contains(library.Name);
|
||||
if (!includeTransitive && !isTopLevel) continue;
|
||||
|
||||
var dependency = tfmInfo.Dependencies
|
||||
.FirstOrDefault(d => d.Name.Equals(library.Name, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
packages.Add(new InstalledPackage
|
||||
{
|
||||
Name = library.Name,
|
||||
RequestedVersion = dependency?.LibraryRange.VersionRange?.ToString() ?? "",
|
||||
ResolvedVersion = library.Version?.ToString(),
|
||||
TargetFramework = tfm,
|
||||
IsTopLevel = isTopLevel,
|
||||
IsAutoReferenced = dependency?.AutoReferenced ?? false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return packages;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ using NuGet.Configuration;
|
||||
using NuGet.Packaging.Core;
|
||||
using NuGet.Protocol;
|
||||
using NuGet.Protocol.Core.Types;
|
||||
using NuGet.Versioning;
|
||||
using SharpIDE.Application.Features.Evaluation;
|
||||
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
|
||||
|
||||
namespace SharpIDE.Application.Features.Nuget;
|
||||
@@ -106,4 +108,42 @@ public class NugetClientService
|
||||
metadataList.Reverse();
|
||||
return metadataList;
|
||||
}
|
||||
|
||||
public async Task<List<IdePackageResult>> GetPackagesForInstalledPackages(string directoryPath, List<ProjectEvaluation.InstalledPackage> installedPackages, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var settings = Settings.LoadDefaultSettings(root: directoryPath);
|
||||
var packageSourceProvider = new PackageSourceProvider(settings);
|
||||
var packageSources = packageSourceProvider.LoadPackageSources().Where(p => p.IsEnabled).ToList();
|
||||
|
||||
var packagesResult = new List<IdePackageResult>();
|
||||
foreach (var installedPackage in installedPackages)
|
||||
{
|
||||
var idePackageResult = new IdePackageResult(installedPackage.Name, []);
|
||||
var nugetVersionString = installedPackage.ResolvedVersion ?? installedPackage.RequestedVersion;
|
||||
var nugetVersion = NuGetVersion.Parse(nugetVersionString);
|
||||
var packageIdentity = new PackageIdentity(installedPackage.Name, nugetVersion);
|
||||
|
||||
|
||||
foreach (var source in packageSources)
|
||||
{
|
||||
var repository = Repository.Factory.GetCoreV3(source.Source);
|
||||
var metadataResource = await repository.GetResourceAsync<PackageMetadataResource>(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (metadataResource == null)
|
||||
continue;
|
||||
|
||||
var foundPackage = await metadataResource.GetMetadataAsync(packageIdentity, _sourceCacheContext, _nugetLogger, cancellationToken).ConfigureAwait(false);
|
||||
if (foundPackage != null)
|
||||
{
|
||||
idePackageResult.PackageFromSources.Add(new IdePackageFromSourceResult(foundPackage, source));
|
||||
}
|
||||
}
|
||||
|
||||
if (idePackageResult.PackageFromSources.Count > 0)
|
||||
{
|
||||
packagesResult.Add(idePackageResult);
|
||||
}
|
||||
}
|
||||
return packagesResult;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user