public IReadOnlyCollection <IFile> Install(PackageReference package, PackageType type, DirectoryPath path) { if (package == null) { throw new ArgumentNullException(nameof(package)); } if (path == null) { throw new ArgumentNullException(nameof(path)); } var packageRoot = path.MakeAbsolute(_environment).FullPath; var targetFramework = type == PackageType.Addin ? _currentFramework : NuGetFramework.AnyFramework; var sourceRepositoryProvider = new NuGetSourceRepositoryProvider(_nugetSettings, _config, package); var pathResolver = new PackagePathResolver(packageRoot); var project = new NugetFolderProject(_fileSystem, _contentResolver, _log, pathResolver, packageRoot, targetFramework); var packageManager = new NuGetPackageManager(sourceRepositoryProvider, _nugetSettings, project.Root) { PackagesFolderNuGetProject = project }; var packageIdentity = GetPackageId(package, packageManager, sourceRepositoryProvider, targetFramework, _sourceCacheContext, _nugetLogger); if (packageIdentity == null) { return(Array.Empty <IFile>()); } var includePrerelease = package.IsPrerelease(); var dependencyBehavior = GetDependencyBehavior(type, package); var projectContext = new NuGetProjectContext(_log); var resolutionContext = new ResolutionContext(dependencyBehavior, includePrerelease, false, VersionConstraints.None, _gatherCache, _sourceCacheContext); var downloadContext = new PackageDownloadContext(_sourceCacheContext); // First get the install actions. // This will give us the list of packages to install, and which feed should be used. var actions = packageManager.GetInstallProjectActionsAsync( project, packageIdentity, resolutionContext, projectContext, sourceRepositoryProvider.GetPrimaryRepositories(), sourceRepositoryProvider.GetRepositories(), CancellationToken.None).Result; // Then install the packages. packageManager.ExecuteNuGetProjectActionsAsync( project, actions, projectContext, downloadContext, CancellationToken.None).Wait(); return(project.GetFiles(path, package, type)); }
private static NuGetVersion GetNuGetVersion(PackageReference package, NuGetPackageManager packageManager, NuGetSourceRepositoryProvider sourceRepositoryProvider, NuGetFramework targetFramework, SourceCacheContext sourceCacheContext, ILogger logger) { if (package.Parameters.ContainsKey("version")) { return(new NuGetVersion(package.Parameters["version"].First())); } // Only search for latest version in local and primary sources. var repositories = new HashSet <SourceRepository>(new SourceRepositoryComparer()); repositories.Add(packageManager.PackagesFolderSourceRepository); repositories.AddRange(packageManager.GlobalPackageFolderRepositories); repositories.AddRange(sourceRepositoryProvider.GetPrimaryRepositories()); var includePrerelease = package.IsPrerelease(); NuGetVersion version = null; foreach (var sourceRepository in repositories) { try { var dependencyInfoResource = sourceRepository.GetResourceAsync <DependencyInfoResource>().Result; var dependencyInfo = dependencyInfoResource.ResolvePackages(package.Package, targetFramework, sourceCacheContext, logger, CancellationToken.None).Result; var foundVersion = dependencyInfo .Where(p => p.Listed && (includePrerelease || !p.Version.IsPrerelease)) .OrderByDescending(p => p.Version, VersionComparer.Default) .Select(p => p.Version) .FirstOrDefault(); // Find the highest possible version version = version ?? foundVersion; if (foundVersion != null && version != null && foundVersion > version) { version = foundVersion; } } catch (AggregateException ae) { ae.Handle(e => { logger.LogWarning(e.Message); return(true); }); } } return(version); }