public async Task <bool> InstallPackageForProjectAsync(IExtensibleProject project, PackageIdentity package, CancellationToken token, bool showErrors = true) { try { bool dependencyInstallResult = true; var packageConfigProject = _nuGetProjectConfigurationProvider.GetProjectConfig(project); var repositories = SourceContext.CurrentContext.Repositories; var installerResults = await _packageInstallationService.InstallAsync(package, project, repositories, project.IgnoreDependencies, token); if (!installerResults.Result.Any()) { Log.Error($"Failed to install package {package}"); // todo PackageCommandService or context is better place for messaging if (showErrors) { await _messageService.ShowErrorAsync($"Failed to install package {package}.\n{installerResults.ErrorMessage}"); } return(false); } foreach (var packageDownloadResultPair in installerResults.Result) { var dependencyIdentity = packageDownloadResultPair.Key; var downloadResult = packageDownloadResultPair.Value; try { var result = await packageConfigProject.InstallPackageAsync( dependencyIdentity, downloadResult, _nuGetProjectContextProvider.GetProjectContext(FileConflictAction.PromptUser), token); dependencyInstallResult &= result; } catch (InvalidOperationException ex) { Log.Error($"Saving package configuration failed in project {project} when installing package {package}"); Log.Error(ex); dependencyInstallResult &= false; } } await OnInstallAsync(project, package, dependencyInstallResult || project.IgnoreDependencies); return(true); } catch (ProjectInstallException ex) { Log.Error($"Failed to install package {package}"); if (showErrors) { await _messageService.ShowErrorAsync($"Failed to install package {package}.\n{ex.Message}"); } if (ex?.CurrentBatch is null) { return(false); } // Mark all partially-extracted packages to removal; foreach (var canceledPackage in ex.CurrentBatch) { _fileSystemService.CreateDeleteme(canceledPackage.Id, project.GetInstallPath(canceledPackage)); } // throw exception to add exception in operation context throw; } catch (Exception ex) { Log.Error(ex, $"The Installation of package {package} was failed"); throw; } }
public async Task UninstallAsync(PackageIdentity package, IExtensibleProject project, IEnumerable <PackageReference> installedPackageReferences, CancellationToken cancellationToken = default) { List <string> failedEntries = null; ICollection <PackageIdentity> uninstalledPackages; var targetFramework = FrameworkParser.TryParseFrameworkName(project.Framework, _frameworkNameProvider); #if NET5_0_OR_GREATER var reducer = new FrameworkReducer(); var mostSpecific = reducer.ReduceUpwards(project.SupportedPlatforms).FirstOrDefault(); targetFramework = mostSpecific; #endif var projectConfig = _nuGetProjectConfigurationProvider.GetProjectConfig(project); var uninstallationContext = new UninstallationContext(false, false); _nugetLogger.LogInformation($"Uninstall package {package}, Target framework: {targetFramework}"); if (projectConfig is null) { _nugetLogger.LogWarning($"Project {project.Name} doesn't implement any configuration for own packages"); } using (var cacheContext = new SourceCacheContext() { NoCache = false, DirectDownload = false, }) { var dependencyInfoResource = await project.AsSourceRepository(_sourceRepositoryProvider) .GetResourceAsync <DependencyInfoResource>(cancellationToken); var dependencyInfoResourceCollection = new DependencyInfoResourceCollection(dependencyInfoResource); var resolverContext = await ResolveDependenciesAsync(package, targetFramework, PackageIdentity.Comparer, dependencyInfoResourceCollection, cacheContext, project, true, cancellationToken); var packageReferences = installedPackageReferences.ToList(); if (uninstallationContext.RemoveDependencies) { uninstalledPackages = await GetPackagesCanBeUninstalledAsync(resolverContext.AvailablePackages, packageReferences.Select(x => x.PackageIdentity)); } else { uninstalledPackages = new List <PackageIdentity>() { package }; } } try { foreach (var removedPackage in uninstalledPackages) { if (removedPackage.Version is null) { _nugetLogger.LogWarning($"Skip package {removedPackage.Id} uninstall. Check your package.config for references of this packages"); continue; } var folderProject = new FolderNuGetProject(project.ContentPath); if (folderProject.PackageExists(removedPackage)) { _directoryService.ForceDeleteDirectory(_fileService, folderProject.GetInstalledPath(removedPackage), out failedEntries); } if (projectConfig is null) { continue; } var result = await projectConfig.UninstallPackageAsync(removedPackage, _nuGetProjectContextProvider.GetProjectContext(FileConflictAction.PromptUser), cancellationToken); if (!result) { _nugetLogger.LogError($"Saving package configuration failed in project {project} when installing package {package}"); } } } catch (IOException ex) { Log.Error(ex); _nugetLogger.LogError("Package files cannot be complete deleted by unexpected error (may be directory in use by another process?"); } finally { LogHelper.LogUnclearedPaths(failedEntries, Log); } }