.NET 6 API中如何锁定Microsoft.NETCore.App.Runtime.win-x64等包版本
这些包的来源
Microsoft.NETCore.App.Runtime.win-x64、Microsoft.AspNetCore.Runtime.win-x64、Microsoft.WindowsDesktop.Runtime.win-x64是.NET 6的平台特定运行时框架包,属于.NET SDK的隐式依赖,并非手动添加的显式NuGet包。它们是微软针对win-x64平台发布的运行时组件,用于支撑.NET应用在该平台上的运行,会随着.NET的月度更新自动被SDK拉取,因此不会出现在项目文件或包配置文件中。
锁定版本的方法
以下几种方式可以让你的解决方案固定使用特定版本(如6.0.8),直到你主动升级:
1. 项目文件中指定运行时版本
在API项目的.csproj文件里添加RuntimeFrameworkVersion属性,强制锁定运行时版本:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <RuntimeFrameworkVersion>6.0.8</RuntimeFrameworkVersion> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 若需发布到特定平台则添加 --> </PropertyGroup> </Project>
这个配置会让项目强制使用指定版本的.NET运行时,包括对应的平台特定运行时包。
2. 用NuGet.config强制指定包版本
在解决方案根目录的NuGet.config中添加包版本锁定规则,直接指定这三个包的版本:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="PrivateNuGet" value="你的私有NuGet服务器地址" /> </packageSources> <packageVersion> <add key="Microsoft.NETCore.App.Runtime.win-x64" version="6.0.8" /> <add key="Microsoft.AspNetCore.Runtime.win-x64" version="6.0.8" /> <add key="Microsoft.WindowsDesktop.Runtime.win-x64" version="6.0.8" /> </packageVersion> </configuration>
NuGet还原时会严格遵循这个配置,不会自动拉取最新版本的包。
3. 使用NuGet锁定文件(packages.lock.json)
启用NuGet锁定文件功能,生成记录所有依赖精确版本的锁定文件,并强制CI构建使用该文件:
在项目文件中添加:
<PropertyGroup> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <RestoreLockedMode>true</RestoreLockedMode> </PropertyGroup>
执行一次包还原后,会生成packages.lock.json文件,将其提交到代码仓库。后续CI构建时,NuGet会严格按照锁定文件中的版本还原所有依赖,包括隐式的运行时包。
4. 锁定.NET SDK版本
创建或修改项目根目录的global.json文件,指定固定的SDK版本(需选择与6.0.8运行时对应的SDK版本,比如6.0.305):
{ "sdk": { "version": "6.0.305", "rollForward": "disable" } }
rollForward: disable会禁止SDK自动升级到更高版本,间接锁定对应的运行时依赖版本。
注意事项
- 确保你的私有NuGet服务器已经包含这三个包的6.0.8版本,否则即使锁定版本,CI构建仍会因找不到包而失败。
- SDK版本与运行时版本存在对应关系,可通过微软官方的.NET版本矩阵确认匹配的版本号。
内容的提问来源于stack exchange,提问作者ankhansen

