如何让消费者通过条件编译符号控制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版本:
生成System.Text.Json版本(默认):dotnet pack /p:DefineConstants=Fluxor_NewtonsoftJson /p:PackageVersion=1.0.0-newtonsoftdotnet pack /p:PackageVersion=1.0.0-systemtextjson - 消费者使用:如果让主包支持条件依赖,消费者只需在自己的Blazor项目中添加编译符号即可:
在消费者的项目文件中加入:
此时NuGet会自动引入对应依赖,你的库也只会编译选中的序列化逻辑,完全剔除另一个库的代码和依赖,有效减少Blazor应用的payload体积。<PropertyGroup> <DefineConstants>$(DefineConstants);Fluxor_NewtonsoftJson</DefineConstants> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Peter Morris
相关产品推荐
相关产品推荐

