引言
通常我们在做项目时会给不同的程序员分配不同的功能模块进行各自开发,当然要遵守一定的约定或同一的框架设计。这在同一个工程中就会出现不同的项目类库需要引用,而这些类库可能会引用一些Nuget包,对于这些包的管理如果都在每个项目中去定义版本就会显得麻烦,如果引用了不同的版本可能会导致意想不到的错误,并且查看这些包的版本也非常不方便。
同时如果我们需要做目标多框架类库时,不同的框架有些包时是都支持的而有些有需要特定版本。
1、中央包管理
在项目中添加文本文件,根据官方介绍,写入以下内容:
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
然后将文件名改为:Directory.Packages.props。将该文件关闭打开一次
VS会自动识别到该文件,对Nuget包进行管理,此时你如果在项目中指定了包版本将会提示错误,我们需要将各个包的版本定义在中央包管理文件中。
<ItemGroup>
<PackageVersion Include="Autofac" Version="7.1.0" />
<PackageVersion Include="HandyControl.Lang.en" Version="3.5.1" />
<PackageVersion Include="log4net" Version="2.0.17" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Web.Administration" Version="11.1.0" />
<PackageVersion Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.122" />
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
<PackageVersion Include="MySql.Data" Version="9.0.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageVersion Include="DotNetProjects.SVGImage" Version="5.2.1" />
<PackageVersion Include="HandyControl" Version="3.5.1" />
<PackageVersion Include="NModbus" Version="3.0.81" />
<PackageVersion Include="System.IO.Ports" Version="8.0.0" />
<PackageVersion Include="System.Management" Version="8.0.0" />
<PackageVersion Include="System.Reactive" Version="6.0.1-preview.1" />
<PackageVersion Include="System.Threading.Channels" Version="9.0.0-preview.3.24172.9" />
</ItemGroup>
2、多目标框架
2.1、项目升级
这里如果我们的项目是.Net Framework项目需要将我们的项目升级为新的管理模式。.NET 升级助手概述 - .NET Core | Microsoft Learn
2.2、多目标框架
需要:TargetFramework => TargetFrameworks 变复数
可参考下面代码,这里有net8.0-windows;net48;net472;net462四个目标框架
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-windows;net48;net472;net462</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" />
<PackageReference Include="HandyControl" />
<PackageReference Include="log4net" />
<PackageReference Include="Microsoft.Web.Administration" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="System.IO.Ports" />
<PackageReference Include="System.Management" />
<PackageReference Include="ValueConverters" />
</ItemGroup>
</Project>
2.3、Nuget包管理
此时出现了一些问题,
对于一些包比如 Microsoft.CSharp、System.Data.DataSetExtensions这两个包net8是不需要的,而又是net48;net472;net462必须。
对于一些包比如 ValueConverters,net8、net48可用3.0.26版本,而3.0.26版本不支持net472、net462。这里我们可以这样定义:
<!--通用的版本-->
<ItemGroup>
<PackageVersion Include="Autofac" Version="7.1.0" />
<PackageVersion Include="HandyControl.Lang.en" Version="3.5.1" />
<PackageVersion Include="log4net" Version="2.0.17" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Web.Administration" Version="11.1.0" />
<PackageVersion Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.122" />
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
<PackageVersion Include="MySql.Data" Version="9.0.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageVersion Include="DotNetProjects.SVGImage" Version="5.2.1" />
<PackageVersion Include="HandyControl" Version="3.5.1" />
<PackageVersion Include="NModbus" Version="3.0.81" />
<PackageVersion Include="System.IO.Ports" Version="8.0.0" />
<PackageVersion Include="System.Management" Version="8.0.0" />
<PackageVersion Include="System.Reactive" Version="6.0.1-preview.1" />
<PackageVersion Include="System.Threading.Channels" Version="9.0.0-preview.3.24172.9" />
</ItemGroup>
<!--针对net48版本-->
<ItemGroup Condition="'$(TargetFramework)' == 'net48'">
<PackageVersion Include="Mapster" Version="7.2.0"/>
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0"/>
<PackageVersion Include="System.Data.DataSetExtensions" Version="4.5.0"/>
<PackageVersion Include="ValueConverters" Version="3.0.26" />
</ItemGroup>
<!--针对net472和net462版本-->
<ItemGroup Condition="'$(TargetFramework)' == 'net472' OR '$(TargetFramework)' == 'net462'">
<PackageVersion Include="ValueConverters" Version="2.2.10"/>
<PackageVersion Include="Mapster" Version="7.2.0"/>
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0"/>
<PackageVersion Include="System.Data.DataSetExtensions" Version="4.5.0"/>
</ItemGroup>
<!--针对net8-windows版本-->
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0-windows'">
<PackageVersion Include="Mapster" Version="7.4.1-pre01" />
<PackageVersion Include="ValueConverters" Version="3.0.26" />
</ItemGroup>
通过给ItemGroup 添加Condition来限定,注意其中的语法格式。
3、多框架代码区分
使用前置处理器指示词可以限定不同框架所使用的代码
C# 前置处理器指示词 | Microsoft Learn
#if NETFRAMEWORK
//代码
#endif
//代码
可指示不同的框架版本或NET/NETFRAMEWORK/NETCORE