Intro
Использование NuGet.PackageManagement во время выполнения, чтобы позволить пользователям устанавливать пакеты (из частного репо), где пакеты будут загружаться System.Runtime.Loader.AssemblyLoadContext
и выполняться.
В методе установки используются NuGetPackageManager
и NuGetProject
, которые были настроены надлежащим образом из того, что можно понять в NuGet.Client
_nugetProject
- это экземпляр, расширяющий FolderNuGetProject
, в котором хранятся пакеты вуказанная папка и GetInstalledPackagesAsync
возвращает список установленных пакетов вместо пустого списка.
_packageManager
- это NuGetPackageManager
, а _packageRepository
- это SourceRepositoryProvider
, оба являются экземплярами по умолчанию, настроенными с помощьюсоответствующие пути и исходные репозитории.
public async Task InstallPackageAsync(string packageId, SemanticVersion packageVersion, CancellationToken cancellationToken = default)
{
var packageIdentity = new PackageIdentity(packageId, new NuGetVersion(packageVersion.ToNormalizedString()));
using (var sourceCache = new SourceCacheContext()) {
var resolutionContext = new ResolutionContext(
DependencyBehavior.Highest,
includePrelease: true,
includeUnlisted: true,
VersionConstraints.None,
new GatherCache(),
sourceCache);
var projectContext = new EmptyNuGetProjectContext()
{
PackageExtractionContext = new PackageExtractionContext(
PackageSaveMode.Defaultv3,
XmlDocFileSaveMode.Skip,
ClientPolicyContext.GetClientPolicy(_nugetSettings, _nugetLogger),
_nugetLogger),
ActionType = NuGetActionType.Install,
};
var previewActions = await _packageManager.PreviewInstallPackageAsync(
_nugetProject,
packageIdentity,
resolutionContext,
projectContext,
_packageRepository.GetPrimaryRepositories().ToList(),
_packageRepository.GetRepositories().ToList(),
cancellationToken);
// List all actions in debug log.
var debugOutput = new StringBuilder();
debugOutput.AppendLine($"Install actions for {packageId}:");
foreach(var action in previewActions)
debugOutput.AppendLine($" - {action.NuGetProjectActionType}: {action.PackageIdentity}");
_logger.LogDebug(debugOutput.ToString());
await _packageManager.ExecuteNuGetProjectActionsAsync(
_nugetProject,
previewActions,
projectContext,
sourceCache,
cancellationToken);
}
}
Проблема
Цель состоит в том, чтобы получить граф зависимостей для определенного установленного пакета и использовать эту информацию для загрузки сборки и ее требуемых зависимостей.
Сложность не в том, чтобы найти какой-либо соответствующий API, который уже существует, который бы это сделал.Ввиду того, что это очень распространенная задача в Visual Studio, предполагалось, что NuGet предоставит средства для построения графа зависимостей.
Существует await _nugetProject.GetInstalledPackagesAsync(cancellationToken)
Однако при этом возвращается только список PackageReference
с, который содержит только VersionRange
и PackageId
.
Примечание: NuGet.Client послужил справочным материалом для правильного использования API NuGet