diff --git a/src/Microsoft.AspNet.Mvc.Razor/Compilation/CompilationOptionsProviderExtension.cs b/src/Microsoft.AspNet.Mvc.Razor/Compilation/CompilationOptionsProviderExtension.cs index a07015da3b..039047cfa9 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/Compilation/CompilationOptionsProviderExtension.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/Compilation/CompilationOptionsProviderExtension.cs @@ -23,10 +23,14 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation /// /// The for the executing application. /// + /// + /// The configuration name to use for compilation. + /// /// The for the current application. public static CompilationSettings GetCompilationSettings( this ICompilerOptionsProvider compilerOptionsProvider, - IApplicationEnvironment applicationEnvironment) + IApplicationEnvironment applicationEnvironment, + string configuration) { if (compilerOptionsProvider == null) { @@ -38,10 +42,16 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation throw new ArgumentNullException(nameof(applicationEnvironment)); } - return compilerOptionsProvider.GetCompilerOptions(applicationEnvironment.ApplicationName, - applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration) - .ToCompilationSettings(applicationEnvironment.RuntimeFramework, applicationEnvironment.ApplicationBasePath); + if (string.IsNullOrEmpty(configuration)) + { + throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(configuration)); + } + + return compilerOptionsProvider.GetCompilerOptions( + applicationEnvironment.ApplicationName, + applicationEnvironment.RuntimeFramework, + configuration) + .ToCompilationSettings(applicationEnvironment.RuntimeFramework, applicationEnvironment.ApplicationBasePath); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs b/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs index 1a9dd35d06..bacd815042 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/Compilation/RoslynCompilationService.cs @@ -39,6 +39,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation private readonly IFileProvider _fileProvider; private readonly Lazy> _applicationReferences; private readonly string _classPrefix; + private readonly string _configuration; #if DOTNET5_5 private readonly RazorLoadContext _razorLoadContext; @@ -69,6 +70,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation _compilerOptionsProvider = compilerOptionsProvider; _fileProvider = optionsAccessor.Value.FileProvider; _classPrefix = host.MainClassNamePrefix; + _configuration = optionsAccessor.Value.Configuration; #if DOTNET5_5 _razorLoadContext = new RazorLoadContext(); @@ -89,7 +91,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation } var assemblyName = Path.GetRandomFileName(); - var compilationSettings = _compilerOptionsProvider.GetCompilationSettings(_environment); + var compilationSettings = _compilerOptionsProvider.GetCompilationSettings(_environment, _configuration); var syntaxTree = SyntaxTreeGenerator.Generate( compilationContent, assemblyName, diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptions.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptions.cs index 20663aa5b8..39327befb5 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptions.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptions.cs @@ -14,6 +14,8 @@ namespace Microsoft.AspNet.Mvc.Razor { private IFileProvider _fileProvider; + private string _configuration; + /// /// Get a used by the . /// @@ -42,5 +44,26 @@ namespace Microsoft.AspNet.Mvc.Razor _fileProvider = value; } } + + /// + /// Gets or sets the configuration name used by to compile razor views. + /// + /// + /// At startup, this is initialized to "Debug" if service is + /// registred and environment is development () else it is set to + /// "Release". + /// + public string Configuration + { + get { return _configuration; } + set + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(value)); + } + _configuration = value; + } + } } } diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptionsSetup.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptionsSetup.cs index 59ef2e9c89..5925e1d9a3 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptionsSetup.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngineOptionsSetup.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Mvc.Razor; using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.PlatformAbstractions; @@ -17,16 +18,26 @@ namespace Microsoft.AspNet.Mvc /// Initializes a new instance of . /// /// for the application. - public RazorViewEngineOptionsSetup(IApplicationEnvironment applicationEnvironment) - : base(options => ConfigureRazor(options, applicationEnvironment)) + /// for the application. + public RazorViewEngineOptionsSetup(IApplicationEnvironment applicationEnvironment, IHostingEnvironment hostingEnvironment) + : base(options => ConfigureRazor(options, applicationEnvironment, hostingEnvironment)) { } private static void ConfigureRazor( RazorViewEngineOptions razorOptions, - IApplicationEnvironment applicationEnvironment) + IApplicationEnvironment applicationEnvironment, + IHostingEnvironment hostingEnvironment) { razorOptions.FileProvider = new PhysicalFileProvider(applicationEnvironment.ApplicationBasePath); + if (hostingEnvironment.IsDevelopment()) + { + razorOptions.Configuration = "Debug"; + } + else + { + razorOptions.Configuration = "Release"; + } } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/TestApplicationEnvironment.cs index 4b83042c8d..95e2c16252 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/TestApplicationEnvironment.cs @@ -33,14 +33,6 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public string ApplicationBasePath { get; } - public string Configuration - { - get - { - return _original.Configuration; - } - } - public FrameworkName RuntimeFramework { get @@ -48,15 +40,5 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests return _original.RuntimeFramework; } } - - public object GetData(string name) - { - return _original.GetData(name); - } - - public void SetData(string name, object value) - { - _original.SetData(name, value); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/Compilation/RoslynCompilationServiceTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/Compilation/RoslynCompilationServiceTest.cs index 64c10a3e06..799bc4d594 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/Compilation/RoslynCompilationServiceTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/Compilation/RoslynCompilationServiceTest.cs @@ -19,6 +19,8 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation { public class RoslynCompilationServiceTest { + private const string ConfigurationName = "Release"; + [Fact] public void Compile_ReturnsCompilationResult() { @@ -33,7 +35,7 @@ public class MyTestType {}"; .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions()); var mvcRazorHost = new Mock(); mvcRazorHost.SetupGet(m => m.MainClassNamePrefix) @@ -73,7 +75,7 @@ this should fail"; .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions()); var mvcRazorHost = Mock.Of(); var fileProvider = new TestFileProvider(); @@ -112,7 +114,7 @@ this should fail"; .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions()); var mvcRazorHost = Mock.Of(); @@ -154,7 +156,7 @@ this should fail"; .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions()); var mvcRazorHost = Mock.Of(); @@ -203,7 +205,7 @@ public class MyNonCustomDefinedClass {} .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions { Defines = new[] { "MY_CUSTOM_DEFINE" } }); var mvcRazorHost = new Mock(); mvcRazorHost.SetupGet(m => m.MainClassNamePrefix) @@ -242,7 +244,7 @@ public class NotRazorPrefixType {}"; .Setup(p => p.GetCompilerOptions( applicationEnvironment.ApplicationName, applicationEnvironment.RuntimeFramework, - applicationEnvironment.Configuration)) + ConfigurationName)) .Returns(new CompilerOptions()); var mvcRazorHost = new Mock(); mvcRazorHost.SetupGet(m => m.MainClassNamePrefix) @@ -397,9 +399,6 @@ public class NotRazorPrefixType {}"; applicationEnvironment .SetupGet(a => a.RuntimeFramework) .Returns(new FrameworkName("ASPNET", new Version(5, 0))); - applicationEnvironment - .SetupGet(a => a.Configuration) - .Returns("Debug"); applicationEnvironment .SetupGet(a => a.ApplicationBasePath) .Returns("MyBasePath"); @@ -411,7 +410,8 @@ public class NotRazorPrefixType {}"; { var razorViewEngineOptions = new RazorViewEngineOptions { - FileProvider = fileProvider ?? new TestFileProvider() + FileProvider = fileProvider ?? new TestFileProvider(), + Configuration = ConfigurationName }; var options = new Mock>(); options diff --git a/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs b/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs index 660dd34e4f..fc31fbdab6 100644 --- a/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs +++ b/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Linq; using System.Xml.Linq; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Internal; using Microsoft.AspNet.Mvc.ModelBinding; @@ -237,6 +238,7 @@ namespace Microsoft.AspNet.Mvc serviceCollection.AddSingleton(Mock.Of()); serviceCollection.AddSingleton(Mock.Of()); serviceCollection.AddSingleton(Mock.Of()); + serviceCollection.AddSingleton(Mock.Of()); var applicationEnvironment = new Mock(); // ApplicationBasePath is used to set up a PhysicalFileProvider which requires diff --git a/test/Microsoft.AspNet.Mvc.Test/RazorViewEngineOptionsSetupTest.cs b/test/Microsoft.AspNet.Mvc.Test/RazorViewEngineOptionsSetupTest.cs index 7bdbb4a1ac..033e0e895d 100644 --- a/test/Microsoft.AspNet.Mvc.Test/RazorViewEngineOptionsSetupTest.cs +++ b/test/Microsoft.AspNet.Mvc.Test/RazorViewEngineOptionsSetupTest.cs @@ -3,6 +3,7 @@ using System.IO; using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Mvc.Razor; using Microsoft.Extensions.PlatformAbstractions; using Moq; @@ -20,7 +21,10 @@ namespace Microsoft.AspNet.Mvc var appEnv = new Mock(); appEnv.SetupGet(e => e.ApplicationBasePath) .Returns(Directory.GetCurrentDirectory()); - var optionsSetup = new RazorViewEngineOptionsSetup(appEnv.Object); + var hostingEnv = new Mock(); + hostingEnv.SetupGet(e => e.EnvironmentName) + .Returns("Development"); + var optionsSetup = new RazorViewEngineOptionsSetup(appEnv.Object, hostingEnv.Object); // Act optionsSetup.Configure(options); @@ -29,5 +33,28 @@ namespace Microsoft.AspNet.Mvc Assert.NotNull(options.FileProvider); Assert.IsType(options.FileProvider); } + + [Theory] + [InlineData("Development", "Debug")] + [InlineData("Staging", "Release")] + [InlineData("Production", "Release")] + public void RazorViewEngineOptionsSetup_SetsCorrectConfiguration(string environment, string expectedConfiguration) + { + // Arrange + var options = new RazorViewEngineOptions(); + var appEnv = new Mock(); + appEnv.SetupGet(e => e.ApplicationBasePath) + .Returns(Directory.GetCurrentDirectory()); + var hostingEnv = new Mock(); + hostingEnv.SetupGet(e => e.EnvironmentName) + .Returns(environment); + var optionsSetup = new RazorViewEngineOptionsSetup(appEnv.Object, hostingEnv.Object); + + // Act + optionsSetup.Configure(options); + + // Assert + Assert.Equal(expectedConfiguration, options.Configuration); + } } } \ No newline at end of file