public void DotnetCliTool_VerifyPackageSpecWithoutWarningProperties() { // Arrange using (var pathContext = new SimpleTestPathContext()) { // Act var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "tool", "fake.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); // Assert spec.RestoreMetadata.ProjectWideWarningProperties.Should().NotBeNull(); } }
/****************** * ToolReferences * ******************/ internal static void ProcessToolReferences(ProjectNames projectNames, IEnumerable targetFrameworks, IVsReferenceItems toolReferences, DependencyGraphSpec dgSpec) { var toolFramework = GetToolFramework(targetFrameworks); var packagesPath = GetRestoreProjectPath(targetFrameworks); var fallbackFolders = GetRestoreFallbackFolders(targetFrameworks).AsList(); var sources = GetRestoreSources(targetFrameworks) .Select(e => new PackageSource(e)) .ToList(); toolReferences .Cast <IVsReferenceItem>() .Select(r => ToolRestoreUtility.GetSpec( projectNames.FullName, r.Name, GetVersionRange(r), toolFramework, packagesPath, fallbackFolders, sources, projectWideWarningProperties: null)) .ForEach(ts => { dgSpec.AddRestore(ts.RestoreMetadata.ProjectUniqueName); dgSpec.AddProject(ts); }); }
public async Task DotnetCliTool_BasicToolRestore() { // Arrange using (var pathContext = new SimpleTestPathContext()) { var logger = new TestLogger(); var dgFile = new DependencyGraphSpec(); var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "fake.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0")); dgFile.AddProject(spec); dgFile.AddRestore(spec.Name); var pathResolver = new ToolPathResolver(pathContext.UserPackagesFolder); var path = pathResolver.GetLockFilePath( "a", NuGetVersion.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0")); await SimpleTestPackageUtility.CreateFolderFeedV3(pathContext.PackageSource, new PackageIdentity("a", NuGetVersion.Parse("1.0.0"))); // Act var result = await CommandsTestUtility.RunSingleRestore(dgFile, pathContext, logger); // Assert Assert.True(result.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(File.Exists(path)); } }
public async Task DotnetCliTool_BasicToolRestore_DifferentVersionRanges() { // Arrange using (var pathContext = new SimpleTestPathContext()) { var logger = new TestLogger(); var dgFile = new DependencyGraphSpec(); var versions = new List <VersionRange>(); var limit = 100; for (int i = 0; i < limit; i++) { var version = VersionRange.Parse($"{i + 1}.0.0"); versions.Add(version); var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, $"fake{i}.csproj"), "a", version, NuGetFramework.Parse("netcoreapp1.0")); dgFile.AddProject(spec); dgFile.AddRestore(spec.Name); } var pathResolver = new ToolPathResolver(pathContext.UserPackagesFolder); foreach (var version in versions) { await SimpleTestPackageUtility.CreateFolderFeedV3(pathContext.PackageSource, new PackageIdentity("a", version.MinVersion)); } // Act var results = await CommandsTestUtility.RunRestore(dgFile, pathContext, logger); // Assert Assert.Equal(limit, results.Count); foreach (var result in results) { Assert.True(result.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); } foreach (var version in versions) { var path = pathResolver.GetLockFilePath( "a", version.MinVersion, NuGetFramework.Parse("netcoreapp1.0")); Assert.True(File.Exists(path)); } } }
public async Task DotnetCliTool_BasicToolRestore_WithDuplicates() { // Arrange using (var pathContext = new SimpleTestPathContext()) { var logger = new TestLogger(); var dgFile = new DependencyGraphSpec(); for (int i = 0; i < 10; i++) { var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "fake.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); dgFile.AddProject(spec); dgFile.AddRestore(spec.Name); } var pathResolver = new ToolPathResolver(pathContext.UserPackagesFolder); var path = pathResolver.GetLockFilePath( "a", NuGetVersion.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0")); await SimpleTestPackageUtility.CreateFolderFeedV3Async(pathContext.PackageSource, new PackageIdentity("a", NuGetVersion.Parse("1.0.0"))); // Act var results = await CommandsTestUtility.RunRestore(dgFile, pathContext, logger); // Assert // This should have been de-duplicated Assert.Equal(1, results.Count); var result = results.Single(); Assert.True(result.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(File.Exists(path)); } }
private static DependencyGraphSpec ToDependencyGraphSpec(ProjectNames projectNames, IVsProjectRestoreInfo projectRestoreInfo) { var dgSpec = new DependencyGraphSpec(); var packageSpec = ToPackageSpec(projectNames, projectRestoreInfo); dgSpec.AddRestore(packageSpec.RestoreMetadata.ProjectUniqueName); dgSpec.AddProject(packageSpec); if (projectRestoreInfo.ToolReferences != null) { var toolFramework = GetNonEvaluatedPropertyOrNull( projectRestoreInfo.TargetFrameworks, ProjectBuildProperties.DotnetCliToolTargetFramework, NuGetFramework.Parse) ?? CommonFrameworks.NetCoreApp10; var packagesPath = GetRestoreProjectPath(projectRestoreInfo.TargetFrameworks); var fallbackFolders = GetRestoreFallbackFolders(projectRestoreInfo.TargetFrameworks).AsList(); var sources = GetRestoreSources(projectRestoreInfo.TargetFrameworks) .Select(e => new PackageSource(e)) .ToList(); projectRestoreInfo .ToolReferences .Cast <IVsReferenceItem>() .Select(r => ToolRestoreUtility.GetSpec( projectNames.FullName, r.Name, GetVersionRange(r), toolFramework, packagesPath, fallbackFolders, sources, projectWideWarningProperties: null)) .ForEach(ts => { dgSpec.AddRestore(ts.RestoreMetadata.ProjectUniqueName); dgSpec.AddProject(ts); }); } return(dgSpec); }
public async Task BuildAssetsUtils_GeneratePathPropertyForTools(bool hasTools) { using (var pathContext = new SimpleTestPathContext()) using (var randomProjectDirectory = TestDirectory.Create()) { // Arrange var identity = new PackageIdentity("packagea", NuGetVersion.Parse("1.0.0")); var packageDirectory = Directory.CreateDirectory(Path.Combine(pathContext.UserPackagesFolder, identity.Id, identity.Version.ToNormalizedString())); File.WriteAllText(Path.Combine(packageDirectory.FullName, $"{identity.Id}.{identity.Version.ToNormalizedString()}.nupkg.sha512"), string.Empty); var packagePath = await SimpleTestPackageUtility.CreateFullPackageAsync( packageDirectory.FullName, identity.Id, identity.Version.ToString()); var logger = new TestLogger(); var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "tool", "fake.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); spec.RestoreMetadata.ProjectStyle = ProjectStyle.PackageReference; spec.Dependencies.Add(new LibraryDependency { IncludeType = LibraryIncludeFlags.All, LibraryRange = new LibraryRange(identity.Id, new VersionRange(identity.Version), LibraryDependencyTarget.Package) }); var targetGraphs = new List <RestoreTargetGraph> { OriginalCaseGlobalPackageFolderTests.GetRestoreTargetGraph(pathContext.PackageSource, identity, packagePath, logger) }; targetGraphs[0].Graphs.FirstOrDefault().Item.Data.Dependencies = spec.Dependencies; var lockFile = new LockFile { Libraries = { new LockFileLibrary { Name = identity.Id, Version = identity.Version, Path = $"{identity.Id.ToLowerInvariant()}/{identity.Version.ToNormalizedString()}", Type = LibraryType.Package, HasTools = hasTools, } }, Targets = { new LockFileTarget { RuntimeIdentifier = targetGraphs[0].RuntimeIdentifier, TargetFramework = targetGraphs[0].Framework, Libraries = { new LockFileTargetLibrary { Name = identity.Id, Version = identity.Version } } } } }; var repositories = new List <NuGetv3LocalRepository> { new NuGetv3LocalRepository(pathContext.UserPackagesFolder) }; var restoreRequest = new TestRestoreRequest(spec, new[] { new PackageSource(pathContext.PackageSource) }, pathContext.PackagesV2, logger) { ProjectStyle = spec.RestoreMetadata.ProjectStyle }; var assetsFilePath = Path.Combine(randomProjectDirectory, "obj", "project.assets.json"); // Act var outputFiles = BuildAssetsUtils.GetMSBuildOutputFiles(spec, lockFile, targetGraphs, repositories, restoreRequest, assetsFilePath, true, logger); var expectedPropertyName = $"Pkg{identity.Id.Replace(".", "_")}"; var actualPropertyElement = outputFiles.FirstOrDefault().Content.Root.Descendants().Where(i => i.Name.LocalName.Equals(expectedPropertyName)).FirstOrDefault(); if (hasTools) { // Assert Assert.NotNull(actualPropertyElement); Assert.Equal($" '$({actualPropertyElement.Name.LocalName})' == '' ", actualPropertyElement.Attribute("Condition")?.Value); Assert.Equal(packageDirectory.FullName, actualPropertyElement?.Value, ignoreCase: true); Assert.Equal(" '$(ExcludeRestorePackageImports)' != 'true' ", actualPropertyElement.Parent.Attribute("Condition")?.Value); } else { Assert.Null(actualPropertyElement); } } }
public async Task DotnetCliTool_VerifyProjectsAreNotAllowed() { // Arrange using (var pathContext = new SimpleTestPathContext()) { var logger = new TestLogger(); var dgFile = new DependencyGraphSpec(); var spec = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "tool", "fake.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); dgFile.AddProject(spec); dgFile.AddRestore(spec.Name); var pathResolver = new ToolPathResolver(pathContext.UserPackagesFolder); var path = pathResolver.GetLockFilePath( "a", NuGetVersion.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0")); var packageA = new SimpleTestPackageContext() { Id = "a", Version = "1.0.0" }; var packageB = new SimpleTestPackageContext() { Id = "b", Version = "1.0.0" }; packageA.Dependencies.Add(packageB); await SimpleTestPackageUtility.CreateFolderFeedV3Async( pathContext.PackageSource, PackageSaveMode.Defaultv3, packageA, packageB); var projectYRoot = Path.Combine(pathContext.SolutionRoot, "b"); Directory.CreateDirectory(projectYRoot); var projectYJson = Path.Combine(projectYRoot, "project.json"); var projectJsonContent = JObject.Parse(@"{ 'dependencies': { }, 'frameworks': { 'netstandard1.0': { } } }"); File.WriteAllText(projectYJson, projectJsonContent.ToString()); // Act var result = await CommandsTestUtility.RunSingleRestore(dgFile, pathContext, logger); // Assert Assert.True(result.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(File.Exists(path)); var lockFormat = new LockFileFormat(); var lockFile = lockFormat.Read(path); // Verify only packages Assert.Empty(lockFile.Libraries.Where(e => e.Type != "package")); } }
public async Task DotnetCliTool_ToolRestoreNoOpsRegardlessOfProject() { // Arrange using (var pathContext = new SimpleTestPathContext()) { var logger1 = new TestLogger(); var logger2 = new TestLogger(); var spec1 = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "fake1.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); var spec2 = ToolRestoreUtility.GetSpec( Path.Combine(pathContext.SolutionRoot, "fake2.csproj"), "a", VersionRange.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0"), pathContext.UserPackagesFolder, new List <string>() { pathContext.FallbackFolder }, new List <PackageSource>() { new PackageSource(pathContext.PackageSource) }, projectWideWarningProperties: null); var dgFile1 = new DependencyGraphSpec(); dgFile1.AddProject(spec1); dgFile1.AddRestore(spec1.Name); var dgFile2 = new DependencyGraphSpec(); dgFile2.AddProject(spec2); dgFile2.AddRestore(spec2.Name); var pathResolver = new ToolPathResolver(pathContext.UserPackagesFolder); var path = pathResolver.GetLockFilePath( "a", NuGetVersion.Parse("1.0.0"), NuGetFramework.Parse("netcoreapp1.0")); await SimpleTestPackageUtility.CreateFolderFeedV3Async(pathContext.PackageSource, new PackageIdentity("a", NuGetVersion.Parse("1.0.0"))); // Act var results1 = await CommandsTestUtility.RunRestore(dgFile1, pathContext, logger1); // Assert Assert.Equal(1, results1.Count); var result1 = results1.Single(); Assert.True(result1.Success, "Failed: " + string.Join(Environment.NewLine, logger1.Messages)); Assert.False(result1.NoOpRestore, "Should not no-op: " + string.Join(Environment.NewLine, logger1.Messages)); Assert.True(File.Exists(path)); // Act var results2 = await CommandsTestUtility.RunRestore(dgFile2, pathContext, logger2); // Assert Assert.Equal(1, results2.Count); var result2 = results2.Single(); Assert.True(result2.Success, "Failed: " + string.Join(Environment.NewLine, logger2.Messages)); Assert.True(result2.NoOpRestore, "Should no-op: " + string.Join(Environment.NewLine, logger2.Messages)); Assert.True(File.Exists(path)); } }
private static PackageSpec ToToolPackageSpec(ProjectNames projectNames, IVsReferenceItem item) { return(ToolRestoreUtility.GetSpec(projectNames.FullName, item.Name, GetVersionRange(item), LockFile.ToolFramework)); }