Ogni volta che lancio Update-Module Microsoft.Graph -Scope AllUsers il bimbo innocente che vive in me ripete sempre la stessa cosa: “stavolta andrà liscio”. E ogni volta, puntuale, quel bimbo ne esce deluso: l’aggiornamento installa la nuova versione e non tocca la vecchia (o le vecchie, nel caso in cui tu abbia fatto più aggiornamenti nel corso del tempo, senza curarti di ciò che lasciavi alle spalle), che resta lì, silenziosa, a occupare spazio e, nei casi peggiori, a creare conflitti quando PowerShell non sa bene quale versione dei cmdlet caricare.
Sia chiaro: so benissimo che è una scelta by-design, la pulizia dei vecchi moduli è a tuo carico, la maggior parte delle volte puoi “ignorarla“. Con Microsoft.Graph il problema è però amplificato dal fatto che non stiamo parlando di un modulo singolo, ma di una quarantina di sub-moduli (Microsoft.Graph.Users, Microsoft.Graph.Groups, Microsoft.Graph.Applications e così via). Se aggiorni e basta, ti ritrovi con due, tre, a volte più versioni della stessa libreria installate in parallelo su C:\Program Files\PowerShell\Modules (o nella tua cartella personale dei PowerShell Modules). Bello per chi ama fare ordine, pessimo per chi deve gestire ambienti di produzione dove ogni versione fantasma è un potenziale problema da capire poi, magari alle 2 di notte durante un incident.
Il problema in pratica
Dopo un aggiornamento mi ritrovo tipicamente così: nuova versione installata, ma la precedente ancora lì, con tutti i suoi sub-moduli:
PS> Update-Module Microsoft.graph -Scope AllUsers PS> Get-Module Microsoft.Graph* -ListAvailable | >> Where-Object Version -ne '2.39.0' | >> Select-Object Name, Version, Path Name Version Path ---- ------- ---- Microsoft.Graph 2.38.1 C:\Program Files\PowerShell\Modules\Microsoft.Graph\2.38.1\Mic… Microsoft.Graph.Applications 2.38.1 C:\Program Files\PowerShell\Modules\Microsoft.Graph.Applicatio… Microsoft.Graph.Authentication 2.38.1 C:\Program Files\PowerShell\Modules\Microsoft.Graph.Authentica… [...]
Quaranta righe, tutte con la stessa versione vecchia (2.38.1 nel caso oggi analizzato e buttato qui sul blog), tutte da rimuovere. A mano sarebbe una tortura, e infatti un Uninstall-Module Microsoft.Graph -RequiredVersion 2.38.1 da solo non basta: quel cmdlet toglie solo il modulo “ombrello“, non i sub-moduli che dipendono da lui.
La pulizia (quella vera)
La strada che mi ha portato a un risultato pulito è stata questa: prendo tutti i moduli della versione da buttare, li ordino mettendo per ultimo Microsoft.Graph.Authentication (da cui dipendono tutti gli altri, quindi va tolto per ultimo) e per primo Microsoft.Graph (l’ombrello, va tolto per primo):
$targetVersion = '2.38.1'
$oldGraph = Get-Module -Name 'Microsoft.Graph*' -ListAvailable |
Where-Object Version -eq ([version]$targetVersion) |
Sort-Object Name -Unique
$uninstallOrder = @(
$oldGraph | Where-Object Name -eq 'Microsoft.Graph'
$oldGraph | Where-Object {
$_.Name -notin @(
'Microsoft.Graph',
'Microsoft.Graph.Authentication'
)
}
$oldGraph | Where-Object Name -eq 'Microsoft.Graph.Authentication'
)
foreach ($module in $uninstallOrder) {
Write-Host "Removing $($module.Name) $targetVersion ..."
Uninstall-Module `
-Name $module.Name `
-RequiredVersion $targetVersion `
-Force `
-ErrorAction Stop
}
Il -Force serve perché, senza, PowerShell si impunta se trova dipendenze ancora “in uso” secondo il suo registro interno (anche quando in realtà non c’è nessun processo che le sta usando). L’ordine di rimozione (ombrello prima, Authentication per ultimo) evita gli errori di dipendenza mancante che altrimenti PowerShell ti tira dietro a metà pulizia.
A operazione conclusa, una verifica veloce conferma che è rimasta una sola versione installata:
Get-Module -Name 'Microsoft.Graph*' -ListAvailable |
Group-Object Version |
Sort-Object Name |
Select-Object Name, Count
Name Count
---- -----
2.39.0 40
In conclusione
Il modulo Microsoft.Graph per PowerShell è potente ma non fa mai pulizia da solo: ogni Update-Module lascia dietro di sé la versione precedente, moltiplicata per una quarantina di sub-moduli. Se lavori su più macchine o gestisci ambienti condivisi, questo accumulo diventa presto un problema reale, spazio sprecato, tempi di caricamento del modulo più lunghi, e il rischio concreto di caricare per sbaglio la versione sbagliata di un cmdlet.
Lo script sopra non è elegantissimo ma fa il suo lavoro in modo ripetibile: prendi la versione vecchia, rispetta l’ordine di dipendenza, disinstalla tutto con -Force. Vale la pena tenerlo a portata di mano (magari come funzione riutilizzabile) ogni volta che aggiorni Graph.
In caso di errori, dubbi, boiate riportate in articolo sai già cosa fare, l’area commenti è a tua totale disposizione :-)
#KeepItSimple