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

目录
  • 前言:
  • Demo
  • 结论:

前言:

我们常常需要将.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}");
    }
}

结论:

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

到此这篇关于.NET 6新特性试用之Nuget包验证的文章就介绍到这了,更多相关 Nuget包验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 小白2分钟学会Visual Studio如何将引用包打包到NuGet上

    前言 之前我们说10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#),过程有些许繁琐,并且需要有一定的基础. 怎么办呢,不慌,看法宝. 两步完成打包上传操作:在类库方法创建成功后,我们的打包只需要两步就可以完成,并且都是点点点的操作. 两步完成打包上传操作 第一步:打包 编写好程序后,点击属性配置包的一些必要信息. 还是以"繁简体相互转换"为例.简单在重复一遍,看过之前的可以不需要看这一步. 我们首先创建一个可调用的类库,以&

  • 基于NET Core 的Nuget包制作、发布和运用流程解析(完整过程)

    目录 前期准备 Nuget包制作 上传Nuget包 Nuget包使用 (一).准备配置信息 (二).业务层调用 开发缘由:公司需要调用天眼查-开放平台 ,验证客户的的营业执照信息是否在存续期,并将企业基本信息返回,之后和使用百度图文识别的企业信息进行对照是否一致. 前期准备 在网站中注册后,需要够买套餐.之后点击个人中心进入,点击左侧的我的接口,找到申请接口点击选择你要使用的接口,此次使用的是企业基本信息. 存放Nuget包目前我已知的是1.NuGet官网https://www.nuget.or

  • .NET Core中创建和使用NuGet包的示例代码

    在.NET Core的项目中,如果我们要在项目中引用其它DLL文件,不建议直接在项目引用中添加DLL文件(虽然在.NET Core项目中也可以这么做),建议是去直接下载DLL文件所属的NuGet包.这样最大的好处是我们可以将要引用DLL文件的所有依赖文件也一起引入到项目中,这样保证了引用文件的完整性,让其可以正确地运行. 下面我们通过一个.NET Core类库项目和一个ASP.NET Core项目,来演示怎么发布一个NuGet包,并在项目中引用该NuGet包. 首先我们新建一个.NET Core

  • 10分钟学会VS NuGet包私有化部署

    目录 前言 什么是BaGet 搭建私有化BaGet服务器 使用私有化程序包 前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的. 命令版本:10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#) web版本(推荐):小白2分钟学会Visual Studio将引用包打包到NuGet上 其实官方也提供了私有化部署(NuGet.Server.ProGet.MyGe等),我们就来基于BaGet进

  • ASP.NET MVC学习之NuGet在VS中的运用浅谈

    为什么要使用NuGet 简单的说NuGet可以是我们的工作更方便,当我们的项目里要引用到的一些库时候,比如JQuery.Newtonsoft.Json.log4net等,我们需要从网上下载这些库,然后依次拷贝到各个项目中,当有的类库有更新时又不得不再重复一遍很是繁琐 ,这时就可以考虑使用NuGet来帮我们管理和更新这些类库,而且更新类库时会自动添加类库的相关引用,方便至极.当然网上一些我们常用的类库更新频率不是很高而且即便出了新版本我们也没必要总是保持最新,故这点对我们的帮助比较有限,个人认为N

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

    目录 前言: Demo 结论: 前言: 我们常常需要将.NET类库打包成Nuget包,以便多个项目公用. 一旦修改类库,​尽管代码可以运行​,并成功打包成新版本​,看起来一切正常​,​但是​你无法保证该更改是安全且兼容的. 而在.Net 6中,提供了包验证工具,帮助我们检测这一点. Demo 使用方式也非常简单,只需修改项目文件,加上​​EnablePackageValidation​​属性: <EnablePackageValidation>true</EnablePackageVal

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

    目录 前言: 一.常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之TryGetNonEnumeratedCount 方法

    目录 前言: 一.举例 二.原理 结论: 前言: .NET 6新增了​​TryGetNonEnumeratedCount​​方法,计算可枚举类型的元素总数. LINQ不是已经有了​​Count​​方法吗,为什么还要画蛇添足呢? 下文来看看具体情况!!! 一.举例 尝试下列代码: var b = new B<int>(); Console.WriteLine($@"{b.Count()}"); var a = new A<int>(); Console.Write

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

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

    目录 前言: 常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此,推

  • .NET 6新特性试用Timer类之PeriodicTimer 

    目录 前言: 一.Demo 结论: 前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer 不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​. 这又是为什么呢? 一.Demo 与其他T

  • java8新特性教程之time包使用总结

    前言 Java8新特性java.time.*包学习. 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9.10.11相继出来,长江后浪推前浪一浪胜过一浪.之前date的使用还不敢自信说多透彻,后续都是泪...(欢迎酱油...) 以jdk1.8.0_111为例 新的设计思路 引入final定义支持时间点不可变和线程安全,长久来的Date的设计一直遭人诟病着: 设计LocalDate.LocalDateTime.LocalTime.instant.Clock.Du

随机推荐