You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让消费者通过条件编译符号控制Blazor包的依赖项?

用编译符号生成依赖隔离的多版本包方案

完全可以通过编译配置+条件依赖的方式实现,让消费者通过定义指定符号选择对应的序列化库依赖,同时避免包体积冗余,具体步骤如下:

1. 项目文件中配置条件依赖与编译符号

在你的Fluxor.Web.Blazor.ReduxDevTools项目文件里,用<Choose>/<When>块实现依赖的条件引入,同时自动注入对应编译符号:

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

  <Choose>
    <!-- 当消费者定义Fluxor_NewtonsoftJson时,引入Newtonsoft.Json依赖 -->
    <When Condition="$(DefineConstants.Contains('Fluxor_NewtonsoftJson'))">
      <ItemGroup>
        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" PrivateAssets="none" />
      </ItemGroup>
    </When>
    <!-- 默认使用System.Text.Json,自动注入对应符号 -->
    <Otherwise>
      <ItemGroup>
        <PackageReference Include="System.Text.Json" Version="7.0.3" PrivateAssets="none" />
      </ItemGroup>
      <PropertyGroup>
        <DefineConstants>$(DefineConstants);Fluxor_SystemTextJson</DefineConstants>
      </PropertyGroup>
    </Otherwise>
  </Choose>
</Project>

2. 代码中实现条件编译分支

在序列化核心逻辑处,用编译符号区分两种实现,确保最终编译产物只包含选中的序列化代码:

internal static class ReduxDevToolsSerialization
{
    public static string SerializeState(object state)
    {
#if Fluxor_NewtonsoftJson
        return Newtonsoft.Json.JsonConvert.SerializeObject(state, new Newtonsoft.Json.JsonSerializerSettings
        {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        });
#else
        return System.Text.Json.JsonSerializer.Serialize(state, new System.Text.Json.JsonSerializerOptions
        {
            ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles
        });
#endif
    }

    public static T DeserializeState<T>(string json)
    {
#if Fluxor_NewtonsoftJson
        return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
#else
        return System.Text.Json.JsonSerializer.Deserialize<T>(json);
#endif
    }
}

3. 打包与消费者使用

  • 打包:你可以通过命令行生成不同变体的包,比如生成Newtonsoft版本:
    dotnet pack /p:DefineConstants=Fluxor_NewtonsoftJson /p:PackageVersion=1.0.0-newtonsoft
    
    生成System.Text.Json版本(默认):
    dotnet pack /p:PackageVersion=1.0.0-systemtextjson
    
  • 消费者使用:如果让主包支持条件依赖,消费者只需在自己的Blazor项目中添加编译符号即可:
    在消费者的项目文件中加入:
    <PropertyGroup>
      <DefineConstants>$(DefineConstants);Fluxor_NewtonsoftJson</DefineConstants>
    </PropertyGroup>
    
    此时NuGet会自动引入对应依赖,你的库也只会编译选中的序列化逻辑,完全剔除另一个库的代码和依赖,有效减少Blazor应用的payload体积。

内容的提问来源于stack exchange,提问作者Peter Morris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:55:18