コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }