1819 次浏览
.NET项目发布:根据客户参数动态排除或引用文件
摘要
本文介绍如何在 .NET 项目中,根据客户参数动态排除或包含文件,实现定制化发布与打包,适用于多客户网站开发场景。
在为 MSites 制作项目打包发布脚本时,设计了以客户名称作为打包参数,将与客户相关的样式、资源、图标等文件,动态地发布到最终 Release 包中。
但这个版本只是处理了静态文件资源或样式文件,对于项目包含的文件没有处理,这就会导致一个问题:不同客户有些组件文件是单独定制的,无法直接应用到其他客户版本上。 这就需要在编辑 .NET 程序时,能根据配置文件,将一些文件排除掉。要实现这个功能,其实很简单,只需要在 .csproj 动态包含打包时客户的配置文件即可。
目录结构示例
sites/
├─ customA/
├─ customB/
src/
└─ Web/
web.csproj
客户 build.targets 示例
在 sites/customX/build.targets 中,列出要排除的文件:
<Project>
<ItemGroup>
...
<Compile Remove="Views\Shared\Components\Breadcrumb\Blog.cshtml" />
<None Remove="Views\Shared\Components\Breadcrumb\Blog.cshtml" />
...
</ItemGroup>
</Project>
注意:
- Compile:会被编译的文件
- Content:内容文件
- None:其他类型文件
最简单的办法是先在 Visual Studio 中手工排除文件,然后用文本编辑器打开 .csproj,复制相应的 ItemGroup 到 build.targets 即可。
.csproj 配置示例
<project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<!-- 默认客户端 -->
<client condition="'$(Client)' == ''">default</client>
<!-- 客户配置文件路径 -->
<clientconfig>../../sites/$(Client)/build.targets</clientconfig>
</propertygroup>
<!-- 动态导入客户专属配置 -->
<import project="$(ClientConfig)" condition="Exists('$(ClientConfig)')">
</import></project>
注意事项:
- 确保
ClientConfig路径正确。 $(Client)的值在发布时由参数指定。
编译发布命令示例
dotnet publish -c Release -o "d:/publish/felixblog" --self-contained false --verbosity minimal -p:IsProduction=true -p:Client=felixblog
这样,在编译时就会引用 sites/felixblog/build.targets 中排除或包含的文件,非常方便适合多客户项目。