Visual Studio发布时可使用共享项目wwwroot文件但构建运行时缺失如何解决
背景
我使用Visual Studio 2019进行开发,有一个C# Web APP Razor Pages项目,该项目引用了多个C#类库项目,以及一个用于存放多个关联Web App项目公共文件的C# Shared Project。
问题描述
将Web App项目发布到本地或远程IIS实例时一切正常,共享项目的所有文件都可正常加载运行;但仅执行构建/运行操作后在浏览器访问时,共享项目的Helper、Pages功能符合预期,唯独共享项目wwwroot下的所有文件全部缺失。
需求说明
我不想每次调试共享项目相关内容都需要执行本地发布操作,因此希望找到可行方案,让共享项目wwwroot文件夹的资源在构建/运行时也可正常使用,同时不能对当前已经正常工作的发布流程产生负面影响。
项目文件夹结构
发布后目录
- inetpub
- wwwroot
- MyNameSoftware
- wwwroot ← 发布时Web App和共享项目的所有wwwroot文件都会输出到此目录,运行正常
- MyNameSoftware
- wwwroot
源码目录
- MyName
- MyName.Common.Domain
- MyName.Common.Domain.csproj文件
- 存放类文件的各类文件夹及子文件夹
- MyName.Common.Domain.csproj文件
- MyName.Common.Presentation.Web
- MyName.Common.Presentation.Web.shproj文件
- Helpers ← 功能正常
- Pages ← 功能正常
- wwwroot ← 该目录下的文件发布时可用,但构建/运行时不可用
- aContainerFolder
- 其他不相关内容
- MyName.Software
- MyName.Software.sln
- 解决方案内其他相关项目对应的MyName.Software.{Purpose}文件夹
- MyName.Software.Web
- 其他各类文件夹及子文件夹
- wwwroot ← 该目录下的文件构建/运行和发布时都可正常使用
- MyName.Software.Web.csproj文件
- MyName.Common.Domain
可行解决方案
以下两种方案均不会影响现有正常的发布流程:
方案1:开发环境额外配置静态文件目录
在Web主项目的启动配置(.NET 6及以上为Program.cs,.NET 5及以下为Startup.cs)中,仅在开发环境新增共享项目wwwroot作为额外静态资源目录:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 仅开发环境加载共享项目静态资源,生产环境发布时已自动合并到主项目wwwroot无需额外配置 if (app.Environment.IsDevelopment()) { // 路径根据你的实际源码相对位置调整,当前示例为主项目到共享项目的相对路径 var sharedWwwrootPath = Path.Combine(builder.Environment.ContentRootPath, "..", "..", "MyName.Common.Presentation.Web", "wwwroot"); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(sharedWwwrootPath), RequestPath = "" }); } // 保留原有主项目静态文件配置 app.UseStaticFiles(); // 其余原有配置保持不变 app.Run();
方案2:Debug构建时自动复制共享静态资源到主项目
编辑主项目的.csproj文件,新增Debug模式下的构建前复制任务,将共享项目的wwwroot文件增量复制到主项目wwwroot目录:
<Project Sdk="Microsoft.NET.Sdk.Web"> <!-- 原有项目配置保持不变 --> <Target Name="CopySharedProjectStaticFiles" BeforeTargets="Build" Condition="'$(Configuration)' == 'Debug'"> <ItemGroup> <!-- 路径根据实际源码相对位置调整 --> <SharedStaticFiles Include="..\..\MyName.Common.Presentation.Web\wwwroot\**\*" /> </ItemGroup> <Copy SourceFiles="@(SharedStaticFiles)" DestinationFiles="@(SharedStaticFiles->'wwwroot\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True" /> </Target> </Project>
内容的提问来源于stack exchange,提问作者Becca
相关产品推荐
相关产品推荐

