.NET 6新特性试用 | Nuget包验证

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET 6新特性试用 | Nuget包验证相关的知识,希望对你有一定的参考价值。

前言

我们常常需要将.NET类库打包成Nuget包,以便多个项目公用。

一旦修改类库,尽管代码可以运行,并成功打包成新版本,看起来一切正常,但是你无法保证该更改是安全且兼容的。

而在.Net 6中,提供了包验证工具,帮助我们检测这一点。

Demo

使用方式也非常简单,只需修改项目文件,加上EnablePackageValidation属性:

<EnablePackageValidation>true</EnablePackageValidation>

包验证工具提供了三种验证器:

  • Baseline version validator:根据先前发布的稳定版本的软件包验证类库项目。

  • Compatible runtime validator:验证特定于运行时的实现程序集是否彼此兼容以及是否与编译时程序集兼容。

  • Compatible framework validator: 验证针对一个框架版本编译的代码同样可以在包中的所有其他框架版本上运行。

以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");
    

结论

包验证工具允许开发人员在包开发过程中验证他们的包是否一致且格式良好。它允许开发人员根据以前的版本、框架的版本和运行时来验证包。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

以上是关于.NET 6新特性试用 | Nuget包验证的主要内容,如果未能解决你的问题,请参考以下文章

.NET 6新特性试用 | 总结:我最喜欢的5个特性

.NET 6新特性试用 | 自动生成高性能日志记录代码

.NET 6新特性试用 | 常量内插字符串

.NET 6新特性试用 | 文件范围的命名空间

.NET 6新特性试用 可写JSON DOM API

.NET 6新特性试用 | System.Text.Json序列化代码自动生成