如何在Visual Studio中卸载一个解决方案中的*所有*NuGet包

124

我知道可以在PM控制台中卸载软件包。 我遇到了另一个项目的依赖关系问题, 我想重新开始,需要一次性删除所有软件包。 有办法吗?

9个回答

181

要获取解决方案中所有项目的所有软件包,请使用 Get-Package。要获取特定项目中的所有软件包,请使用 Get-Package -ProjectName "YourProjectName"


从解决方案中的所有项目中删除所有软件包

请小心:这将卸载解决方案中的所有软件包。如果使用了-Force参数,则即使存在依赖项,也会删除软件包。

Get-Package | Uninstall-Package -RemoveDependencies -Force

从解决方案中的特定项目中删除所有软件包

请注意:这将卸载项目中的所有软件包。如果使用了-Force参数,则即使存在依赖关系,软件包也会被删除。

Get-Package -ProjectName "YourProjectName" | 
Uninstall-Package -ProjectName "YourProjectName" -RemoveDependencies -Force

29
我建议在末尾添加-Force参数。如果没有这个参数,我无法卸载所有依赖项,这些依赖项是基于其他NuGet包的依赖关系。 - Sean Stayns
1
这是真正的答案。结合Sean的建议使用-force。这对我起作用了。 - Spikee

89

在Package Manager控制台中只需键入:

get-package | uninstall-package -removedependencies

该命令用于卸载包及其依赖项。

15
为避免陷入复杂的依赖关系图中,请使用"-Force"开关。 - Alireza
14
警告:该命令将卸载整个解决方案中的所有软件包。 - Jacob

36

试试这个:

get-package | uninstall-package -removedependencies -force

15
如果您想从解决方案中的每个项目中卸载所有NuGet软件包,请在NuGet软件包管理器控制台中使用以下内容:
foreach($project in $projects){ $packages = Get-Package -ProjectName $project.Name; foreach($package in $packages){ Uninstall-Package -ProjectName $project.Name -Id $package.Id -Force} }

4
很好的回答。为单个项目编写脚本:$packages = Get-Package -ProjectName MyProjectName; foreach($package in $packages){ Uninstall-Package -ProjectName MyProjectName -Id $package.Id -Force} - Mohsen Afshin

10

在我的情况下使用-Force参数会留下项目文件的修改和一些二进制文件的引用,这些文件在通常卸载软件包时应该被删除。

以下是一种简单的方法,可以卸载特定项目中的所有软件包,而无需使用-Force参数。它实际上会尝试反复卸载软件包,直到没有软件包剩余,因此您将看到一些错误,提到依赖软件包(如果有),但随着每个迭代中叶子软件包被移除,这些错误会越来越少。

值得注意的是,我只在PackageManager控制台中测试了以下PowerShell代码片段。(“工具 > NuGet程序包管理器 > 包管理器控制台”)

卸载解决方案中所有项目的所有软件包

while((Get-Project -All | Get-Package).Length -gt 0) { Get-Project -All | Get-Package | Uninstall-Package }

仅删除包含单词 "WildCardSearch" 的项目。

while((Get-Project -All | Where-Object ProjectName -like '*WildCardSearch*'  | Get-Package).Length -gt 0) { Get-Project -All | Where-Object ProjectName -like '*WildCardSearch*' | Get-Package | Uninstall-Package }

请注意,如果您除了依赖包阻止卸载软件包之外还有其他问题,此代码片段将一直运行,直到您手动停止它。


4
我不认为一次性卸载所有软件包是可能的。但是,正如您已经指出的那样,您可以卸载一个软件包,并告诉它卸载其依赖项,方法如下:
Uninstall-Package OpenIdPortableArea –RemoveDependencies
这里有一篇由Marcus Hammarberg撰写的博客,解释了这个问题: http://www.marcusoft.net/2011/02/nuget-uninstall-remove-dependencies.html

3
当一个软件包依赖于许多其他软件包时,使用“移除依赖项”是可行的。但当核心软件包(例如Boost)被N个软件包所依赖时,这种方法就不再适用了。你需要手动逐个删除NuGet Boost软件包,这很麻烦。 - quant_dev

3

使用Package Manager Console自动恢复(卸载并安装而不更新到最新版本)软件包:

这适用于整个解决方案:

Update-Package -Reinstall

... 或仅适用于特定项目:

Update-Package -Reinstall -Project [ProjectName]


好吧,知道第一个命令针对整个解决方案运行,而不管您在包管理器控制台窗口中设置为默认的项目是什么,这将是很好的。 直到写这条消息之前,我甚至没有看过第二个命令,呃! - Post Impatica
更新了答案并指出了@PostImpatica :-) - Mariusz

1

更新了一个脚本,以删除VS解决方案中单个项目的所有nuget包:

$projectName = "MyProjectName"; $packages = Get-Package -ProjectName $projectName; foreach($package in $packages){ Uninstall-Package -ProjectName $projectName -Id $package.Id -Force}

0

老派的for循环:

$packages = get-package
$packageId = "Apache.NMS.ActiveMQ"


$counter = 1
foreach($package in $packages){     
    if($package.Id -eq $packageId)
    {   
        Write-Host "`n$counter-Deleting Package:`n"
        $package        
        Uninstall-Package -Id $packageId -ProjectName $package.ProjectName -RemoveDependencies 
        Write-Host "`n============================================`n"
        $counter++
    }
}

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