NuGet - 在单个解决方案中管理和删除多个版本的软件包

16

场景

一个VS解决方案包含n个项目。项目A引用Y v1包,项目B引用Y v2包。现在无法使用NuGet包管理对解决方案中所有项目的包Y进行更新,只有当所有项目引用相同版本的包Y时才能进行更新。对于只有两个项目来说不是什么大问题,但是我正在处理许多项目,由于糟糕的包管理而引用了许多包版本,而它们应该都引用同一版本。

在我花费下午时间编写控制台应用程序以自动更新解决方案中所有package.config文件之前,以便每个引用的包只通过其最新版本进行引用(最近的引用,不是所有的最新版本,带有例外/警告等)...是否已经有工具/方法可以实现这一点?或者我不知道的其他方法?


周五下午是做这件事的好时机! - Ventsyslav Raikov
你尝试过使用sed或awk吗? - Ritch Melton
我记得今天做了这个……右键点击解决方案,管理包,更新?我发誓我刚刚做过了? - mbx-mbx
@Magrangs,你说得对,它可以工作,尽管我仍然需要一次一个包(daryal的命令在我的情况下不起作用)。我原本以为它不行,所以我有一种可怕的感觉,认为会出现问题:S - Myles McDonnell
我很高兴没有想象它,否则可能会令人担忧。 - mbx-mbx
是的,一切都非常非常糟糕。当我通过对话框更新了所有包引用后,我的解决方案无法构建,我不得不回滚。我认为当单个解决方案中存在对同一软件包不同版本的引用时,NuGet会感到困惑。我将尝试“修复”所有package.config文件以引用公共版本,然后再次尝试。 - Myles McDonnell
2个回答

11
你可以在“解决方案的Nuget包管理器”中实现此操作(要找到菜单,请右键单击解决方案或进入“工具->库包管理器”)。此对话框中的更新选项卡将提供适用于多个项目的更新。从“已安装”选项卡中卸载的情况也是如此。
或者,打开NuGet控制台,并在打开的解决方案中运行“Update-Package”以更新所有项目的所有包。它还可以用于更新特定的包/项目:
Update-Package [-Id] <string> [-IgnoreDependencies] [-ProjectName <string>] [-Version <string>] [-Safe] [-Source <string>] [-IncludePrerelease]

它将会找到与对话框中相同的更新,只需确保在“软件包源”下拉菜单中选择了正确的源(或“All”)。

例子:

PM> install-package NUnit -version 2.5.9.10348 -ProjectName ProjectA
Successfully installed 'NUnit 2.5.9.10348'.
Successfully added 'NUnit 2.5.9.10348' to ProjectA.

PM> install-package NUnit -version 2.5.10.11092 -ProjectName ProjectB
Successfully installed 'NUnit 2.5.10.11092'.
Successfully added 'NUnit 2.5.10.11092' to ProjectB.

PM> update-package
Updating 'NUnit' from version '2.5.9.10348' to '2.6.0.12054' in project 'ProjectA'.
Successfully removed 'NUnit 2.5.9.10348' from ProjectA.
Successfully installed 'NUnit 2.6.0.12054'.
Successfully added 'NUnit 2.6.0.12054' to ProjectA.
Successfully uninstalled 'NUnit 2.5.9.10348'.
Updating 'NUnit' from version '2.5.10.11092' to '2.6.0.12054' in project 'ProjectB'.
Successfully removed 'NUnit 2.5.10.11092' from ProjectB.
Successfully added 'NUnit 2.6.0.12054' to ProjectB.
Successfully uninstalled 'NUnit 2.5.10.11092'.

2

首先,仅仅更改xml文件是不足以使NuGet更改引用的。实际上,有时您手动修改packages.config文件时会出现错误。程序包管理器控制台具有更新解决方案中所有程序包的能力; 您只需调用"Get-Project -All | Update-Package"命令即可。

其次,在调用此命令之前,请确保您有适当的软件包来源可用。


该控制台命令在解决方案中的所有项目中报告没有可用的更新程序包引用,但是实际上有一些更新可以通过对话框逐个更新。 - Myles McDonnell
你可以尝试删除解决方案中的packages文件夹,除了repositories.config文件,然后再次运行命令吗? - daryal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接