网站名称查询,最新网站建设语言,创建公司官网,wordpress水印怎么加Dotnet Core的SDK版本总在升级#xff0c;怎么使用一个特定的版本呢#xff1f;假期过完了#xff0c;心情还在。今天写个短的。一、前言写这个是因为昨天刷微软官方文档#xff0c;发现global.json在 SDK 3.0 后#xff0c;更新了一些内容。文档提到了这个更新#xff0… Dotnet Core的SDK版本总在升级怎么使用一个特定的版本呢 假期过完了心情还在。今天写个短的。一、前言写这个是因为昨天刷微软官方文档发现global.json在 SDK 3.0 后更新了一些内容。文档提到了这个更新但规则说的不太清楚所以研究了一下成了这个文章。 先普及一下 .Net Core Runtime 和 .Net Core SDK 的区别如果清楚这段可以直接跳过。我们用命令% dotnet --list-sdks
查看已安装的Dotnet框架时会查到类似于下面的内容1.1.14 [/usr/local/share/dotnet/sdk]
2.1.600 [/usr/local/share/dotnet/sdk]
2.1.602 [/usr/local/share/dotnet/sdk]
2.1.604 [/usr/local/share/dotnet/sdk]
2.1.700 [/usr/local/share/dotnet/sdk]
2.1.801 [/usr/local/share/dotnet/sdk]
2.2.203 [/usr/local/share/dotnet/sdk]
3.0.100 [/usr/local/share/dotnet/sdk]
3.1.101 [/usr/local/share/dotnet/sdk]
可以看到我们安装了两类的东西.Net Core SDK 和 .Net Core Runtime并且各自对应的版本。其实SDK 和 Runtime 各有各的用处.Net Core Runtime - 运行时框架。顾名思义就是.Net Core应用运行时需要使用的框架/库。这个框架很小只能用于运行编译后的代码。也就是说编译后的程序运行时会调用这个框架里的库。.Net Core SDK - 这个框架很大是用来做除了运行以外的其它部分编译、调试应用以下管理NuGet包等等。当我们开发时主要用的是这个框架。所以在开发机器上我们就需要安装 SDK 和 Runtime 两个框架而在生产机器上就仅安装 Runtime 就好了。同时SDK 和 Runtime 是对应的一个特定版本的 SDK总会对应一个特定版本的 Runtime。在微软的体系中.Net Core SDK 是向后兼容的SDK 3.1 完全可以用来构建 SDK 2.2 类似的应用程序。换句话说通常不用指定特定版本的SDK来构建应用用最高的版本就可以。但是因为不同的版本有不同的支持内容和不同的特性所以总有些应用是无法兼容的。因此需要指定特定的 Runtime 版本。二、指定特定的SDK版本前面说了因为 SDK 向后兼容通常我们不需要关心安装了哪个版本的 SDK。但是总有一些情况会出现特定版本的BUG、特性变化、项目模板的改变等导致项目需要某一特定的 SDK 版本。这个时候我们会用到global.json。应用在执行时dotnet.exe会在项目目录中查找global.json文件并根据global.json文件的内容来决定使用哪个 SDK 版本来运行应用。当global.json不存在时就使用当前最新的 SDK 版本。 按照微软的说法应用SDK版本的规则如下安装了哪个版本的SDKglobal.json定义使用哪个版本的SDK当前SDK版本的前滚策略是什么是否允许使用预发布版本我们也依照这些因素来说明这个问题。2.1 检查已安装的版本在本文开头给出了一个命令% dotnet --list-sdks
这个命令可以列出已经安装的所有 SDK 及版本号。 微软的版本号会有点复杂这里举个例子解释一下2.1.602最前边的 2是主版本号中间的 1是副版本号后面的三个数中第一个数是特征版本号在本例子中是6后面三个数中后两个数是补丁版本号在本例中是02表示第6个特征版本的第2个补丁。通常我们在说版本时一般说到的就是主版本号和副版本号。比方 .Net Core SDK 3.1就是指主版本为3副版本为1的版本。这个版本号在前滚策略中会很重要。2.2 global.jsonglobal.json文件从 .Net Core 1.0就开始引入了。早期.Net Core 3.0之前的内容很简单{sdk: {version: 2.1.600}
}
在这个版本中global.json文件仅定义了应用使用哪个版本的 SDK。运行时如果安装对应版本的 SDK就会正常使用 SDK 并启动。如果不存在对应的 SDK则会报错A compatible installed .NET Core SDK for global.json version [2.1.600] from [.\global.json] was not found
Install the [2.1.600] .NET Core SDK or update [.\global.json] with an installed .NET Core SDK
这个阶段的global.json使用单一版本号并且不支持通配符。在一定程序上这个设置可以解决一些版本方面的问题。但也带来了新的问题。我们看上面的定义 version 字段的值定义到了版本号的特征版本号和补丁版本号。也就是说它定义了单一的一个精确版本号。这使得我们不能使用同主副版本的其它任何 SDK 版本哪怕它是一个更好或更新的版本。 这个问题在 .Net Core 3.0 后有了新的改善。.Net Core 3.0 后global.json增加了两个字段rollForward和allowPrerelease{sdk: {version: 2.1.600,allowPrerelease: true,rollForward: patch}
}
在这个设置有三个参数version : 设置的特定版本。如果没有设置将采用安装的最高版本allowPrerelease 计算使用版本时是否考虑使用 prerelease或preview的SDK版本rollForward 要应用的前滚策略 这是微软对global.json参数判断的流程供参考。 下面我们重点说一下前滚策略参数。2.3 前滚策略参数前滚策略用于确定在请求给定版本时应该选择已安装的 SDK 中的哪一个。通过更改前滚策略您可以放松或收紧选择条件。这个说法有点抽象我们举几个例子来说。在 .Net Core 3.0中前滚策略有三个类九个值:禁用策略disable - 禁用前滚。如果没有确定的版本就报错。也就是说不允许使用除指定的版本外的其它任何版本。保守策略比禁用要宽松一点patch - 如果版本不存在就使用相同主、副、特征版本下的最高版本没有就报错。以上面的例子来说会使用 2.1.604 版本feature - 优先套用 patch 策略如果不存在就使用主、次版本相同的下一个特征版本如 2.1.7xx没有就报错minor - 优先套用 feature 策略如果不存在就使用主版本相同的最大版本 2.x.xxx如本例中的 2.2.203major - 优先套用 minor 策略如果不存在就使用已安装的最大版本 x.x.xxx如本例中的3.1.101最新策略最宽松的策略latestPatch - 始终使用相同主、副、特征版本下的最高版本 2.1.6xxlatestFeature - 始终使用相同主、副版本下的最高版本 2.1.xxxlatestMinor - 始终使用相同主版本下的最高版本 2.x.xxxlatestMajor - 始终使用已安装的最高版本出于对 .Net Core 3.0 以前的配置进行兼容以前的设置会自动采用 latestMajor 设置。三、总结一般来说应用开发中尽可能不要使用global.json。因为限定了运行时版本会让生产环境变得复杂。如果必须使用global.json以我的经验建议指定最低的 SDK 版本并适当地应用 latestMinor 或 latestFeature 策略。这可能确保项目可以由更多的 SDK 版本进行构建和运行。全文完喜欢就来个三连让更多人因你而受益