如何在.NET Blazor Server发布后保留目录结构删除UserRepository下JSON文件
解决Blazor Server发布时保留目录结构但删除指定文件的问题
问题背景
项目目录结构如下:
\App_Data\Config\ \App_Data\SystemRepository\ \App_Data\UserRepository\
其中UserRepository包含多级子文件夹及JSON文件,需求是发布到文件夹时:
- 保留
UserRepository的完整子目录结构 - 删除其中所有JSON文件
之前尝试在csproj中添加如下配置,但会直接删除整个UserRepository文件夹:
<Target Name="RemoveJsonFilesAfterPublish" AfterTargets="Publish"> <ItemGroup> <JsonFilesToDelete Include="$(PublishDir)App_Data\UserRepository\**\*.json" /> </ItemGroup> <Delete Files="@(JsonFilesToDelete)" /> </Target>
解决方案
方案1:发布后清理文件并保留目录
在csproj中添加以下Target,先确保目录结构被保留,再删除JSON文件:
<Target Name="CleanUserRepositoryJsonFiles" AfterTargets="Publish"> <!-- 收集UserRepository下所有非JSON的项,提取目录路径 --> <ItemGroup> <UserRepoDirs Include="$(PublishDir)App_Data\UserRepository\**\*" Exclude="$(PublishDir)App_Data\UserRepository\**\*.json" /> </ItemGroup> <!-- 显式创建所有需要保留的子目录,防止空目录被MSBuild自动清理 --> <MakeDir Directories="@(UserRepoDirs->'%(RootDir)%(Directory)')" /> <!-- 删除所有JSON文件 --> <ItemGroup> <JsonFilesToDelete Include="$(PublishDir)App_Data\UserRepository\**\*.json" /> </ItemGroup> <Delete Files="@(JsonFilesToDelete)" /> </Target>
原因说明:之前的配置删除JSON文件后,MSBuild会自动清理空目录,导致整个UserRepository被删除。此方案先通过MakeDir强制创建所有子目录,再删除文件,确保结构完整。
方案2:发布阶段直接排除JSON文件(更高效)
不需要在发布后删除,直接在发布时不复制JSON文件,同时保留目录结构:
<ItemGroup> <!-- 排除UserRepository下的所有JSON文件,不参与发布 --> <Content Remove="App_Data\UserRepository\**\*.json" /> <!-- 显式包含所有子目录,确保发布时保留目录结构 --> <Content Include="App_Data\UserRepository\**\*" Exclude="App_Data\UserRepository\**\*.json" /> </ItemGroup>
这种方式从根源上避免JSON文件被发布,同时保证目录结构被保留,流程更简洁高效。
内容的提问来源于stack exchange,提问作者Mayur Ekbote
相关产品推荐
相关产品推荐

