如何让NuGet在遵循Sitefinity版本约束下更新所有依赖包?
在不升级Sitefinity 13版本的前提下,通过NuGet安全更新依赖包的方法
我在Visual Studio中维护一个Sitefinity Web应用,希望在不升级Sitefinity版本的前提下,通过NuGet尽可能多地更新其他包。已在packages.config中给Sitefinity包添加版本约束,阻止其升级:
<package id="Telerik.Sitefinity.All" version="13.3.7649" targetFramework="net48" allowedVersions="(,14.0)" />
但NuGet尝试更新Sitefinity的间接依赖包时,仍会抛出“无法解析依赖项”的错误——例如它会尝试将ServiceStack等依赖包更新至最新版(当前为8.0),最终因与Sitefinity的版本约束冲突失败。
请问:除了为每个间接依赖手动添加allowedVersions约束外,有没有办法让NuGet自动计算所有约束,仅将包更新到Sitefinity允许的最高兼容版本?
补充信息
Progress.Sitefinity.Core.13.3.7649的直接依赖项如下:
Telerik.DataAccess.Core [2020.0.428.1] Telerik.DataAccess.Web35 [2020.0.428.1] Progress.Sitefinity.Renderer [13.3.7626.24196] ServiceStack [5.9.2] ServiceStack.Redis [5.9.2] ServiceStack.Server [5.9.2] ServiceStack.Aws [5.9.2] ServiceStack.Caching.Memcached [5.9.2] ServiceStack.OrmLite.SqlServer [5.9.2] AWSSDK.DynamoDBv2 3.5.2 AWSSDK.SQS 3.5.0.36 Telerik.Web.UI [2021.1.119.45] Newtonsoft.Json [12.0.3]
可行解决方法
1. 使用NuGet的安全更新参数
在Visual Studio的NuGet包管理器控制台中执行以下命令,NuGet会自动遵循现有依赖的版本约束,只更新到兼容的最高版本:
Update-Package -Safe
-Safe参数会限制更新范围,不会突破Sitefinity定义的依赖版本上限(比如ServiceStack只会更新到5.x系列的最新版,而非8.0)。
2. 批量生成间接依赖的版本约束(若-Safe参数无效)
如果-Safe参数未达到预期效果,可以批量提取并添加约束:
- 先导出当前项目的包列表及依赖信息:
Get-Package -ProjectName "你的项目名称" | Select-Object Id, Version - 根据Sitefinity的依赖定义,为每个间接依赖设置对应的
allowedVersions范围,例如ServiceStack可设置为[5.9.2,6.0),确保仅更新5.x系列。 - 利用文本编辑器的批量替换功能,快速给所有需要约束的包添加
allowedVersions属性到packages.config中。
3. 迁移到PackageReference模式(长期推荐)
packages.config是较旧的包管理模式,PackageReference对依赖约束的解析更智能:
- 在Visual Studio中右键项目 → 选择迁移packages.config到PackageReference
- 迁移完成后,NuGet会自动继承
Telerik.Sitefinity.All的依赖约束,更新时默认选择兼容版本,无需手动添加大量约束。
内容的提问来源于stack exchange,提问作者Adeptus
相关产品推荐
相关产品推荐

