private async Task <FallbackPackagePathResolver> GetPackagesPathResolverAsync(BuildIntegratedNuGetProject project) { // To get packagesPath for build integrated projects, first read the packageSpec to know if // RestorePackagesPath property was specified. If yes, then use that property to get packages path // otherwise use global user cache folder from _settings. var context = new DependencyGraphCacheContext(); var packageSpecs = await project.GetPackageSpecsAsync(context); var packageSpec = packageSpecs.Single(e => e.RestoreMetadata.ProjectStyle == ProjectStyle.PackageReference || e.RestoreMetadata.ProjectStyle == ProjectStyle.ProjectJson); var packagesPath = VSRestoreSettingsUtilities.GetPackagesPath(_settings, packageSpec); return(new FallbackPackagePathResolver(packagesPath, VSRestoreSettingsUtilities.GetFallbackFolders(_settings, packageSpec))); }
private async Task <(InstalledPackageResultStatus, IReadOnlyCollection <NuGetInstalledPackage>)> GetInstalledPackagesAsync(BuildIntegratedNuGetProject project, CancellationToken cancellationToken) { NuGetInstalledPackage ToNuGetInstalledPackage(PackageReference packageReference, FallbackPackagePathResolver pathResolver) { var id = packageReference.PackageIdentity.Id; var versionRange = packageReference.AllowedVersions; string requestedRange = packageReference.AllowedVersions.OriginalString // most packages ?? packageReference.AllowedVersions.ToShortString(); string version = versionRange.MinVersion.OriginalVersion ?? versionRange.MinVersion.ToNormalizedString(); var installPath = pathResolver.GetPackageDirectory(id, version); bool directDependency = true; return(NuGetContractsFactory.CreateNuGetInstalledPackage(id, requestedRange, version, installPath, directDependency)); } InstalledPackageResultStatus status; IReadOnlyCollection <NuGetInstalledPackage> installedPackages; var cacheContext = new DependencyGraphCacheContext(); var(packageSpecs, messages) = await project.GetPackageSpecsAndAdditionalMessagesAsync(cacheContext); if (messages?.Any(m => m.Level == LogLevel.Error) == true) { // Although we know that the project will fail to restore, we may still know about some direct dependencies, so let's return the packages that we know about. status = InstalledPackageResultStatus.ProjectInvalid; } else { status = InstalledPackageResultStatus.Successful; } var packageSpec = packageSpecs.Single(s => s.RestoreMetadata.ProjectStyle == ProjectModel.ProjectStyle.PackageReference || s.RestoreMetadata.ProjectStyle == ProjectModel.ProjectStyle.ProjectJson); var packagesPath = VSRestoreSettingsUtilities.GetPackagesPath(_settings, packageSpec); FallbackPackagePathResolver pathResolver = new FallbackPackagePathResolver(packagesPath, VSRestoreSettingsUtilities.GetFallbackFolders(_settings, packageSpec)); var packageReferences = await project.GetInstalledPackagesAsync(cancellationToken); installedPackages = packageReferences.Select(p => ToNuGetInstalledPackage(p, pathResolver)) .ToList(); return(status, installedPackages); }
public void VSRestoreSettingsUtilities_PackagePath(string packagesPath, string expectedPackagesPath) { using (var mockBaseDirectory = TestDirectory.Create()) { // Set Up var spec = new PackageSpec(); spec.RestoreMetadata = new ProjectRestoreMetadata(); spec.RestoreMetadata.ProjectPath = @"C:\project\projectPath.csproj"; spec.RestoreMetadata.PackagesPath = packagesPath; var settings = new Settings(mockBaseDirectory); settings.SetValue(SettingsUtility.ConfigSection, "globalPackagesFolder", @"C:\defaultPackagesPath"); // Act var actualPackagesPath = VSRestoreSettingsUtilities.GetPackagesPath(settings, spec); //Assert Assert.Equal(expectedPackagesPath, actualPackagesPath); } }
public void VSRestoreSettingsUtilities_PackagePath(string packagesPath, string expectedPackagesPath) { using (var mockBaseDirectory = TestDirectory.Create()) { // Set Up var spec = new PackageSpec { RestoreMetadata = new ProjectRestoreMetadata { ProjectPath = @"C:\project\projectPath.csproj", PackagesPath = packagesPath } }; var settings = new Settings(mockBaseDirectory); settings.AddOrUpdate(ConfigurationConstants.Config, new AddItem("globalPackagesFolder", @"C:\defaultPackagesPath")); // Act var actualPackagesPath = VSRestoreSettingsUtilities.GetPackagesPath(settings, spec); //Assert Assert.Equal(expectedPackagesPath, actualPackagesPath); } }
private async Task <(InstalledPackageResultStatus, IReadOnlyCollection <NuGetInstalledPackage>)> GetInstalledPackagesAsync(BuildIntegratedNuGetProject project, CancellationToken cancellationToken) { NuGetInstalledPackage ToNuGetInstalledPackage(PackageReference packageReference, FallbackPackagePathResolver pathResolver, bool directDependency) { var id = packageReference.PackageIdentity.Id; string requestedRange = null; if (directDependency) { requestedRange = packageReference.AllowedVersions?.OriginalString // When Version is specified ?? packageReference.AllowedVersions?.ToShortString(); // Probably only when Version is not specified in msbuild } string version = packageReference.PackageIdentity.Version?.ToNormalizedString() ?? string.Empty; var installPath = version != null ? pathResolver.GetPackageDirectory(id, version) : null; return(NuGetContractsFactory.CreateNuGetInstalledPackage(id, requestedRange, version, installPath, directDependency)); } InstalledPackageResultStatus status; List <NuGetInstalledPackage> installedPackages; (InstalledPackageResultStatus, IReadOnlyCollection <NuGetInstalledPackage>) ErrorResult(InstalledPackageResultStatus status) { return(status, null); } var cacheContext = new DependencyGraphCacheContext(); IReadOnlyList <ProjectModel.PackageSpec> packageSpecs; IReadOnlyList <ProjectModel.IAssetsLogMessage> messages; try { (packageSpecs, messages) = await project.GetPackageSpecsAndAdditionalMessagesAsync(cacheContext); } catch (ProjectNotNominatedException) { return(ErrorResult(InstalledPackageResultStatus.ProjectNotReady)); } catch (InvalidDataException) { return(ErrorResult(InstalledPackageResultStatus.ProjectInvalid)); } if (messages?.Any(m => m.Level == LogLevel.Error) == true) { // Although we know that the project will fail to restore, we may still know about some direct dependencies, so let's return the packages that we know about. status = InstalledPackageResultStatus.ProjectInvalid; } else { status = InstalledPackageResultStatus.Successful; } var packageSpec = packageSpecs.Single(s => s.RestoreMetadata.ProjectStyle == ProjectModel.ProjectStyle.PackageReference || s.RestoreMetadata.ProjectStyle == ProjectModel.ProjectStyle.ProjectJson); var packagesPath = VSRestoreSettingsUtilities.GetPackagesPath(_settings, packageSpec); FallbackPackagePathResolver pathResolver = new FallbackPackagePathResolver(packagesPath, VSRestoreSettingsUtilities.GetFallbackFolders(_settings, packageSpec)); IReadOnlyCollection <PackageReference> directPackages; IReadOnlyCollection <PackageReference> transitivePackages; if (project is IPackageReferenceProject packageReferenceProject) { var installed = await packageReferenceProject.GetInstalledAndTransitivePackagesAsync(cancellationToken); directPackages = installed.InstalledPackages; transitivePackages = installed.TransitivePackages; } else { directPackages = (await project.GetInstalledPackagesAsync(cancellationToken)).ToList(); transitivePackages = Array.Empty <PackageReference>(); } installedPackages = new List <NuGetInstalledPackage>(directPackages.Count + (transitivePackages?.Count ?? 0)); installedPackages.AddRange(directPackages.Select(p => ToNuGetInstalledPackage(p, pathResolver, directDependency: true))); if (transitivePackages != null) { installedPackages.AddRange(transitivePackages.Select(p => ToNuGetInstalledPackage(p, pathResolver, directDependency: false))); } return(status, installedPackages); }