VS 2022与.NET 7.0中传递性NuGet包更新问题咨询
针对传递性NuGet包管理问题的解决方案
问题1:无法查看传递性包的过时状态
你可以通过两种方式解决:
- 在Visual Studio的NuGet包管理器中,点击右上角的设置图标,进入“常规”设置面板,勾选**“显示传递性包的更新”**,过时的传递性包会和直接依赖包一同出现在“更新”标签页中。
- 使用.NET CLI命令行工具,执行
dotnet list package --outdated --include-transitive,该命令会列出所有直接依赖和传递性依赖的过时包,包含版本差异及安全漏洞提示(若存在)。
问题2:更新传递性包后变为直接依赖,导致自动卸载失效
直接在NuGet管理器中更新传递性包时,NuGet会自动将该包写入项目文件(.csproj)的<PackageReference>节点,使其成为直接依赖,自然不会随原依赖包卸载。正确做法是不直接更新传递性包,而是通过以下方式强制依赖包使用新版本:
- 修改项目文件的版本约束:在
.csproj中为目标传递性包添加<PackageReference>,同时设置IncludeAssets="none"和PrivateAssets="all",既不会将其转为直接依赖,又能强制所有依赖它的包使用指定版本。示例:<PackageReference Include="SharpZipLib" Version="1.3.3"> <IncludeAssets>none</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> - 使用中央包管理(Central Package Management):在解决方案根目录创建
Directory.Packages.props文件,统一管控所有包的版本,包括传递性包的版本覆盖。示例:
配置后,所有依赖SharpZipLib的包会自动使用指定版本,且不会将其转为直接依赖,卸载原依赖包时,传递性包会被自动清理。<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <PackageVersion Include="SharpZipLib" Version="1.3.3" /> </ItemGroup> </Project>
额外注意事项
- 若已误将传递性包转为直接依赖,可手动编辑
.csproj文件,删除对应的<PackageReference>节点,恢复其传递性依赖状态后,再通过上述方式指定版本。 - 对于存在安全漏洞的传递性包,优先检查原依赖包是否有更新版本——原依赖包的新版本可能已升级传递性包的依赖版本,直接更新原依赖包是更稳妥的方案。
内容的提问来源于stack exchange,提问作者Aaginor
相关产品推荐
相关产品推荐

