/// <summary> /// Creates a repo provider for the given sources. If null is passed all sources will be returned. /// </summary> private ISourceRepositoryProvider GetSources(IEnumerable <string> sources) { PreinstalledRepositoryProvider provider = new PreinstalledRepositoryProvider(ErrorHandler, _sourceRepositoryProvider); IPackageSourceProvider sourceProvider = new PackageSourceProvider(_settings); PackageSource[] packageSources = sourceProvider.LoadPackageSources().ToArray(); // add everything enabled if null if (sources == null) { foreach (var packageSource in packageSources) { if (packageSource.IsEnabled) { foreach (string source in sources) { provider.AddFromSource(GetSource(source)); } } } } else { // TODO: disallow disabled sources even if they were provided by the caller? foreach (string source in sources) { provider.AddFromSource(GetSource(source)); } } return(provider); }
/// <summary> /// Creates a repo provider for the given sources. If null is passed all sources will be returned. /// </summary> private ISourceRepositoryProvider GetSources(IEnumerable <string> sources) { ISourceRepositoryProvider provider = null; // add everything enabled if null if (sources == null) { // Use the default set of sources provider = _sourceRepositoryProvider; } else { // Create a custom source provider for the VS API install var customProvider = new PreinstalledRepositoryProvider(ErrorHandler, _sourceRepositoryProvider); // Create sources using the given set of sources foreach (string source in sources) { customProvider.AddFromSource(GetSource(source)); } provider = customProvider; } return(provider); }
/// <summary> /// Installs one or more packages into the specified project. /// </summary> /// <param name="packageInstaller">The package installer service that performs the actual package installation.</param> /// <param name="project">The target project for installation.</param> /// <param name="configuration"> /// The packages to install, where to install them from, and additional options for /// their installation. /// </param> /// <param name="repositorySettings">The repository settings for the packages being installed.</param> /// <param name="warningHandler"> /// An action that accepts a warning message and presents it to the user, allowing /// execution to continue. /// </param> /// <param name="errorHandler"> /// An action that accepts an error message and presents it to the user, allowing /// execution to continue. /// </param> internal async Task PerformPackageInstallAsync( IVsPackageInstaller packageInstaller, EnvDTE.Project project, PreinstalledPackageConfiguration configuration, Action <string> warningHandler, Action <string> errorHandler) { ThreadHelper.ThrowIfNotOnUIThread(); string repositoryPath = configuration.RepositoryPath; var repositorySource = new Configuration.PackageSource(repositoryPath); var failedPackageErrors = new List <string>(); // find the project var defaultProjectContext = new VSAPIProjectContext(); var nuGetProject = await _solutionManager.GetOrCreateProjectAsync(project, defaultProjectContext); // For BuildIntegratedNuGetProject, nuget will ignore preunzipped configuration. var buildIntegratedProject = nuGetProject as BuildIntegratedNuGetProject; var repository = (buildIntegratedProject == null && configuration.IsPreunzipped) ? _sourceProvider.CreateRepository(repositorySource, FeedType.FileSystemUnzipped) : _sourceProvider.CreateRepository(repositorySource); var repoProvider = new PreinstalledRepositoryProvider(errorHandler, _sourceProvider); repoProvider.AddFromSource(repository); var packageManager = _installer.CreatePackageManager(repoProvider); var gatherCache = new GatherCache(); var sources = repoProvider.GetRepositories().ToList(); // store expanded node state var expandedNodes = await VsHierarchyUtility.GetAllExpandedNodesAsync(_solutionManager); try { foreach (var package in configuration.Packages) { var packageIdentity = new PackageIdentity(package.Id, package.Version); // Does the project already have this package installed? if (_packageServices.IsPackageInstalled(project, package.Id)) { // If so, is it the right version? if (!_packageServices.IsPackageInstalledEx(project, package.Id, package.Version.ToNormalizedString())) { // No? Raise a warning (likely written to the Output window) and ignore this package. warningHandler(String.Format(VsResources.PreinstalledPackages_VersionConflict, package.Id, package.Version)); } // Yes? Just silently ignore this package! } else { try { if (InfoHandler != null) { InfoHandler(String.Format(CultureInfo.CurrentCulture, VsResources.PreinstalledPackages_PackageInstallStatus, package.Id, package.Version)); } // Skip assembly references and disable binding redirections should be done together bool disableBindingRedirects = package.SkipAssemblyReferences; var projectContext = new VSAPIProjectContext(package.SkipAssemblyReferences, disableBindingRedirects); // Old templates have hardcoded non-normalized paths projectContext.PackageExtractionContext.UseLegacyPackageInstallPath = true; // This runs from the UI thread await _installer.InstallInternalCoreAsync( packageManager, gatherCache, nuGetProject, packageIdentity, sources, projectContext, includePrerelease : false, ignoreDependencies : package.IgnoreDependencies, token : CancellationToken.None); } catch (InvalidOperationException exception) { failedPackageErrors.Add(package.Id + "." + package.Version + " : " + exception.Message); } catch (AggregateException aggregateEx) { var ex = aggregateEx.Flatten().InnerExceptions.FirstOrDefault(); if (ex is InvalidOperationException) { failedPackageErrors.Add(package.Id + "." + package.Version + " : " + ex.Message); } else { throw; } } } } if (failedPackageErrors.Any()) { var errorString = new StringBuilder(); errorString.AppendFormat(VsResources.PreinstalledPackages_FailedToInstallPackage, repositoryPath); errorString.AppendLine(); errorString.AppendLine(); errorString.Append(String.Join(Environment.NewLine, failedPackageErrors)); errorHandler(errorString.ToString()); } // RepositorySettings = null in unit tests if (EnvDTEProjectInfoUtility.IsWebSite(project)) { CreateRefreshFilesInBin( project, repositoryPath, configuration.Packages.Where(p => p.SkipAssemblyReferences)); CopyNativeBinariesToBin(project, repositoryPath, configuration.Packages); } } finally { // collapse nodes await VsHierarchyUtility.CollapseAllNodesAsync(_solutionManager, expandedNodes); } }
/// <summary> /// Creates a repo provider for the given sources. If null is passed all sources will be returned. /// </summary> private ISourceRepositoryProvider GetSources(IEnumerable<string> sources) { PreinstalledRepositoryProvider provider = new PreinstalledRepositoryProvider(ErrorHandler, _sourceRepositoryProvider); IPackageSourceProvider sourceProvider = new PackageSourceProvider(_settings); PackageSource[] packageSources = sourceProvider.LoadPackageSources().ToArray(); // add everything enabled if null if (sources == null) { foreach (var packageSource in packageSources) { if (packageSource.IsEnabled) { foreach (string source in sources) { provider.AddFromSource(GetSource(source)); } } } } else { // TODO: disallow disabled sources even if they were provided by the caller? foreach (string source in sources) { provider.AddFromSource(GetSource(source)); } } return provider; }