1818 次浏览

.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 中排除或包含的文件,非常方便适合多客户项目。