Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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.");
        }