예제 #1
0
        public async Task <IReadOnlyCollection <MetadataReference> > Install(string packageSearchTerm, IReplLogger logger)
        {
            var nugetLogger = new NugetErrorLogger(logger);

            logger.LogOutput($"Searching for {packageSearchTerm}");
            var package = await FindPackageAsync(packageSearchTerm, repositories, nugetLogger);

            if (package == null)
            {
                logger.LogError($"Could not find package '{packageSearchTerm}'");
                return(Array.Empty <MetadataReference>());
            }
            logger.LogOutput("Found " + Display(package));
            logger.LogOutput("Determining dependences...");

            var dependencies = await GetPackageDependencies(package, nugetFramework, nugetCache, nugetLogger, repositories);

            var packagesToInstall        = ResolvePackages(package, dependencies, nugetLogger);
            var packageExtractionContext = new PackageExtractionContext(
                PackageSaveMode.Defaultv3,
                XmlDocFileSaveMode.None,
                clientPolicy,
                nugetLogger);

            var assemblyPaths = await Task.WhenAll(packagesToInstall
                                                   .Select(async packageToInstall =>
            {
                var installedPath = packagePathResolver.GetInstalledPath(packageToInstall);
                PackageReaderBase packageReader = installedPath == null
                        ? await DownloadPackage(packageToInstall, packageExtractionContext, nugetLogger)
                        : LocalPackageReader(packageToInstall, installedPath, nugetLogger);

                var allResources = await Task.WhenAll(
                    packageReader.GetLibItemsAsync(CancellationToken.None),
                    packageReader.GetFrameworkItemsAsync(CancellationToken.None)
                    );

                installedPath ??= packagePathResolver.GetInstalledPath(packageToInstall);
                var references = DotNetAssemblyLocator.GroupDirectoryContentsIntoAssemblies(
                    FilterByFramework(frameworkReducer, allResources.SelectMany(x => x).ToList())
                    .Select(item => Path.Combine(installedPath, item))
                    )
                                 .Select(assembly => io.CreateMetadataReferenceWithDocumentation(assembly))
                                 .ToList();

                logger.LogOutput("Installation complete for " + Display(packageToInstall));

                return(references);
            })
                                                   );

            return(assemblyPaths
                   .SelectMany(assemblyGroup => assemblyGroup)
                   .ToList());
        }