123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- // Licensed to the .NET Foundation under one or more agreements.
- // The .NET Foundation licenses this file to you under the MIT license.
- using Microsoft.Extensions.DependencyModel;
- namespace Microsoft.NET.Build.Tests
- {
- public class GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs : SdkTest
- {
- public GivenThatWeWantToBuildAnAppWithTransitiveNonSdkProjectRefs(ITestOutputHelper log) : base(log)
- {
- }
- [WindowsOnlyFact]
- public void It_builds_the_project_successfully()
- {
- // NOTE the projects created by CreateTestProject:
- // TestApp --depends on--> MainLibrary --depends on--> AuxLibrary (non-SDK)
- // (TestApp transitively depends on AuxLibrary)
- var testAsset = _testAssetsManager
- .CreateTestProject(CreateTestProject());
- VerifyAppBuilds(testAsset, string.Empty);
- }
- [WindowsOnlyTheory]
- [InlineData("")]
- [InlineData("TestApp.")]
- public void It_builds_deps_correctly_when_projects_do_not_get_restored(string prefix)
- {
- // NOTE the projects created by CreateTestProject:
- // TestApp --depends on--> MainLibrary --depends on--> AuxLibrary
- // (TestApp transitively depends on AuxLibrary)
- var testAsset = _testAssetsManager
- .CreateTestProject(CreateTestProject())
- .WithProjectChanges(
- (projectName, project) =>
- {
- string projectFileName = Path.GetFileNameWithoutExtension(projectName);
- if (StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "AuxLibrary") ||
- StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "MainLibrary"))
- {
- var ns = project.Root.Name.Namespace;
- XElement propertyGroup = project.Root.Element(ns + "PropertyGroup");
- if (!string.IsNullOrEmpty(prefix))
- {
- XElement assemblyName = propertyGroup.Element(ns + "AssemblyName");
- assemblyName.RemoveAll();
- assemblyName.Add(prefix + projectFileName);
- }
- // indicate that project restore is not supported for these projects:
- var target = new XElement(ns + "Target",
- new XAttribute("Name", "_IsProjectRestoreSupported"),
- new XAttribute("Returns", "@(_ValidProjectsForRestore)"));
- project.Root.Add(target);
- }
- else // if (StringComparer.OrdinalIgnoreCase.Equals(projectFileName, "TestApp"))
- {
- var ns = project.Root.Name.Namespace;
- XElement propertyGroup = project.Root.Element(ns + "PropertyGroup");
- XElement includeProjectsNotInAssetsFileInDepsFile = new(ns + "IncludeProjectsNotInAssetsFileInDepsFile");
- includeProjectsNotInAssetsFileInDepsFile.Add("true");
- propertyGroup.Add(includeProjectsNotInAssetsFileInDepsFile);
- }
- });
- string outputDirectory = VerifyAppBuilds(testAsset, prefix);
- using (var depsJsonFileStream = File.OpenRead(Path.Combine(outputDirectory, "TestApp.deps.json")))
- {
- var dependencyContext = new DependencyContextJsonReader().Read(depsJsonFileStream);
- var projectNames = dependencyContext.RuntimeLibraries.Select(library => library.Name).ToList();
- projectNames.Should().BeEquivalentTo(new[] { "TestApp", prefix + "AuxLibrary", prefix + "MainLibrary" });
- }
- }
- private TestProject CreateTestProject()
- {
- string targetFrameworkVersion = "v4.8";
- var auxLibraryProject = new TestProject("AuxLibrary")
- {
- IsSdkProject = false,
- TargetFrameworkVersion = targetFrameworkVersion
- };
- auxLibraryProject.SourceFiles["Helper.cs"] = @"
- using System;
- namespace AuxLibrary
- {
- public static class Helper
- {
- public static void WriteMessage()
- {
- Console.WriteLine(""This string came from AuxLibrary!"");
- }
- }
- }
- ";
- var mainLibraryProject = new TestProject("MainLibrary")
- {
- IsSdkProject = false,
- TargetFrameworkVersion = targetFrameworkVersion
- };
- mainLibraryProject.ReferencedProjects.Add(auxLibraryProject);
- mainLibraryProject.SourceFiles["Helper.cs"] = @"
- using System;
- namespace MainLibrary
- {
- public static class Helper
- {
- public static void WriteMessage()
- {
- Console.WriteLine(""This string came from MainLibrary!"");
- AuxLibrary.Helper.WriteMessage();
- }
- }
- }
- ";
- var testAppProject = new TestProject("TestApp")
- {
- IsExe = true,
- TargetFrameworks = ToolsetInfo.CurrentTargetFramework
- };
- testAppProject.AdditionalProperties["ProduceReferenceAssembly"] = "false";
- // disable implicit use of the Roslyn Toolset compiler package
- testAppProject.AdditionalProperties["BuildWithNetFrameworkHostedCompiler"] = false.ToString();
- testAppProject.ReferencedProjects.Add(mainLibraryProject);
- testAppProject.SourceFiles["Program.cs"] = @"
- using System;
- namespace TestApp
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- Console.WriteLine(""TestApp --depends on--> MainLibrary --depends on--> AuxLibrary"");
- MainLibrary.Helper.WriteMessage();
- }
- }
- }
- ";
- return testAppProject;
- }
- private string VerifyAppBuilds(TestAsset testAsset, string prefix)
- {
- var buildCommand = new BuildCommand(testAsset, "TestApp");
- var outputDirectory = buildCommand.GetOutputDirectory(ToolsetInfo.CurrentTargetFramework);
- buildCommand
- .Execute()
- .Should()
- .Pass();
- outputDirectory.Should().OnlyHaveFiles(new[] {
- "TestApp.dll",
- "TestApp.pdb",
- $"TestApp{EnvironmentInfo.ExecutableExtension}",
- "TestApp.deps.json",
- "TestApp.runtimeconfig.json",
- prefix + "MainLibrary.dll",
- prefix + "MainLibrary.pdb",
- prefix + "AuxLibrary.dll",
- prefix + "AuxLibrary.pdb",
- });
- new DotnetCommand(Log, Path.Combine(outputDirectory.FullName, "TestApp.dll"))
- .Execute()
- .Should()
- .Pass()
- .And
- .HaveStdOutContaining("This string came from MainLibrary!")
- .And
- .HaveStdOutContaining("This string came from AuxLibrary!");
- return outputDirectory.FullName;
- }
- }
- }
|