From 2d5a1737a2aaebda1de080e001dd8382ff348046 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 20 Jun 2018 15:14:11 -0700 Subject: [PATCH 1/5] Update Razor SDK packing logic to not include Pack at properties layer. - Added test to verify that no-build scenarios work as expected. #2378 --- .../Sdk.Razor.CurrentVersion.props | 5 +-- .../Sdk.Razor.CurrentVersion.targets | 12 ++++++ .../IntegrationTests/PackIntegrationTest.cs | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.props b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.props index 015a7953e8..2ac65f5424 100644 --- a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.props +++ b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.props @@ -67,10 +67,7 @@ Copyright (c) .NET Foundation. All rights reserved. - - $(IncludeRazorContentInPack) - - + diff --git a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.targets b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.targets index 2e2dba43b1..d100b112cc 100644 --- a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.targets +++ b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Sdk.Razor.CurrentVersion.targets @@ -74,6 +74,11 @@ Copyright (c) .NET Foundation. All rights reserved. ResolveRazorGenerateInputs + + ResolveRazorGenerateInputs; + $(GenerateNuspecDependsOn) + + _RazorPrepareForRun; $(PrepareForRunDependsOn) @@ -326,6 +331,13 @@ Copyright (c) .NET Foundation. All rights reserved. + + + + + diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs index 317116111c..80bba18f13 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs @@ -15,6 +15,46 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests { } + [Fact] + [InitializeTestProject("ClassLibrary")] + public async Task Pack__NoBuild_Works_IncludesRazorAssembly() + { + var result = await DotnetMSBuild("Build"); + Assert.BuildPassed(result); + + result = await DotnetMSBuild("Pack", "/p:NoBuild=true"); + Assert.BuildPassed(result); + + Assert.FileExists(result, OutputPath, "ClassLibrary.dll"); + Assert.FileExists(result, OutputPath, "ClassLibrary.Views.dll"); + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + // Travis on OSX produces different full paths in C# and MSBuild + Assert.NuspecContains( + result, + Path.Combine("obj", Configuration, "ClassLibrary.1.0.0.nuspec"), + $""); + + Assert.NuspecDoesNotContain( + result, + Path.Combine("obj", Configuration, "ClassLibrary.1.0.0.nuspec"), + $""); + } + + Assert.NuspecDoesNotContain( + result, + Path.Combine("obj", Configuration, "ClassLibrary.1.0.0.nuspec"), + @""); + + Assert.NupkgContains( + result, + Path.Combine("bin", Configuration, "ClassLibrary.1.0.0.nupkg"), + Path.Combine("lib", "netstandard2.0", "ClassLibrary.Views.dll")); + } + [Fact] [InitializeTestProject("ClassLibrary")] public async Task Pack_Works_IncludesRazorAssembly() From e23c2652b7e123f35935a23e60ee60480caae9e7 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 21 Jun 2018 12:46:43 -0700 Subject: [PATCH 2/5] Add NoBuild test that includes content. - Also fixed wording of existing nobuild test. --- .../IntegrationTests/PackIntegrationTest.cs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs index 80bba18f13..e0d7b86678 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/PackIntegrationTest.cs @@ -17,7 +17,28 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests [Fact] [InitializeTestProject("ClassLibrary")] - public async Task Pack__NoBuild_Works_IncludesRazorAssembly() + public async Task Pack_NoBuild_IncludeRazorContent_IncludesRazorViewContent() + { + var result = await DotnetMSBuild("Build"); + Assert.BuildPassed(result); + + result = await DotnetMSBuild("Pack", "/p:NoBuild=true /p:IncludeRazorContentInPack=true"); + Assert.BuildPassed(result); + + Assert.NuspecContains( + result, + Path.Combine("obj", Configuration, "ClassLibrary.1.0.0.nuspec"), + @""); + + Assert.NupkgContains( + result, + Path.Combine("bin", Configuration, "ClassLibrary.1.0.0.nupkg"), + Path.Combine("contentFiles", "any", "netstandard2.0", "Views", "Shared", "_Layout.cshtml")); + } + + [Fact] + [InitializeTestProject("ClassLibrary")] + public async Task Pack_NoBuild_Works_IncludesRazorAssembly() { var result = await DotnetMSBuild("Build"); Assert.BuildPassed(result); From 1c9208ba110a16eb98085406fd7db874657b642c Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 28 Jun 2018 10:51:19 -0700 Subject: [PATCH 3/5] Update korebuild.json to restrict which VS is used. --- korebuild.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/korebuild.json b/korebuild.json index f0fcb05ac3..62a0761251 100644 --- a/korebuild.json +++ b/korebuild.json @@ -5,7 +5,7 @@ "visualstudio": { "required": false, "includePrerelease": true, - "minVersion": "15.0.26730.03", + "versionRange": "[15.0.26730.03, 15.8)", "requiredWorkloads": [ "Microsoft.VisualStudio.Component.VSSDK" ] From e7db3f840b119e2fe08550d1e568b51dd0256eda Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Sat, 16 Jun 2018 01:05:59 +0530 Subject: [PATCH 4/5] Handle pipe name with whitespace properly --- .../Program.cs | 24 +++++++++++++-- .../ServerProtocol/ServerConnection.cs | 15 +++++++--- .../ServerProtocol/ServerLogger.cs | 2 +- .../BuildServerIntegrationTest.cs | 29 +++++++++++++++++++ .../BuildServerTestFixture.cs | 21 ++++---------- .../MSBuildIntegrationTestBase.cs | 2 +- 6 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNetCore.Razor.Tools/Program.cs b/src/Microsoft.AspNetCore.Razor.Tools/Program.cs index 27807cd23e..8d9c5518c5 100644 --- a/src/Microsoft.AspNetCore.Razor.Tools/Program.cs +++ b/src/Microsoft.AspNetCore.Razor.Tools/Program.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using Microsoft.CodeAnalysis; @@ -16,17 +17,34 @@ namespace Microsoft.AspNetCore.Razor.Tools var cancel = new CancellationTokenSource(); Console.CancelKeyPress += (sender, e) => { cancel.Cancel(); }; + var outputWriter = new StringWriter(); + var errorWriter = new StringWriter(); + // Prevent shadow copying. var loader = new DefaultExtensionAssemblyLoader(baseDirectory: null); - var checker = new DefaultExtensionDependencyChecker(loader, Console.Out, Console.Error); + var checker = new DefaultExtensionDependencyChecker(loader, outputWriter, errorWriter); var application = new Application( cancel.Token, loader, checker, - (path, properties) => MetadataReference.CreateFromFile(path, properties)); + (path, properties) => MetadataReference.CreateFromFile(path, properties), + outputWriter, + errorWriter); - return application.Execute(args); + var result = application.Execute(args); + + var output = outputWriter.ToString(); + var error = errorWriter.ToString(); + + outputWriter.Dispose(); + errorWriter.Dispose(); + + // This will no-op if server logging is not enabled. + ServerLogger.Log(output); + ServerLogger.Log(error); + + return result; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerConnection.cs b/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerConnection.cs index 2583d1e0dc..d9fb8d4b11 100644 --- a/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerConnection.cs +++ b/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerConnection.cs @@ -9,6 +9,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.CommandLineUtils; namespace Microsoft.AspNetCore.Razor.Tools { @@ -283,14 +284,20 @@ namespace Microsoft.AspNetCore.Razor.Tools // Internal for testing. internal static bool TryCreateServerCore(string clientDir, string pipeName, out int? processId, bool debug = false) { - string expectedPath; - string processArguments; processId = null; // The server should be in the same directory as the client var expectedCompilerPath = Path.Combine(clientDir, ServerName); - expectedPath = Environment.GetEnvironmentVariable("DOTNET_HOST_PATH") ?? "dotnet"; - processArguments = $@"""{expectedCompilerPath}"" {(debug ? "--debug" : "")} server -p {pipeName}"; + var expectedPath = Environment.GetEnvironmentVariable("DOTNET_HOST_PATH") ?? "dotnet"; + var argumentList = new string[] + { + expectedCompilerPath, + debug ? "--debug" : "", + "server", + "-p", + pipeName + }; + var processArguments = ArgumentEscaper.EscapeAndConcatenate(argumentList); if (!File.Exists(expectedCompilerPath)) { diff --git a/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerLogger.cs b/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerLogger.cs index be2e934160..2e38fc60c6 100644 --- a/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerLogger.cs +++ b/src/Microsoft.AspNetCore.Razor.Tools/ServerProtocol/ServerLogger.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Razor.Tools // Otherwise, assume that the environment variable specifies the name of the log file. if (Directory.Exists(loggingFileName)) { - loggingFileName = Path.Combine(loggingFileName, $"server.{loggingFileName}.{GetCurrentProcessId()}.log"); + loggingFileName = Path.Combine(loggingFileName, $"razorserver.{GetCurrentProcessId()}.log"); } // Open allowing sharing. We allow multiple processes to log to the same file, so we use share mode to allow that. diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerIntegrationTest.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerIntegrationTest.cs index 60076a7a67..e570b9ee93 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerIntegrationTest.cs @@ -164,5 +164,34 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests Assert.Equal(0, exitCode); Assert.Contains("shut down completed", output.ToString()); } + + [Fact] + [InitializeTestProject("SimpleMvc")] + public async Task Build_WithWhiteSpaceInPipeName_BuildsSuccessfully() + { + // Start the server + var pipeName = "pipe with whitespace"; + var fixture = new BuildServerTestFixture(pipeName); + + try + { + // Run a build + var result = await DotnetMSBuild( + "Build", + "/p:_RazorForceBuildServer=true", + buildServerPipeName: pipeName); + + Assert.BuildPassed(result); + Assert.FileExists(result, OutputPath, "SimpleMvc.dll"); + Assert.FileExists(result, OutputPath, "SimpleMvc.pdb"); + Assert.FileExists(result, OutputPath, "SimpleMvc.Views.dll"); + Assert.FileExists(result, OutputPath, "SimpleMvc.Views.pdb"); + } + finally + { + // Shutdown the server + fixture.Dispose(); + } + } } } diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerTestFixture.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerTestFixture.cs index ea18e6cfa0..5c1a17e5c7 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerTestFixture.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildServerTestFixture.cs @@ -14,9 +14,13 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests { private static readonly TimeSpan _defaultShutdownTimeout = TimeSpan.FromSeconds(60); - public BuildServerTestFixture() + public BuildServerTestFixture() : this(Guid.NewGuid().ToString()) { - PipeName = Guid.NewGuid().ToString(); + } + + internal BuildServerTestFixture(string pipeName) + { + PipeName = pipeName; if (!ServerConnection.TryCreateServerCore(Environment.CurrentDirectory, PipeName, out var processId)) { @@ -54,18 +58,5 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests } } } - - private static string RecursiveFind(string path, string start) - { - var test = Path.Combine(start, path); - if (File.Exists(test)) - { - return start; - } - else - { - return RecursiveFind(path, new DirectoryInfo(start).Parent.FullName); - } - } } } diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/MSBuildIntegrationTestBase.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/MSBuildIntegrationTestBase.cs index c9765901cd..4cde21a898 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/MSBuildIntegrationTestBase.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/MSBuildIntegrationTestBase.cs @@ -71,7 +71,7 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests if (!suppressBuildServer) { - buildArgumentList.Add($"/p:_RazorBuildServerPipeName={buildServerPipeName ?? BuildServer.PipeName}"); + buildArgumentList.Add($@"/p:_RazorBuildServerPipeName=""{buildServerPipeName ?? BuildServer.PipeName}"""); // The build server will not be used in netcoreapp2.0 because PipeOptions.CurrentUserOnly is not available. // But we still want to make sure to run the tests on the server. So suppress that check. From 74667eda9c5a1826b2876a718e6de22832ef6550 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 19 Jun 2018 11:01:39 -0700 Subject: [PATCH 5/5] Don't specify MainEntryPoint when compiling Razor assembly --- .../Microsoft.NET.Sdk.Razor.Compilation.targets | 2 +- .../IntegrationTests/BuildIntegrationTest.cs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Compilation.targets b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Compilation.targets index c8ec7205db..102315ebc4 100644 --- a/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Compilation.targets +++ b/src/Microsoft.NET.Sdk.Razor/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Compilation.targets @@ -42,6 +42,7 @@ Copyright (c) .NET Foundation. All rights reserved. Remove @(DocFileItem) Remove PdbFile="$(PdbFile)" Remove OutputRefAssembly="@(IntermediateRefAssembly)" + Remove MainEntryPoint="$(StartupObject)" Remove EmbedAllSources="$(EmbedAllSources)" - not supported by our supported version of MSBuild @@ -133,7 +134,6 @@ Copyright (c) .NET Foundation. All rights reserved. KeyFile="$(KeyOriginatorFile)" LangVersion="$(LangVersion)" LinkResources="@(LinkResource)" - MainEntryPoint="$(StartupObject)" ModuleAssemblyName="$(ModuleAssemblyName)" NoConfig="true" NoLogo="$(NoLogo)" diff --git a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildIntegrationTest.cs b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildIntegrationTest.cs index 541cac3523..030f55dd7b 100644 --- a/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Design.Test/IntegrationTests/BuildIntegrationTest.cs @@ -553,6 +553,21 @@ namespace Microsoft.AspNetCore.Razor.Design.IntegrationTests Assert.BuildPassed(result); } + [Fact] + [InitializeTestProject("SimpleMvc")] + public async Task Build_WithStartupObjectSpecified_Works() + { + var result = await DotnetMSBuild("Build", $"/p:StartupObject=SimpleMvc.Program"); + + Assert.BuildPassed(result); + + Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.dll"); + Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.pdb"); + + Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.dll"); + Assert.FileExists(result, IntermediateOutputPath, "SimpleMvc.Views.pdb"); + } + private static DependencyContext ReadDependencyContext(string depsFilePath) { var reader = new DependencyContextJsonReader();