diff --git a/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets b/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets index e0dc4c70ac02..f4506e7cc494 100644 --- a/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets +++ b/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets @@ -188,10 +188,9 @@ - + Condition="'$(IsPublishable)' == 'true' AND '$(EnableSdkContainerSupport)' == 'true'"> $(NetCoreRoot) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets index 136d5d2cb673..a506081a2017 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets @@ -52,4 +52,15 @@ Copyright (c) .NET Foundation. All rights reserved. + + + + <_ContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ + + + + + diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index 0471455a9530..e30a7b785ead 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -209,6 +209,87 @@ private string BuildLocalApp([CallerMemberName] string testName = "TestName", st return publishDirectory; } + [DockerAvailableFact(Skip = "https://github.com/dotnet/sdk/issues/36160")] + public async Task EndToEnd_MultiProjectSolution() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(EndToEnd_MultiProjectSolution)); + DirectoryInfo newSolutionDir = new(Path.Combine(TestSettings.TestArtifactsDirectory, $"CreateNewImageTest_EndToEnd_MultiProjectSolution")); + + if (newSolutionDir.Exists) + { + newSolutionDir.Delete(recursive: true); + } + + newSolutionDir.Create(); + + // Create solution with projects + new DotnetNewCommand(_testOutput, "sln", "-n", nameof(EndToEnd_MultiProjectSolution)) + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetNewCommand(_testOutput, "console", "-n", "ConsoleApp") + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetCommand(_testOutput, "sln", "add", "ConsoleApp\\ConsoleApp.csproj") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetNewCommand(_testOutput, "web", "-n", "WebApp") + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetCommand(_testOutput, "sln", "add", "WebApp\\WebApp.csproj") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + // Add 'EnableSdkContainerSupport' property to the ConsoleApp and set TFM + using (FileStream stream = File.Open(Path.Join(newSolutionDir.FullName, "ConsoleApp", "ConsoleApp.csproj"), FileMode.Open, FileAccess.ReadWrite)) + { + XDocument document = await XDocument.LoadAsync(stream, LoadOptions.None, CancellationToken.None); + document + .Descendants() + .First(e => e.Name.LocalName == "PropertyGroup")? + .Add(new XElement("EnableSdkContainerSupport", "true")); + document + .Descendants() + .First(e => e.Name.LocalName == "TargetFramework") + .Value = ToolsetInfo.CurrentTargetFramework; + + stream.SetLength(0); + await document.SaveAsync(stream, SaveOptions.None, CancellationToken.None); + } + + // Set TFM for WebApp + using (FileStream stream = File.Open(Path.Join(newSolutionDir.FullName, "WebApp", "WebApp.csproj"), FileMode.Open, FileAccess.ReadWrite)) + { + XDocument document = await XDocument.LoadAsync(stream, LoadOptions.None, CancellationToken.None); + document + .Descendants() + .First(e => e.Name.LocalName == "TargetFramework") + .Value = ToolsetInfo.CurrentTargetFramework; + + stream.SetLength(0); + await document.SaveAsync(stream, SaveOptions.None, CancellationToken.None); + } + + // Publish + CommandResult commandResult = new DotnetCommand(_testOutput, "publish", "/t:PublishContainer") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute(); + + commandResult.Should().Pass(); + commandResult.Should().HaveStdOutContaining("Pushed image 'webapp:latest'"); + commandResult.Should().HaveStdOutContaining("Pushed image 'consoleapp:latest'"); + } [DockerAvailableTheory(Skip = "https://github.com/dotnet/sdk/issues/36160")] [InlineData("webapi", false)] diff --git a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props index ac284f1689d5..862cdafc5d89 100644 --- a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props +++ b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props @@ -15,7 +15,4 @@ Copyright (c) .NET Foundation. All rights reserved. true - - diff --git a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets index b7c1c1ac853b..c4d769c792cd 100644 --- a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets +++ b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets @@ -29,7 +29,6 @@ Copyright (C) Microsoft Corporation. All rights reserved. <_PublishTargetsDir Condition=" '$(_PublishTargetsDir)'=='' ">$(MSBuildThisFileDirectory)PublishTargets\ <_DotNetCLIToolTargetsDir Condition=" '$(_DotNetCLIToolTargetsDir)'=='' ">$(MSBuildThisFileDirectory)DotNetCLIToolTargets\ <_PublishProfilesDir Condition=" '$(_PublishProfilesDir)'=='' ">$(MSBuildThisFileDirectory)PublishProfiles\ - <_ContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ - - - -