我们看上面的定义, 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.203
major - 优先套用 minor 策略;如果不存在,就使用已安装的最大版本 x.x.xxx,如本例中的3.1.101
最新策略(最宽松的策略):
latestPatch - 始终使用相同主、副、特征版本下的最高版本 2.1.6xx
latestFeature - 始终使用相同主、副版本下的最高版本 2.1.xxx
latestMinor - 始终使用相同主版本下的最高版本 2.x.xxx
latestMajor - 始终使用已安装的最高版本
出于对 .Net Core 3.0 以前的配置进行兼容,以前的设置会自动采用 latestMajor 设置。
三、总结一般来说,应用开发中尽可能不要使用global.json。因为限定了运行时版本,会让生产环境变得复杂。
如果必须使用global.json,以我的经验,建议指定最低的 SDK 版本,并适当地应用 latestMinor 或 latestFeature 策略。这可能确保项目可以由更多的 SDK 版本进行构建和运行。
(全文完)
微信公众号:老王Plus