Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
            }
        }