/// <summary> /// Устанавливает пакет. /// </summary> /// <param name="packageId">ID пакета.</param> /// <param name="packageVersion">Версия пакета.</param> /// <param name="allowPrerelease">Разрешена ли установка предварительного релиза.</param> /// <returns>Содержимое установленного пакета.</returns> public async Task<PackageContent> InstallPackage(string packageId, string packageVersion = null, bool allowPrerelease = false) { NuGetVersion packageNuGetVersion = null; if (!string.IsNullOrWhiteSpace(packageVersion)) { packageNuGetVersion = NuGetVersion.Parse(packageVersion); } // Конфигурационный файл NuGet.config по умолчанию var settings = new NuGet.Configuration.Settings(_packagesPath, "NuGet.config"); // Фабрика источников пактов на основе конфигурационного файла var packageSourceProvider = new PackageSourceProvider(settings); // Добавление в фабрику источников пакетов дополнительных источников packageSourceProvider.SavePackageSources(_packageSources.Select(i => new PackageSource(i))); // Фабрика хранилищ пакетов на основе фабрики источников пакетов var packageRepositoryProvider = new CachingSourceProvider(packageSourceProvider); // Получение всех хранилищ пакетов на основе указанных источников var packageRepositories = packageRepositoryProvider.GetRepositories().ToList(); // Определение возможности установки prerelease-версии пакетов allowPrerelease = allowPrerelease || (packageNuGetVersion != null && packageNuGetVersion.IsPrerelease); // Создание правил разрешения зависимостей при установке пакета var resolutionContext = new ResolutionContext( dependencyBehavior: DependencyBehavior.Lowest, includePrelease: allowPrerelease, includeUnlisted: true, versionConstraints: VersionConstraints.None); // Если версия пакета не указана, поиск последней версии if (packageNuGetVersion == null) { packageNuGetVersion = await NuGetPackageManager.GetLatestVersionAsync( packageId, NuGetFramework.AnyFramework, resolutionContext, packageRepositories, _logger, CancellationToken.None); if (packageNuGetVersion == null) { throw new InvalidOperationException(string.Format(Properties.Resources.PackageNotFound, packageId)); } } // Уникальный идентификатор версии пакета для установки var packageIdentity = new PackageIdentity(packageId, packageNuGetVersion); // Каталог для установки пакетов (каталог packages) NuGetProject folderProject = new InfinniFolderNuGetProject(_packagesPath); // Менеджер для управления пакетами var packageManager = new NuGetPackageManager(packageRepositoryProvider, settings, _packagesPath); // Правила установки пакетов var projectContext = new NuGetLoggerProjectContext(_logger) { PackageExtractionContext = new PackageExtractionContext { PackageSaveMode = PackageSaveMode.Defaultv3 } }; // Определение порядка действий при установке пакета var installActions = (await packageManager.PreviewInstallPackageAsync( folderProject, packageIdentity, resolutionContext, projectContext, packageRepositories, Enumerable.Empty<SourceRepository>(), CancellationToken.None)).ToList(); // Применение действий по установке пакета await packageManager.ExecuteNuGetProjectActionsAsync( folderProject, installActions, projectContext, CancellationToken.None); return GetPackageContent(packageIdentity, installActions.Select(i => i.PackageIdentity).ToList()); }
public async Task TestPacManReinstallPackages() { // Arrange var sourceRepositoryProvider = TestSourceRepositoryUtility.CreateV2OnlySourceRepositoryProvider(); var testSolutionManager = new TestSolutionManager(); var testSettings = new NullSettings(); var token = CancellationToken.None; var nuGetPackageManager = new NuGetPackageManager(sourceRepositoryProvider, testSettings, testSolutionManager); var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(testSolutionManager, testSettings); var packagePathResolver = new PackagePathResolver(packagesFolderPath); var randomPackagesConfigFolderPath = TestFilesystemUtility.CreateRandomTestFolder(); var randomPackagesConfigPath = Path.Combine(randomPackagesConfigFolderPath, "packages.config"); var projectTargetFramework = NuGetFramework.Parse("net45"); var msBuildNuGetProjectSystem = new TestMSBuildNuGetProjectSystem(projectTargetFramework, new TestNuGetProjectContext()); var msBuildNuGetProject = new MSBuildNuGetProject(msBuildNuGetProjectSystem, packagesFolderPath, randomPackagesConfigPath); var folderNuGetProject = msBuildNuGetProject.FolderNuGetProject; var packageIdentity = MorePackageWithDependents[3]; // Microsoft.Net.Http.2.2.22 // Pre-Assert // Check that the packages.config file does not exist Assert.False(File.Exists(randomPackagesConfigPath)); // Check that there are no packages returned by PackagesConfigProject var packagesInPackagesConfig = (await msBuildNuGetProject.PackagesConfigNuGetProject.GetInstalledPackagesAsync(token)).ToList(); Assert.Equal(0, packagesInPackagesConfig.Count); Assert.Equal(0, msBuildNuGetProjectSystem.References.Count); // Act await nuGetPackageManager.InstallPackageAsync(msBuildNuGetProject, packageIdentity, new ResolutionContext(), new TestNuGetProjectContext(), sourceRepositoryProvider.GetRepositories().First(), null, token); // Assert // Check that the packages.config file exists after the installation Assert.True(File.Exists(randomPackagesConfigPath)); // Check the number of packages and packages returned by PackagesConfigProject after the installation packagesInPackagesConfig = (await msBuildNuGetProject.PackagesConfigNuGetProject.GetInstalledPackagesAsync(token)).ToList(); Assert.Equal(3, packagesInPackagesConfig.Count); Assert.Equal(packageIdentity, packagesInPackagesConfig[2].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[2].TargetFramework); Assert.Equal(MorePackageWithDependents[0], packagesInPackagesConfig[1].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[1].TargetFramework); Assert.Equal(MorePackageWithDependents[2], packagesInPackagesConfig[0].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[0].TargetFramework); var installedPackageIdentities = (await msBuildNuGetProject.GetInstalledPackagesAsync(token)) .Select(pr => pr.PackageIdentity); // Act var packageActions = (await nuGetPackageManager.PreviewReinstallPackagesAsync(installedPackageIdentities, msBuildNuGetProject, new ResolutionContext(DependencyBehavior.Highest), new TestNuGetProjectContext(), sourceRepositoryProvider.GetRepositories().First(), null, token)).ToList(); // Assert var singlePackageSource = sourceRepositoryProvider.GetRepositories().Single().PackageSource.Source; Assert.Equal(6, packageActions.Count); Assert.True(MorePackageWithDependents[3].Equals(packageActions[0].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Uninstall, packageActions[0].NuGetProjectActionType); Assert.True(MorePackageWithDependents[2].Equals(packageActions[1].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Uninstall, packageActions[1].NuGetProjectActionType); Assert.True(MorePackageWithDependents[0].Equals(packageActions[2].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Uninstall, packageActions[2].NuGetProjectActionType); Assert.True(MorePackageWithDependents[0].Equals(packageActions[3].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Install, packageActions[3].NuGetProjectActionType); Assert.Equal(singlePackageSource, packageActions[3].SourceRepository.PackageSource.Source); Assert.True(MorePackageWithDependents[2].Equals(packageActions[4].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Install, packageActions[4].NuGetProjectActionType); Assert.Equal(singlePackageSource, packageActions[4].SourceRepository.PackageSource.Source); Assert.True(MorePackageWithDependents[3].Equals(packageActions[5].PackageIdentity)); Assert.Equal(NuGetProjectActionType.Install, packageActions[5].NuGetProjectActionType); Assert.Equal(singlePackageSource, packageActions[5].SourceRepository.PackageSource.Source); // Main Act await nuGetPackageManager.ExecuteNuGetProjectActionsAsync(msBuildNuGetProject, packageActions, new TestNuGetProjectContext(), token); // Check that the packages.config file exists after the installation Assert.True(File.Exists(randomPackagesConfigPath)); // Check the number of packages and packages returned by PackagesConfigProject after the installation packagesInPackagesConfig = (await msBuildNuGetProject.PackagesConfigNuGetProject.GetInstalledPackagesAsync(token)).ToList(); Assert.Equal(3, packagesInPackagesConfig.Count); Assert.Equal(packageIdentity, packagesInPackagesConfig[2].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[2].TargetFramework); Assert.Equal(MorePackageWithDependents[0], packagesInPackagesConfig[1].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[1].TargetFramework); Assert.Equal(MorePackageWithDependents[2], packagesInPackagesConfig[0].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[0].TargetFramework); Assert.True(File.Exists(folderNuGetProject.GetInstalledPackageFilePath(packageIdentity))); Assert.True(File.Exists(folderNuGetProject.GetInstalledPackageFilePath(MorePackageWithDependents[0]))); Assert.True(File.Exists(folderNuGetProject.GetInstalledPackageFilePath(MorePackageWithDependents[2]))); // Clean-up TestFilesystemUtility.DeleteRandomTestFolders(testSolutionManager.SolutionDirectory, randomPackagesConfigFolderPath); }