Example #1
0
        private static async Task AddProjectReferencesAsync(
            IDeferredProjectWorkspaceService deferredWorkspaceService,
            ProjectRestoreMetadata metadata,
            string projectPath)
        {
            var references = await deferredWorkspaceService.GetProjectReferencesAsync(projectPath);

            foreach (var reference in references)
            {
                var restoreReference = new ProjectRestoreReference()
                {
                    ProjectPath       = reference,
                    ProjectUniqueName = reference
                };

                foreach (var frameworkInfo in metadata.TargetFrameworks)
                {
                    frameworkInfo.ProjectReferences.Add(restoreReference);
                }
            }
        }
Example #2
0
        public void HashCode_WithDifferentWarningProperties_ReturnsTrue()
        {
            var noWarn = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1000, NuGetLogCode.NU1500
            };
            var warningsAsErrors = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1001, NuGetLogCode.NU1501
            };

            var leftSide = new ProjectRestoreMetadata
            {
                ProjectWideWarningProperties = new WarningProperties(allWarningsAsErrors: true, warningsAsErrors: warningsAsErrors, noWarn: noWarn)
            };
            var rightSide = new ProjectRestoreMetadata
            {
                ProjectWideWarningProperties = new WarningProperties(allWarningsAsErrors: false, warningsAsErrors: warningsAsErrors, noWarn: noWarn)
            };

            AssertHashCode(expected: false, leftSide, rightSide);
        }
Example #3
0
        public void Equals_WithEquivalentWarningProperties_ReturnsTrue()
        {
            var allWarningsAsErrors = true;
            var noWarn = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1000, NuGetLogCode.NU1500
            };
            var warningsAsErrors = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1001, NuGetLogCode.NU1501
            };

            var leftSide = new ProjectRestoreMetadata
            {
                ProjectWideWarningProperties = new WarningProperties(allWarningsAsErrors: allWarningsAsErrors, warningsAsErrors: warningsAsErrors, noWarn: noWarn)
            };
            var rightSide = new ProjectRestoreMetadata
            {
                ProjectWideWarningProperties = new WarningProperties(allWarningsAsErrors: allWarningsAsErrors, warningsAsErrors: warningsAsErrors, noWarn: noWarn)
            };

            AssertEquality(leftSide, rightSide);
        }
Example #4
0
        public override async Task <IReadOnlyList <PackageSpec> > GetPackageSpecsAsync(DependencyGraphCacheContext context)
        {
            PackageSpec packageSpec = null;

            if (context == null || !context.PackageSpecCache.TryGetValue(MSBuildProjectPath, out packageSpec))
            {
                packageSpec = JsonPackageSpecReader.GetPackageSpec(ProjectName, JsonConfigPath);
                if (packageSpec == null)
                {
                    throw new InvalidOperationException(
                              string.Format(Strings.ProjectNotLoaded_RestoreFailed, ProjectName));
                }
                var metadata = new ProjectRestoreMetadata();
                packageSpec.RestoreMetadata = metadata;

                metadata.ProjectStyle = ProjectStyle.ProjectJson;
                metadata.OutputPath   = await GetBaseIntermediatePathAsync();

                metadata.ProjectPath       = MSBuildProjectPath;
                metadata.ProjectJsonPath   = packageSpec.FilePath;
                metadata.ProjectName       = packageSpec.Name;
                metadata.ProjectUniqueName = MSBuildProjectPath;

                // Reload the target framework from csproj and update the target framework in packageSpec for restore
                await UpdateInternalTargetFrameworkAsync();

                if (TryGetInternalFramework(out var internalTargetFramework))
                {
                    // Ensure the project json has only one target framework
                    if (packageSpec.TargetFrameworks != null && packageSpec.TargetFrameworks.Count == 1)
                    {
                        var replaceTargetFramework = new TargetFrameworkInformation();
                        replaceTargetFramework.FrameworkName = internalTargetFramework as NuGetFramework;
                        packageSpec.TargetFrameworks[0]      = replaceTargetFramework;
                    }
                }

                var references = (await ProjectServices
                                  .ReferencesReader
                                  .GetProjectReferencesAsync(context.Logger, CancellationToken.None))
                                 .ToList();

                if (references != null && references.Count > 0)
                {
                    // Add msbuild reference groups for each TFM in the project
                    foreach (var framework in packageSpec.TargetFrameworks.Select(e => e.FrameworkName))
                    {
                        metadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(framework));
                    }

                    foreach (var reference in references)
                    {
                        // This reference applies to all frameworks
                        // Include/exclude flags may be applied later when merged with project.json
                        // Add the reference for all TFM groups, there are no conditional project
                        // references in UWP. There should also be just one TFM.
                        foreach (var frameworkInfo in metadata.TargetFrameworks)
                        {
                            frameworkInfo.ProjectReferences.Add(reference);
                        }
                    }
                }
                // Write restore settings to the package spec.
                // For project.json these properties may not come from the project file.
                var settings = context?.Settings ?? NullSettings.Instance;
                packageSpec.RestoreMetadata.PackagesPath    = SettingsUtility.GetGlobalPackagesFolder(settings);
                packageSpec.RestoreMetadata.Sources         = SettingsUtility.GetEnabledSources(settings).AsList();
                packageSpec.RestoreMetadata.FallbackFolders = SettingsUtility.GetFallbackPackageFolders(settings).AsList();
                packageSpec.RestoreMetadata.ConfigFilePaths = SettingsUtility.GetConfigFilePaths(settings).AsList();

                context?.PackageSpecCache.Add(MSBuildProjectPath, packageSpec);
            }

            return(new[] { packageSpec });
        }
        /// <summary>
        /// Gets the restore metadata and target framework information for the specified project.
        /// </summary>
        /// <param name="project">An <see cref="IMSBuildProject" /> representing the project.</param>
        /// <param name="projectsByTargetFramework">A <see cref="IReadOnlyDictionary{NuGetFramework,IMSBuildProject}" /> containing the inner nodes by target framework.</param>
        /// <param name="settings">The <see cref="ISettings" /> of the specified project.</param>
        /// <returns>A <see cref="Tuple" /> containing the <see cref="ProjectRestoreMetadata" /> and <see cref="List{TargetFrameworkInformation}" /> for the specified project.</returns>
        private (ProjectRestoreMetadata RestoreMetadata, List <TargetFrameworkInformation> TargetFrameworkInfos) GetProjectRestoreMetadataAndTargetFrameworkInformation(IMSBuildProject project, IReadOnlyDictionary <NuGetFramework, IMSBuildProject> projectsByTargetFramework, ISettings settings)
        {
            var projectName = GetProjectName(project);

            var outputPath = GetRestoreOutputPath(project);

            var targetFrameworkInfos = GetTargetFrameworkInfos(projectsByTargetFramework);

            var projectStyleResult = BuildTasksUtility.GetProjectRestoreStyle(
                restoreProjectStyle: project.GetProperty("RestoreProjectStyle"),
                hasPackageReferenceItems: targetFrameworkInfos.Any(i => i.Dependencies.Any()),
                projectJsonPath: project.GetProperty("_CurrentProjectJsonPath"),
                projectDirectory: project.Directory,
                projectName: project.GetProperty("MSBuildProjectName"),
                log: MSBuildLogger);

            var projectStyle = projectStyleResult.ProjectStyle;

            var innerNodes = projectsByTargetFramework.Values.ToList();

            ProjectRestoreMetadata restoreMetadata;

            if (projectStyle == ProjectStyle.PackagesConfig)
            {
                restoreMetadata = new PackagesConfigProjectRestoreMetadata
                {
                    PackagesConfigPath = projectStyleResult.PackagesConfigFilePath,
                    RepositoryPath     = GetRepositoryPath(project, settings)
                };
            }
            else
            {
                restoreMetadata = new ProjectRestoreMetadata
                {
                    CrossTargeting  = (projectStyle == ProjectStyle.PackageReference || projectStyle == ProjectStyle.DotnetToolReference) && projectsByTargetFramework.Count > 1,
                    FallbackFolders = BuildTasksUtility.GetFallbackFolders(
                        project.Directory,
                        project.SplitPropertyValueOrNull("RestoreFallbackFolders"),
                        project.SplitPropertyValueOrNull("RestoreFallbackFoldersOverride"),
                        innerNodes.SelectMany(i => MSBuildStringUtility.Split(i.GetProperty("RestoreAdditionalProjectFallbackFolders"))),
                        innerNodes.SelectMany(i => MSBuildStringUtility.Split(i.GetProperty("RestoreAdditionalProjectFallbackFoldersExcludes"))),
                        settings),
                    SkipContentFileWrite  = IsLegacyProject(project),
                    ValidateRuntimeAssets = project.IsPropertyTrue("ValidateRuntimeIdentifierCompatibility")
                };
            }

            restoreMetadata.CacheFilePath                = NoOpRestoreUtilities.GetProjectCacheFilePath(outputPath, project.FullPath);
            restoreMetadata.ConfigFilePaths              = settings.GetConfigFilePaths();
            restoreMetadata.OutputPath                   = outputPath;
            restoreMetadata.OriginalTargetFrameworks     = GetOriginalTargetFrameworks(project, projectsByTargetFramework.Keys.ToList());
            restoreMetadata.PackagesPath                 = GetPackagesPath(project, settings);
            restoreMetadata.ProjectName                  = projectName;
            restoreMetadata.ProjectPath                  = project.FullPath;
            restoreMetadata.ProjectStyle                 = projectStyle;
            restoreMetadata.ProjectUniqueName            = project.FullPath;
            restoreMetadata.ProjectWideWarningProperties = WarningProperties.GetWarningProperties(project.GetProperty("TreatWarningsAsErrors"), project.GetProperty("WarningsAsErrors"), project.GetProperty("NoWarn"));
            restoreMetadata.RestoreLockProperties        = new RestoreLockProperties(project.GetProperty("RestorePackagesWithLockFile"), project.GetProperty("NuGetLockFilePath"), project.IsPropertyTrue("RestoreLockedMode"));
            restoreMetadata.Sources          = GetSources(project, innerNodes, settings);
            restoreMetadata.TargetFrameworks = GetProjectRestoreMetadataFrameworkInfos(projectsByTargetFramework);

            return(restoreMetadata, targetFrameworkInfos);
        }
Example #6
0
        public async Task <IReadOnlyList <PackageSpec> > GetPackageSpecsAsync(DependencyGraphCacheContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            // Some projects like website project don't have project file.
            // Return empty list for this case.
            if (string.IsNullOrEmpty(ProjectSystem.ProjectFileFullPath))
            {
                return(new List <PackageSpec>());
            }

            PackageSpec packageSpec = null;

            if (!context.PackageSpecCache.TryGetValue(ProjectSystem.ProjectFileFullPath, out packageSpec))
            {
                packageSpec = new PackageSpec(new List <TargetFrameworkInformation>
                {
                    new TargetFrameworkInformation
                    {
                        FrameworkName = ProjectSystem.TargetFramework
                    }
                });
                packageSpec.Name     = ProjectSystem.ProjectName;
                packageSpec.FilePath = ProjectSystem.ProjectFileFullPath;

                // A packages.config project does not follow the typical restore flow so there is no need to add package
                // dependencides to the package spec. Packages.config package restoration is done elsewhere.

                var metadata = new ProjectRestoreMetadata();
                packageSpec.RestoreMetadata = metadata;

                metadata.ProjectStyle      = ProjectStyle.Unknown;
                metadata.ProjectPath       = ProjectSystem.ProjectFileFullPath;
                metadata.ProjectName       = ProjectSystem.ProjectName;
                metadata.ProjectUniqueName = ProjectSystem.ProjectFileFullPath;

                var references = (await ProjectServices
                                  .ReferencesReader
                                  .GetProjectReferencesAsync(context.Logger, CancellationToken.None))
                                 .ToList();
                if (references != null && references.Count > 0)
                {
                    // Add framework group
                    var frameworkGroup = new ProjectRestoreMetadataFrameworkInfo(ProjectSystem.TargetFramework);
                    metadata.TargetFrameworks.Add(frameworkGroup);

                    foreach (var reference in references)
                    {
                        // This reference applies to all frameworks
                        // Include/exclude flags are not possible for this project type
                        frameworkGroup.ProjectReferences.Add(reference);
                    }
                }

                context.PackageSpecCache.Add(MSBuildProjectPath, packageSpec);
            }

            return(new[] { packageSpec });
        }
Example #7
0
        private ProjectRestoreMetadata CreateProjectRestoreMetadata()
        {
            var projectReference = new ProjectRestoreReference();

            projectReference.ProjectPath       = "Path";
            projectReference.ProjectUniqueName = "ProjectUniqueName";
            projectReference.IncludeAssets     = LibraryIncludeFlags.All;
            projectReference.ExcludeAssets     = LibraryIncludeFlags.Analyzers;
            projectReference.PrivateAssets     = LibraryIncludeFlags.Build;
            var nugetFramework = NuGetFramework.Parse("net461");
            var originalPRMFI  = new ProjectRestoreMetadataFrameworkInfo(nugetFramework);

            originalPRMFI.ProjectReferences = new List <ProjectRestoreReference>()
            {
                projectReference
            };
            var targetframeworks = new List <ProjectRestoreMetadataFrameworkInfo>()
            {
                originalPRMFI
            };

            var allWarningsAsErrors = true;
            var noWarn = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1000, NuGetLogCode.NU1500
            };
            var warningsAsErrors = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1001, NuGetLogCode.NU1501
            };
            var warningProperties = new WarningProperties(allWarningsAsErrors: allWarningsAsErrors, warningsAsErrors: warningsAsErrors, noWarn: noWarn);

            var originalProjectRestoreMetadata = new ProjectRestoreMetadata();

            originalProjectRestoreMetadata.ProjectStyle            = ProjectStyle.PackageReference;
            originalProjectRestoreMetadata.ProjectPath             = "ProjectPath";
            originalProjectRestoreMetadata.ProjectJsonPath         = "ProjectJsonPath";
            originalProjectRestoreMetadata.OutputPath              = "OutputPath";
            originalProjectRestoreMetadata.ProjectName             = "ProjectName";
            originalProjectRestoreMetadata.ProjectUniqueName       = "ProjectUniqueName";
            originalProjectRestoreMetadata.PackagesPath            = "PackagesPath";
            originalProjectRestoreMetadata.CacheFilePath           = "CacheFilePath";
            originalProjectRestoreMetadata.CrossTargeting          = true;
            originalProjectRestoreMetadata.LegacyPackagesDirectory = true;
            originalProjectRestoreMetadata.ValidateRuntimeAssets   = true;
            originalProjectRestoreMetadata.SkipContentFileWrite    = true;
            originalProjectRestoreMetadata.TargetFrameworks        = targetframeworks;
            originalProjectRestoreMetadata.Sources = new List <PackageSource>()
            {
                new PackageSource("http://api.nuget.org/v3/index.json")
            };;
            originalProjectRestoreMetadata.FallbackFolders = new List <string>()
            {
                "fallback1"
            };
            originalProjectRestoreMetadata.ConfigFilePaths = new List <string>()
            {
                "config1"
            };
            originalProjectRestoreMetadata.OriginalTargetFrameworks = new List <string>()
            {
                "net45"
            };
            originalProjectRestoreMetadata.Files = new List <ProjectRestoreMetadataFile>()
            {
                new ProjectRestoreMetadataFile("packagePath", "absolutePath")
            };
            originalProjectRestoreMetadata.ProjectWideWarningProperties = warningProperties;

            return(originalProjectRestoreMetadata);
        }
Example #8
0
 private static void AssertHashCode(bool expected, ProjectRestoreMetadata leftSide, ProjectRestoreMetadata rightSide)
 {
     if (expected)
     {
         leftSide.GetHashCode().Should().Be(rightSide.GetHashCode());
     }
     else
     {
         leftSide.GetHashCode().Should().NotBe(rightSide.GetHashCode());
     }
 }
Example #9
0
 private static void AssertHashCode(ProjectRestoreMetadata leftSide, ProjectRestoreMetadata rightSide)
 {
     AssertHashCode(true, leftSide, rightSide);
 }
        public async Task BuildIntegratedRestoreUtility_IsRestoreRequired_DeferredProjectLoad()
        {
            // Arrange
            var projectName = "testproj";

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                }
              }
            }";

            using (var rootFolder = TestDirectory.Create())
            {
                var projectFolder = new DirectoryInfo(Path.Combine(rootFolder, projectName));
                projectFolder.Create();
                var projectConfig = Path.Combine(projectFolder.FullName, "project.json");
                var projectPath   = Path.Combine(projectFolder.FullName, $"{projectName}.csproj");

                var packageSpec = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", projectConfig);
                var metadata    = new ProjectRestoreMetadata();
                packageSpec.RestoreMetadata = metadata;

                metadata.ProjectStyle      = ProjectStyle.ProjectJson;
                metadata.ProjectPath       = projectPath;
                metadata.ProjectJsonPath   = packageSpec.FilePath;
                metadata.ProjectName       = packageSpec.Name;
                metadata.ProjectUniqueName = projectPath;

                foreach (var framework in packageSpec.TargetFrameworks.Select(e => e.FrameworkName))
                {
                    metadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(framework));
                }

                var solutionManager = new TestSolutionManager(false);

                var testLogger = new TestLogger();

                var restoreContext = new DependencyGraphCacheContext(testLogger);
                restoreContext.DeferredPackageSpecs.Add(packageSpec);

                var pathContext = NuGetPathContext.Create(NullSettings.Instance);

                var oldHash = restoreContext.SolutionSpecHash;

                // Act
                var result = await DependencyGraphRestoreUtility.IsRestoreRequiredAsync(
                    solutionManager,
                    forceRestore : false,
                    pathContext : pathContext,
                    cacheContext : restoreContext,
                    oldDependencyGraphSpecHash : oldHash);

                // Assert
                Assert.Equal(true, result);
                Assert.Equal(0, testLogger.Errors);
                Assert.Equal(0, testLogger.Warnings);
            }
        }
Example #11
0
 private static void AssertEquality(ProjectRestoreMetadata leftSide, ProjectRestoreMetadata rightSide)
 {
     AssertEquality(true, leftSide, rightSide);
 }
Example #12
0
        private ProjectRestoreMetadata CreateProjectRestoreMetadata()
        {
            var projectReference = new ProjectRestoreReference
            {
                ProjectPath       = "Path",
                ProjectUniqueName = "ProjectUniqueName",
                IncludeAssets     = LibraryIncludeFlags.All,
                ExcludeAssets     = LibraryIncludeFlags.Analyzers,
                PrivateAssets     = LibraryIncludeFlags.Build
            };

            var nugetFramework = NuGetFramework.Parse("net461");
            var originalPRMFI  = new ProjectRestoreMetadataFrameworkInfo(nugetFramework)
            {
                ProjectReferences = new List <ProjectRestoreReference>()
                {
                    projectReference
                }
            };

            var targetframeworks = new List <ProjectRestoreMetadataFrameworkInfo>()
            {
                originalPRMFI
            };
            var allWarningsAsErrors = true;
            var noWarn = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1000, NuGetLogCode.NU1500
            };
            var warningsAsErrors = new HashSet <NuGetLogCode>()
            {
                NuGetLogCode.NU1001, NuGetLogCode.NU1501
            };
            var warningProperties              = new WarningProperties(allWarningsAsErrors: allWarningsAsErrors, warningsAsErrors: warningsAsErrors, noWarn: noWarn);
            var restoreLockProperties          = new RestoreLockProperties(restorePackagesWithLockFile: "true", nuGetLockFilePath: null, restoreLockedMode: false);
            var originalProjectRestoreMetadata = new ProjectRestoreMetadata
            {
                ProjectStyle            = ProjectStyle.PackageReference,
                ProjectPath             = "ProjectPath",
                ProjectJsonPath         = "ProjectJsonPath",
                OutputPath              = "OutputPath",
                ProjectName             = "ProjectName",
                ProjectUniqueName       = "ProjectUniqueName",
                PackagesPath            = "PackagesPath",
                CacheFilePath           = "CacheFilePath",
                CrossTargeting          = true,
                LegacyPackagesDirectory = true,
                ValidateRuntimeAssets   = true,
                SkipContentFileWrite    = true,
                TargetFrameworks        = targetframeworks,
                Sources = new List <PackageSource>()
                {
                    new PackageSource("http://api.nuget.org/v3/index.json")
                },
                FallbackFolders = new List <string>()
                {
                    "fallback1"
                },
                ConfigFilePaths = new List <string>()
                {
                    "config1"
                },
                OriginalTargetFrameworks = new List <string>()
                {
                    "net45"
                },
                Files = new List <ProjectRestoreMetadataFile>()
                {
                    new ProjectRestoreMetadataFile("packagePath", "absolutePath")
                },
                ProjectWideWarningProperties = warningProperties,
                RestoreLockProperties        = restoreLockProperties
            };

            return(originalProjectRestoreMetadata);
        }
Example #13
0
        private PackageSpec ToPackageSpec(ProjectNames projectNames, IVsProjectRestoreInfo projectRestoreInfo)
        {
            var tfis = projectRestoreInfo
                       .TargetFrameworks
                       .Cast <IVsTargetFrameworkInfo>()
                       .Select(ToTargetFrameworkInformation)
                       .ToArray();

            var projectFullPath  = Path.GetFullPath(projectNames.FullName);
            var projectDirectory = Path.GetDirectoryName(projectFullPath);

            // TODO: Remove temporary integration code NuGet/Home#3810
            // Initialize OTF and CT values when original value of OTF property is not provided.
            var originalTargetFrameworks = tfis
                                           .Select(tfi => tfi.FrameworkName.GetShortFolderName())
                                           .ToArray();
            var crossTargeting = originalTargetFrameworks.Length > 1;

            // if "TargetFrameworks" property presents in the project file prefer the raw value.
            if (!string.IsNullOrWhiteSpace(projectRestoreInfo.OriginalTargetFrameworks))
            {
                originalTargetFrameworks = MSBuildStringUtility.Split(
                    projectRestoreInfo.OriginalTargetFrameworks);
                // cross-targeting is always ON even in case of a single tfm in the list.
                crossTargeting = true;
            }


            var outputPath = Path.GetFullPath(
                Path.Combine(
                    projectDirectory,
                    projectRestoreInfo.BaseIntermediatePath));

            var projectName = GetPackageId(projectNames, projectRestoreInfo.TargetFrameworks);

            var packageSpec = new PackageSpec(tfis)
            {
                Name            = projectName,
                Version         = GetPackageVersion(projectRestoreInfo.TargetFrameworks),
                FilePath        = projectFullPath,
                ProjectId       = TryGetProjectIdFromCache(projectFullPath, _projectSystemCache, out var projectId) ? projectId : string.Empty,
                RestoreMetadata = new ProjectRestoreMetadata
                {
                    ProjectName       = projectName,
                    ProjectUniqueName = projectFullPath,
                    ProjectPath       = projectFullPath,
                    OutputPath        = outputPath,
                    ProjectStyle      = ProjectStyle.PackageReference,
                    TargetFrameworks  = projectRestoreInfo.TargetFrameworks
                                        .Cast <IVsTargetFrameworkInfo>()
                                        .Select(item => ToProjectRestoreMetadataFrameworkInfo(item, projectDirectory))
                                        .ToList(),
                    OriginalTargetFrameworks = originalTargetFrameworks,
                    CrossTargeting           = crossTargeting,

                    // Read project properties for settings. ISettings values will be applied later since
                    // this value is put in the nomination cache and ISettings could change.
                    PackagesPath    = GetRestoreProjectPath(projectRestoreInfo.TargetFrameworks),
                    FallbackFolders = GetRestoreFallbackFolders(projectRestoreInfo.TargetFrameworks).AsList(),
                    Sources         = GetRestoreSources(projectRestoreInfo.TargetFrameworks)
                                      .Select(e => new PackageSource(e))
                                      .ToList(),
                    ProjectWideWarningProperties = WarningProperties.GetWarningProperties(
                        treatWarningsAsErrors: GetSingleOrDefaultPropertyValue(projectRestoreInfo.TargetFrameworks, TreatWarningsAsErrors, e => e),
                        warningsAsErrors: GetSingleOrDefaultNuGetLogCodes(projectRestoreInfo.TargetFrameworks, WarningsAsErrors, e => MSBuildStringUtility.GetNuGetLogCodes(e)),
                        noWarn: GetSingleOrDefaultNuGetLogCodes(projectRestoreInfo.TargetFrameworks, NoWarn, e => MSBuildStringUtility.GetNuGetLogCodes(e))),
                    CacheFilePath = NoOpRestoreUtilities.GetProjectCacheFilePath(cacheRoot: outputPath, projectPath: projectFullPath)
                },
                RuntimeGraph    = GetRuntimeGraph(projectRestoreInfo),
                RestoreSettings = new ProjectRestoreSettings()
                {
                    HideWarningsAndErrors = true
                }
            };

            return(packageSpec);
        }
Example #14
0
        public void DependencyGraphSpec_RoundTripMSBuildMetadata()
        {
            // Arrange
            var frameworks = new List <TargetFrameworkInformation>();

            frameworks.Add(new TargetFrameworkInformation()
            {
                FrameworkName = NuGetFramework.Parse("net45")
            });

            var spec = new PackageSpec(frameworks);

            spec.Version = NuGetVersion.Parse("24.5.1.2-alpha.1.2+a.b.c");
            var msbuildMetadata = new ProjectRestoreMetadata();

            spec.RestoreMetadata = msbuildMetadata;

            msbuildMetadata.ProjectUniqueName = "A55205E7-4D08-4672-8011-0925467CC45F";
            msbuildMetadata.ProjectPath       = "c:\\x\\x.csproj";
            msbuildMetadata.ProjectName       = PackageSpecName;
            msbuildMetadata.ProjectJsonPath   = "c:\\x\\project.json";
            msbuildMetadata.ProjectStyle      = ProjectStyle.PackageReference;
            msbuildMetadata.PackagesPath      = "c:\\packages";
            msbuildMetadata.Sources           = new[] { new PackageSource("https://api.nuget.org/v3/index.json") };

            var tfmGroup = new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.Parse("net45"));

            msbuildMetadata.TargetFrameworks.Add(tfmGroup);

            tfmGroup.ProjectReferences.Add(new ProjectRestoreReference()
            {
                ProjectUniqueName = "44B29B8D-8413-42D2-8DF4-72225659619B",
                ProjectPath       = "c:\\a\\a.csproj"
            });

            tfmGroup.ProjectReferences.Add(new ProjectRestoreReference()
            {
                ProjectUniqueName = "78A6AD3F-9FA5-47F6-A54E-84B46A48CB2F",
                ProjectPath       = "c:\\b\\b.csproj"
            });

            msbuildMetadata.FallbackFolders.Add("c:\\fallback1");
            msbuildMetadata.FallbackFolders.Add("c:\\fallback2");


            msbuildMetadata.ConfigFilePaths.Add("c:\\nuget.config");
            msbuildMetadata.ConfigFilePaths.Add("d:\\nuget.config");

            msbuildMetadata.CrossTargeting          = true;
            msbuildMetadata.LegacyPackagesDirectory = true;

            // Act
            PackageSpec            readSpec         = PackageSpecTestUtility.RoundTrip(spec, PackageSpecName, PackageSpecPath);
            ProjectRestoreMetadata msbuildMetadata2 = readSpec.RestoreMetadata;

            // Assert
            Assert.NotNull(msbuildMetadata2);
            Assert.Equal("A55205E7-4D08-4672-8011-0925467CC45F", msbuildMetadata2.ProjectUniqueName);
            Assert.Equal("c:\\x\\x.csproj", msbuildMetadata2.ProjectPath);
            Assert.Equal(PackageSpecName, msbuildMetadata2.ProjectName);
            Assert.Equal("c:\\x\\project.json", msbuildMetadata2.ProjectJsonPath);
            Assert.Equal(ProjectStyle.PackageReference, msbuildMetadata2.ProjectStyle);
            Assert.Equal("c:\\packages", msbuildMetadata2.PackagesPath);
            Assert.Equal("https://api.nuget.org/v3/index.json", string.Join("|", msbuildMetadata.Sources.Select(s => s.Source)));
            Assert.Equal("c:\\fallback1|c:\\fallback2", string.Join("|", msbuildMetadata2.FallbackFolders));
            Assert.Equal("c:\\nuget.config|d:\\nuget.config", string.Join("|", msbuildMetadata.ConfigFilePaths));
            Assert.Equal("44B29B8D-8413-42D2-8DF4-72225659619B|c:\\a\\a.csproj|78A6AD3F-9FA5-47F6-A54E-84B46A48CB2F|c:\\b\\b.csproj", string.Join("|", msbuildMetadata2.TargetFrameworks.Single().ProjectReferences.Select(e => $"{e.ProjectUniqueName}|{e.ProjectPath}")));
            Assert.True(msbuildMetadata.CrossTargeting);
            Assert.True(msbuildMetadata.LegacyPackagesDirectory);

            // Verify build metadata is not lost.
            Assert.Equal("24.5.1.2-alpha.1.2+a.b.c", readSpec.Version.ToFullString());
        }
Example #15
0
 private static void AssertEquality(bool expected, ProjectRestoreMetadata leftSide, ProjectRestoreMetadata rightSide)
 {
     if (expected)
     {
         leftSide.Should().Be(rightSide);
     }
     else
     {
         leftSide.Should().NotBe(rightSide);
     }
 }
Example #16
0
        public void DependencyGraphSpec_RoundTripMSBuildMetadata_ProjectReferenceFlags()
        {
            // Arrange
            var frameworks = new List <TargetFrameworkInformation>();

            frameworks.Add(new TargetFrameworkInformation()
            {
                FrameworkName = NuGetFramework.Parse("net45")
            });

            var spec            = new PackageSpec(frameworks);
            var msbuildMetadata = new ProjectRestoreMetadata();

            spec.RestoreMetadata = msbuildMetadata;

            msbuildMetadata.ProjectUniqueName = "A55205E7-4D08-4672-8011-0925467CC45F";
            msbuildMetadata.ProjectPath       = "c:\\x\\x.csproj";
            msbuildMetadata.ProjectName       = PackageSpecName;
            msbuildMetadata.ProjectStyle      = ProjectStyle.PackageReference;

            var tfmGroup  = new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.Parse("net45"));
            var tfmGroup2 = new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.Parse("netstandard1.3"));

            msbuildMetadata.TargetFrameworks.Add(tfmGroup);
            msbuildMetadata.TargetFrameworks.Add(tfmGroup2);

            var ref1 = new ProjectRestoreReference()
            {
                ProjectUniqueName = "44B29B8D-8413-42D2-8DF4-72225659619B",
                ProjectPath       = "c:\\a\\a.csproj",
                IncludeAssets     = LibraryIncludeFlags.Build,
                ExcludeAssets     = LibraryIncludeFlags.Compile,
                PrivateAssets     = LibraryIncludeFlags.Runtime
            };

            var ref2 = new ProjectRestoreReference()
            {
                ProjectUniqueName = "78A6AD3F-9FA5-47F6-A54E-84B46A48CB2F",
                ProjectPath       = "c:\\b\\b.csproj"
            };

            tfmGroup.ProjectReferences.Add(ref1);
            tfmGroup.ProjectReferences.Add(ref2);

            tfmGroup2.ProjectReferences.Add(ref1);
            tfmGroup2.ProjectReferences.Add(ref2);

            // Act
            PackageSpec readSpec = PackageSpecTestUtility.RoundTrip(spec, PackageSpecName, PackageSpecPath);

            // Assert
            Assert.Equal(2, readSpec.RestoreMetadata.TargetFrameworks.Count);

            foreach (var framework in readSpec.RestoreMetadata.TargetFrameworks)
            {
                var references = framework.ProjectReferences.OrderBy(e => e.ProjectUniqueName).ToArray();
                Assert.Equal("44B29B8D-8413-42D2-8DF4-72225659619B", references[0].ProjectUniqueName);
                Assert.Equal(LibraryIncludeFlags.Build, references[0].IncludeAssets);
                Assert.Equal(LibraryIncludeFlags.Compile, references[0].ExcludeAssets);
                Assert.Equal(LibraryIncludeFlags.Runtime, references[0].PrivateAssets);

                Assert.Equal("78A6AD3F-9FA5-47F6-A54E-84B46A48CB2F", references[1].ProjectUniqueName);
                Assert.Equal(LibraryIncludeFlags.All, references[1].IncludeAssets);
                Assert.Equal(LibraryIncludeFlags.None, references[1].ExcludeAssets);
                Assert.Equal(LibraryIncludeFlagUtils.DefaultSuppressParent, references[1].PrivateAssets);
            }
        }
        public async Task BuildIntegratedRestoreUtility_RestoreDeferredProjectLoad()
        {
            // Arrange
            var projectName = "testproj";

            var project1Json = @"
            {
              ""version"": ""1.0.0"",
              ""description"": """",
              ""authors"": [ ""author"" ],
              ""tags"": [ """" ],
              ""projectUrl"": """",
              ""licenseUrl"": """",
              ""frameworks"": {
                ""net45"": {
                  ""dependencies"": {
                    ""packageA"": ""1.0.0""
                  }
                }
              }
            }";

            using (var packageSource = TestDirectory.Create())
                using (var rootFolder = TestDirectory.Create())
                {
                    var sourceRepositoryProvider = TestSourceRepositoryUtility.CreateSourceRepositoryProvider(
                        new List <PackageSource>()
                    {
                        new PackageSource(packageSource.Path)
                    });

                    var packageContext = new SimpleTestPackageContext("packageA");
                    packageContext.AddFile("lib/net45/a.dll");
                    SimpleTestPackageUtility.CreateOPCPackage(packageContext, packageSource);

                    var projectFolder = new DirectoryInfo(Path.Combine(rootFolder, projectName));
                    projectFolder.Create();
                    var projectConfig = Path.Combine(projectFolder.FullName, "project.json");
                    var projectPath   = Path.Combine(projectFolder.FullName, $"{projectName}.csproj");

                    var packageSpec = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", projectConfig);
                    var metadata    = new ProjectRestoreMetadata();
                    packageSpec.RestoreMetadata = metadata;

                    metadata.ProjectStyle      = ProjectStyle.ProjectJson;
                    metadata.ProjectPath       = projectPath;
                    metadata.ProjectJsonPath   = packageSpec.FilePath;
                    metadata.ProjectName       = packageSpec.Name;
                    metadata.ProjectUniqueName = projectPath;
                    foreach (var framework in packageSpec.TargetFrameworks.Select(e => e.FrameworkName))
                    {
                        metadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(framework));
                    }

                    var solutionManager = new TestSolutionManager(false);

                    var testLogger = new TestLogger();

                    var restoreContext = new DependencyGraphCacheContext(testLogger);
                    restoreContext.DeferredPackageSpecs.Add(packageSpec);

                    // Act
                    await DependencyGraphRestoreUtility.RestoreAsync(
                        solutionManager,
                        restoreContext,
                        new RestoreCommandProvidersCache(),
                        (c) => { },
                        sourceRepositoryProvider.GetRepositories(),
                        NullSettings.Instance,
                        testLogger,
                        CancellationToken.None);

                    // Assert
                    Assert.True(File.Exists(Path.Combine(projectFolder.FullName, "project.lock.json")));
                    Assert.True(testLogger.Errors == 0);
                }
        }