时间:2023-03-15 09:25:01 | 栏目:.NET代码 | 点击:次
我们常常需要将.NET类库打包成Nuget包,以便多个项目公用。
一旦修改类库,?尽管代码可以运行?,并成功打包成新版本?,看起来一切正常?,?但是?你无法保证该更改是安全且兼容的。
而在.Net 6中,提供了包验证工具,帮助我们检测这一点。
使用方式也非常简单,只需修改项目文件,加上??EnablePackageValidation??属性:
<EnablePackageValidation>true</EnablePackageValidation>
包验证工具提供了三种验证器:
以Baseline version validator为例。假设1.0.0版本有如下方法:
public class Class1 { public void Demo(string param1) { Console.WriteLine("Demo 1.0.0: {param1}"); } }
当我们接到需求,为??Demo??方法增加了参数:
public class Class1 { public static void Demo(string param1, string param2) { Console.WriteLine("Demo 1.1.0: {param1} {param2}"); } }
代码逻辑没有问题,但是当我们发布1.1.0版本后,而引用了这个包的项目也包含引用过1.0.0版本的其他类库。那么运行时很可能收到如下异常:
现在让我们加上??Baseline version validator??。修改类库项目文件内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <PackageVersion>1.1.0</PackageVersion> <EnablePackageValidation>true</EnablePackageValidation> <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion> </PropertyGroup> </Project>
??PackageValidationBaselineVersion??
就是用于对比的基线版本。
再次使用??dotnet pack??打包,你将会收到类似如下错误提示:
error CP0002: Member 'ClassLibrary1.Class1.Demo(string)' exists on [Baseline] lib/net6.0/ClassLibrary1.dll but not on lib/net6.0/ClassLibrary1.dll
按照消息提示的那样,我们可以修改成如下代码进行修复:
public class Class1 { public static void Demo(string param1) { Demo(param1,""); } public static void Demo(string param1, string param2) { Console.WriteLine("Demo 1.1.0: {param1} {param2}"); } }
?包验证工具允许开发人员在包开发过程中验证他们的包是否一致且格式良好。它允许开发人员根据以前的版本、框架的版本和运行时来验证包。??