/// <summary> /// Marks package as installed. For information proposes only, rollback does not uninstall the package. /// </summary> /// <param name="packageConfiguration">Installed package</param> /// <param name="packageFiles">Installed package files</param> public void TrackInstalledPackage(IPackageConfiguration packageConfiguration, IEnumerable <PackageFileInfo> packageFiles) { var packageInfo = new ProductPackageInfo { Configuration = packageConfiguration }; packageInfo.Files.AddRange(packageFiles); _installedPackages.Add(packageInfo); }
/// <summary> /// Installs provided packages /// </summary> /// <param name="packages">Packages to install</param> /// <param name="options">Additional options</param> /// <returns>Task</returns> public async Task InstallPackages(ICollection <PackageId> packages, InstallationOptions options) { Logger.Info("Installing packages..."); DeploymentContext.RaiseDeploymentEvent(new BeforeMaintenanceEvent()); NuGetEngine.AllowDowngrades = options.AllowDowngrades; NuGetEngine.UpdatePackages = options.UpdatePackages; try { var productPackages = DeploymentContext.ProductConfigurationProvider.GetPackages(); Logger.Info( $"{productPackages.Count} product package(s) found and {packages.Count} new package(s) requested"); var versionedPackages = await PackageDiscoverer.Discover(productPackages, packages); Logger.Info($"Versions are confirmed"); var installationPlan = await PackageDeployer.PlanInstallation(productPackages, versionedPackages); Logger.Info($"{installationPlan.TargetPackageGraph.Count} package(s) are resolved"); Logger.Info($"\t{installationPlan.InstallCount} package(s) to install"); Logger.Info($"\t{installationPlan.UpdateCount} package(s) to update"); var remainingPackages = new List <ProductPackageInfo>(); foreach (var packageId in installationPlan.RemainingPackages) { var info = new ProductPackageInfo(); info.Files.AddRange(DeploymentContext.ProductConfigurationProvider.GetInstalledFiles(packageId, false)); info.Configuration = DeploymentContext.ProductConfigurationProvider.GetPackageConfiguration(packageId); remainingPackages.Add(info); } using (var transaction = TransactionSource.NewTransaction(DeploymentContext)) { foreach (var deploymentAction in installationPlan.Actions) { deploymentAction.Execute(transaction); } var newPackages = transaction.InstalledPackages.Union(remainingPackages).ToList(); if (ReconfiguringPackages(newPackages, installationPlan.TargetPackageGraph)) { transaction.Commit(); } } } catch (Exception e) { Logger.TraceException(e.Message, e); throw; } if (DontCachePackages) { try { Directory.Delete(PackagesFolderPath, true); } catch { Logger.Warn($"Failed to delete packages folder: {PackagesFolderPath}"); } } DeploymentContext.RaiseDeploymentEvent(new AfterMaintenanceEvent()); Logger.Info("Installation complete."); }