Использование NuGet.PackageManager, Как получить Установленные пакеты с зависимостями - PullRequest
0 голосов
/ 21 февраля 2019

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

...