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, packageRoot); var localAndPrimaryRepositories = new HashSet <SourceRepository>(new NuGetSourceRepositoryComparer()); localAndPrimaryRepositories.AddRange(sourceRepositoryProvider.LocalRepositories); localAndPrimaryRepositories.AddRange(sourceRepositoryProvider.PrimaryRepositories); var allRepositories = new HashSet <SourceRepository>(new NuGetSourceRepositoryComparer()); allRepositories.AddRange(localAndPrimaryRepositories); allRepositories.AddRange(sourceRepositoryProvider.Repositories); var packageIdentity = GetPackageId(package, localAndPrimaryRepositories, targetFramework, _sourceCacheContext, _nugetLogger); if (packageIdentity == null) { return(Array.Empty <IFile>()); } if (packageIdentity.Version.IsPrerelease && !package.IsPrerelease()) { // If a prerelease version is explicitly specified, we should install that with or without prerelease flag. _log.Debug("Prerelease version string explicitly specified. Installing prerelease package version."); } var pathResolver = new PackagePathResolver(packageRoot); var dependencyBehavior = GetDependencyBehavior(type, package); var downloadContext = new PackageDownloadContext(_sourceCacheContext); var availablePackages = new HashSet <SourcePackageDependencyInfo>(PackageIdentityComparer.Default); GetPackageDependencies(packageIdentity, targetFramework, _sourceCacheContext, _nugetLogger, allRepositories, availablePackages, dependencyBehavior, localAndPrimaryRepositories); var resolverContext = new PackageResolverContext( dependencyBehavior, new[] { packageIdentity.Id }, Enumerable.Empty <string>(), Enumerable.Empty <global::NuGet.Packaging.PackageReference>(), Enumerable.Empty <PackageIdentity>(), availablePackages, allRepositories.Select(s => s.PackageSource), NullLogger.Instance); var resolver = new PackageResolver(); var packagesToInstall = resolver.Resolve(resolverContext, CancellationToken.None) .Select(p => availablePackages.Single(x => PackageIdentityComparer.Default.Equals(x, p))); var packageExtractionContext = new PackageExtractionContext( PackageSaveMode.Nuspec | PackageSaveMode.Files | PackageSaveMode.Nupkg, XmlDocFileSaveMode.None, ClientPolicyContext.GetClientPolicy(_nugetSettings, _nugetLogger), _nugetLogger); var installedFiles = new List <IFile>(); foreach (var packageToInstall in packagesToInstall) { var isTargetPackage = packageToInstall.Id.Equals(package.Package, StringComparison.OrdinalIgnoreCase); var installPath = new DirectoryPath(pathResolver.GetInstallPath(packageToInstall)); if (!_fileSystem.Exist(installPath)) { var downloadResource = packageToInstall.Source.GetResourceAsync <DownloadResource>(CancellationToken.None).GetAwaiter().GetResult(); var downloadResult = downloadResource.GetDownloadResourceResultAsync( packageToInstall, downloadContext, SettingsUtility.GetGlobalPackagesFolder(_nugetSettings), _nugetLogger, CancellationToken.None).GetAwaiter().GetResult(); PackageExtractor.ExtractPackageAsync( downloadResult.PackageSource, downloadResult.PackageStream, pathResolver, packageExtractionContext, CancellationToken.None).GetAwaiter().GetResult(); // If this is the target package, to avoid problems with casing, get the actual install path from the nuspec if (isTargetPackage) { installPath = new DirectoryPath(pathResolver.GetInstallPath(downloadResult.PackageReader.GetIdentity())); } } if (_denyListPackages.Contains(packageToInstall.Id)) { const string format = "Package {0} depends on package {1}. This dependency won't be loaded."; _log.Debug(format, package.Package, packageToInstall.ToString()); continue; } // If the installed package is not the target package, create a new PackageReference // which is passed to the content resolver. This makes logging make more sense. var installedPackageReference = isTargetPackage ? package : new PackageReference($"nuget:?package={packageToInstall.Id}"); installedFiles.AddRange(_contentResolver.GetFiles(installPath, installedPackageReference, type)); } return(installedFiles); }
public IReadOnlyCollection <IFile> GetFiles(DirectoryPath directoryPath, PackageReference packageReference, PackageType type) { var loadDependencies = packageReference.ShouldLoadDependencies(_config); var files = new List <IFile>(); var package = _installedPackages.First(p => p.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase)); var installPath = new DirectoryPath(_pathResolver.GetInstallPath(package)); if (!_fileSystem.Exist(installPath)) { _log.Warning("Package {0} is not installed.", packageReference.Package); return(Array.Empty <IFile>()); } files.AddRange(_contentResolver.GetFiles(installPath, packageReference, type)); if (loadDependencies) { foreach (var dependency in _installedPackages .Where(p => !p.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase))) { if (_blackListedPackages.Contains(dependency.Id)) { _log.Warning("Package {0} depends on package {1}. Will not load this dependency...", packageReference.Package, dependency.ToString()); continue; } var dependencyInstallPath = new DirectoryPath(_pathResolver.GetInstallPath(dependency)); if (!_fileSystem.Exist(dependencyInstallPath)) { _log.Warning("Package {0} is not installed.", dependency.Id); continue; } files.AddRange(_contentResolver.GetFiles(dependencyInstallPath, packageReference, type)); } } return(files); }
public IReadOnlyCollection <IFile> GetFiles(DirectoryPath directoryPath, PackageReference packageReference, PackageType type) { bool loadDependencies; if (packageReference.Parameters.ContainsKey("LoadDependencies")) { bool.TryParse(packageReference.Parameters["LoadDependencies"].FirstOrDefault() ?? bool.TrueString, out loadDependencies); } else { bool.TryParse(_config.GetValue(Constants.NuGet.LoadDependencies) ?? bool.FalseString, out loadDependencies); } var files = new List <IFile>(); var package = _installedPackages.First(p => p.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase)); var installPath = new DirectoryPath(_pathResolver.GetInstallPath(package)); if (!_fileSystem.Exist(installPath)) { _log.Warning("Package {0} is not installed.", packageReference.Package); return(Array.Empty <IFile>()); } files.AddRange(_contentResolver.GetFiles(installPath, packageReference, type)); if (loadDependencies) { foreach (var dependency in _installedPackages .Where(p => !p.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase))) { if (_blackListedPackages.Contains(dependency.Id)) { _log.Warning("Package {0} depends on package {1}. Will not load this dependency...", packageReference.Package, dependency.ToString()); continue; } var dependencyInstallPath = new DirectoryPath(_pathResolver.GetInstallPath(package)); if (!_fileSystem.Exist(dependencyInstallPath)) { _log.Warning("Package {0} is not installed.", dependency.Id); continue; } files.AddRange(_contentResolver.GetFiles(dependencyInstallPath, packageReference, type)); } } return(files); }
public IReadOnlyCollection <IFile> GetFiles(DirectoryPath directoryPath, PackageReference packageReference, PackageType type) { var files = new List <IFile>(); foreach (var installedPackage in _installedPackages) { if (_blackListedPackages.Contains(installedPackage.Id)) { const string format = "Package {0} depends on package {1}. This dependency won't be loaded."; _log.Debug(format, packageReference.Package, installedPackage.ToString()); continue; } var installPath = new DirectoryPath(_pathResolver.GetInstallPath(installedPackage)); if (!_fileSystem.Exist(installPath)) { _log.Warning("Package {0} is not installed.", installedPackage.Id); continue; } // If the installed package is not the target package, create a new PackageReference // which is passed to the content resolver. This makes logging make more sense. var installedPackageReference = installedPackage.Id.Equals(packageReference.Package, StringComparison.OrdinalIgnoreCase) ? packageReference : new PackageReference($"nuget:?package={installedPackage.Id}"); files.AddRange(_contentResolver.GetFiles(installPath, installedPackageReference, type)); } return(files); }