Skip to content

Uninstall-Module fails to uninstall even if no dependency left. #39

@sburbano

Description

@sburbano

Steps to reproduce

On a clean PS install, running as admin

PS C:\WINDOWS\system32> get-module PowerShellGet, PackageManagement -ListAvailable

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}
PS C:\WINDOWS\system32> install-module PackageManagement -RequiredVersion 1.4.3 -AllowClobber
PS C:\WINDOWS\system32> install-module PowerShellGet -RequiredVersion 2.2 -AllowClobber
PS C:\WINDOWS\system32> Update-Module PowerShellGet
PS C:\WINDOWS\system32> Get-Module PackageManagement,PowerShellGet -ListAvailable

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.4.4      PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script     1.4.3      PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script     2.2.1      PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}
Script     2.2        PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}

Close and reopen PS as admin

PS C:\WINDOWS\system32> Import-Module PowerShellGet -Version 2.2.1
PS C:\WINDOWS\system32> Get-Module PowerShellGet, PackageManagement

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.4.4      PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package, Get-PackageProvider...}
Script     2.2.1      PowerShellGet                       {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}

PS C:\WINDOWS\system32> Get-Module PowerShellGet, PackageManagement -ListAvailable

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.4.4      PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script     1.4.3      PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Binary     1.0.0.1    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}
Script     2.2.1      PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}
Script     2.2        PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}
Script     1.0.0.1    PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}

PS C:\WINDOWS\system32> Uninstall-Module PowerShellGet -RequiredVersion 2.2
PS C:\WINDOWS\system32> Uninstall-Module PackageManagement -RequiredVersion 1.4.3
PackageManagement\Uninstall-Package : El módulo "PackageManagement" de versión "1.4.3" de la carpeta base del módulo "C:\Program
Files\WindowsPowerShell\Modules\PackageManagement\1.4.3" no se puede desinstalar debido a que uno o más módulos distintos "PowerShellGet" dependen de este módulo.
Desinstala los módulos que dependen de este antes de desinstalar el módulo "PackageManagement".
En C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\2.2.1\PSModule.psm1: 12655 Carácter: 21
+ ...        $null = PackageManagement\Uninstall-Package @PSBoundParameters
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Package], Exception
    + FullyQualifiedErrorId : UnableToUninstallAsOtherModulesNeedThisModule,Uninstall-Package,Microsoft.PowerShell.PackageManagement.Cmdlets.UninstallPackage

Expected behavior

Module uninstalled, since there are no dependencies left (please note that PowerShellGet 2.2.1 depends on PackageManagement v1.4.4)

Actual behavior

Uninstall-Module throws an error and doesn't remove the module. -Force works though:

PS C:\WINDOWS\system32> Uninstall-Module PackageManagement -RequiredVersion 1.4.3 -Force
PS C:\WINDOWS\system32>

Cause of issue is in providerfunctions/Uninstall-Package.ps1 lines 92-100

            $dependentModuleScript = {
                                param ([string] $moduleName)
                                Microsoft.PowerShell.Core\Get-Module -ListAvailable |
                                Microsoft.PowerShell.Core\Where-Object {
                                    ($moduleName -ne $_.Name) -and (
                                    ($_.RequiredModules -and $_.RequiredModules.Name -contains $moduleName) -or
                                    ($_.NestedModules -and $_.NestedModules.Name -contains $moduleName))
                                }
                            }

The dependency check should be performed not only on the RequiredModules.Name, but also on RequiredModules.Version, which should be less-than-or-equal to the version of the module being uninstalled in order to be considered a dependency.

PS C:\WINDOWS\system32> (Get-Module PowerShellGet).RequiredModules

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.4.4      PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package, Get-PackageProvider...}

Environment data

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.592
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.592
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions