diff --git a/src/Components/Blazor/Build/src/targets/Publish.targets b/src/Components/Blazor/Build/src/targets/Publish.targets
index 75c0ed5feb..718a02e073 100644
--- a/src/Components/Blazor/Build/src/targets/Publish.targets
+++ b/src/Components/Blazor/Build/src/targets/Publish.targets
@@ -40,8 +40,17 @@
<_BlazorConfigPath>$(OutDir)$(AssemblyName).blazor.config
-
-
+
+
+ <_BlazorPublishConfigContent Include="." />
+ <_BlazorPublishConfigContent Include="$(AssemblyName)" />
+
+
+
diff --git a/src/Components/Blazor/Build/test/BuildIntegrationTests/BuildIntegrationTest.cs b/src/Components/Blazor/Build/test/BuildIntegrationTests/BuildIntegrationTest.cs
index ddd7fcb43b..1cc39f0d6e 100644
--- a/src/Components/Blazor/Build/test/BuildIntegrationTests/BuildIntegrationTest.cs
+++ b/src/Components/Blazor/Build/test/BuildIntegrationTests/BuildIntegrationTest.cs
@@ -28,6 +28,25 @@ namespace Microsoft.AspNetCore.Blazor.Build
Assert.FileExists(result, buildOutputDirectory, "dist", "_framework", "_bin", "Microsoft.Extensions.Logging.Abstractions.dll"); // Verify dependencies are part of the output.
}
+ [Fact]
+ public async Task Build_Hosted_Works()
+ {
+ // Arrange
+ using var project = ProjectDirectory.Create("blazorhosted", additionalProjects: new[] { "standalone", "razorclasslibrary", });
+ project.TargetFramework = "netcoreapp3.1";
+ var result = await MSBuildProcessManager.DotnetMSBuild(project);
+
+ Assert.BuildPassed(result);
+
+ var buildOutputDirectory = project.BuildOutputDirectory;
+ var blazorConfig = Path.Combine(buildOutputDirectory, "standalone.blazor.config");
+ Assert.FileExists(result, blazorConfig);
+
+ var path = Path.GetFullPath(Path.Combine(project.SolutionPath, "standalone", "bin", project.Configuration, "netstandard2.1", "standalone.dll"));
+ Assert.FileContains(result, blazorConfig, path);
+ Assert.FileDoesNotExist(result, buildOutputDirectory, "dist", "_framework", "_bin", "standalone.dll");
+ }
+
[Fact]
public async Task Build_WithLinkOnBuildDisabled_Works()
{
diff --git a/src/Components/Blazor/Build/test/BuildIntegrationTests/PublishIntegrationTest.cs b/src/Components/Blazor/Build/test/BuildIntegrationTests/PublishIntegrationTest.cs
index 9748e10963..2c2ddd7e97 100644
--- a/src/Components/Blazor/Build/test/BuildIntegrationTests/PublishIntegrationTest.cs
+++ b/src/Components/Blazor/Build/test/BuildIntegrationTests/PublishIntegrationTest.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Blazor.Build
public async Task Publish_WithDefaultSettings_Works()
{
// Arrange
- using var project = ProjectDirectory.Create("standalone", additionalProjects: new string[] { "razorclasslibrary" });
+ using var project = ProjectDirectory.Create("standalone", additionalProjects: new [] { "razorclasslibrary" });
var result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish");
Assert.BuildPassed(result);
@@ -39,11 +39,49 @@ namespace Microsoft.AspNetCore.Blazor.Build
Assert.FileExists(result, publishDirectory, "web.config");
}
+ [Fact]
+ public async Task Publish_WithNoBuild_Works()
+ {
+ // Arrange
+ using var project = ProjectDirectory.Create("standalone", additionalProjects: new[] { "razorclasslibrary" });
+ var result = await MSBuildProcessManager.DotnetMSBuild(project, "Build");
+
+ Assert.BuildPassed(result);
+
+ result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", "/p:NoBuild=true");
+
+ Assert.BuildPassed(result);
+
+ var publishDirectory = project.PublishOutputDirectory;
+ var blazorPublishDirectory = Path.Combine(publishDirectory, Path.GetFileNameWithoutExtension(project.ProjectFilePath));
+
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.boot.json");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.webassembly.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.wasm");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "standalone.dll");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "Microsoft.Extensions.Logging.Abstractions.dll"); // Verify dependencies are part of the output.
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify static web assets from referenced projects are copied.
+ // Uncomment once https://github.com/aspnet/AspNetCore/issues/17426 is resolved.
+ // Assert.FileExists(result, blazorPublishDirectory, "dist", "_content", "RazorClassLibrary", "wwwroot", "exampleJsInterop.js");
+ // Assert.FileExists(result, blazorPublishDirectory, "dist", "_content", "RazorClassLibrary", "styles.css");
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify web.config
+ Assert.FileExists(result, publishDirectory, "web.config");
+ }
+
[Fact]
public async Task Publish_WithLinkOnBuildDisabled_Works()
{
// Arrange
- using var project = ProjectDirectory.Create("standalone", additionalProjects: new string[] { "razorclasslibrary" });
+ using var project = ProjectDirectory.Create("standalone", additionalProjects: new [] { "razorclasslibrary" });
project.AddProjectFileContent(
@"
false
@@ -73,5 +111,83 @@ namespace Microsoft.AspNetCore.Blazor.Build
// Verify web.config
Assert.FileExists(result, publishDirectory, "web.config");
}
+
+ [Fact]
+ public async Task Publish_HostedApp_Works()
+ {
+ // Arrange
+ using var project = ProjectDirectory.Create("blazorhosted", additionalProjects: new[] { "standalone", "razorclasslibrary", });
+ project.TargetFramework = "netcoreapp3.1";
+ var result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish");
+
+ Assert.BuildPassed(result);
+
+ var publishDirectory = project.PublishOutputDirectory;
+ // Make sure the main project exists
+ Assert.FileExists(result, publishDirectory, "blazorhosted.dll");
+
+ var blazorPublishDirectory = Path.Combine(publishDirectory, "standalone");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.boot.json");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.webassembly.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.wasm");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "standalone.dll");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "Microsoft.Extensions.Logging.Abstractions.dll"); // Verify dependencies are part of the output.
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify static web assets from referenced projects are copied.
+ Assert.FileExists(result, publishDirectory, "wwwroot", "_content", "RazorClassLibrary", "wwwroot", "exampleJsInterop.js");
+ Assert.FileExists(result, publishDirectory, "wwwroot", "_content", "RazorClassLibrary", "styles.css");
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify web.config
+ Assert.FileExists(result, publishDirectory, "web.config");
+
+ var blazorConfig = Path.Combine(publishDirectory, "standalone.blazor.config");
+ Assert.FileContains(result, blazorConfig, ".");
+ }
+
+ [Fact]
+ public async Task Publish_HostedApp_WithNoBuild_Works()
+ {
+ // Arrange
+ using var project = ProjectDirectory.Create("blazorhosted", additionalProjects: new[] { "standalone", "razorclasslibrary", });
+ project.TargetFramework = "netcoreapp3.1";
+ var result = await MSBuildProcessManager.DotnetMSBuild(project, "Build");
+
+ Assert.BuildPassed(result);
+
+ result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", "/p:NoBuild=true");
+
+ var publishDirectory = project.PublishOutputDirectory;
+ // Make sure the main project exists
+ Assert.FileExists(result, publishDirectory, "blazorhosted.dll");
+
+ var blazorPublishDirectory = Path.Combine(publishDirectory, "standalone");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.boot.json");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "blazor.webassembly.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.wasm");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "wasm", "mono.js");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "standalone.dll");
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "_framework", "_bin", "Microsoft.Extensions.Logging.Abstractions.dll"); // Verify dependencies are part of the output.
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify static web assets from referenced projects are copied.
+ // Uncomment once https://github.com/aspnet/AspNetCore/issues/17426 is resolved.
+ // Assert.FileExists(result, publishDirectory, "wwwroot", "_content", "RazorClassLibrary", "wwwroot", "exampleJsInterop.js");
+ // Assert.FileExists(result, publishDirectory, "wwwroot", "_content", "RazorClassLibrary", "styles.css");
+
+ // Verify static assets are in the publish directory
+ Assert.FileExists(result, blazorPublishDirectory, "dist", "index.html");
+
+ // Verify web.config
+ Assert.FileExists(result, publishDirectory, "web.config");
+ }
}
}
diff --git a/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj b/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
index 5b7c3827ca..652888d604 100644
--- a/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
+++ b/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
@@ -47,6 +47,7 @@
<_TestAsset Include="..\testassets\standalone\standalone.csproj" />
+ <_TestAsset Include="..\testassets\blazorhosted\blazorhosted.csproj" />
+
+
+ netcoreapp3.1
+
+
+
+
+
+
+