private/Assert-ModuleDependency.ps1
|
function Assert-ModuleDependency { [CmdletBinding()] param( [Parameter(Mandatory)] [ValidateSet('ImportExcel', 'powershell-yaml')] [string] $ModuleName ) $ErrorActionPreference = 'Stop' [bool] $IsDebug = $DebugPreference -ne 'SilentlyContinue' [bool] $IsVerbose = $VerbosePreference -ne 'SilentlyContinue' [version] $MinimumVersion = switch ($ModuleName) { 'ImportExcel' { '7.8.10' } 'powershell-yaml' { '0.0.0' } default { '0.0.0' } } Write-Debug "Asserting $ModuleName with $MinimumVersion" # --- Check: Is already loaded? $LoadedModule = Get-Module -Name $ModuleName -ErrorAction Ignore -Verbose:$false -Debug:$false if ($LoadedModule) { if ($LoadedModule.Version -lt $MinimumVersion) { throw "The module '$ModuleName' is loaded in version $($LoadedModule.Version), but version $MinimumVersion or higher is required. Update with: Update-Module $ModuleName" } return } # --- Check: Installed/available? $AvailableModule = Get-Module -Name $ModuleName -ListAvailable -ErrorAction Ignore -Verbose:$false -Debug:$false | Sort-Object Version -Descending | Select-Object -First 1 if (-not $AvailableModule) { throw "The required module '$ModuleName' is not installed. Install with: Install-Module $ModuleName" } if ($AvailableModule.Version -lt $MinimumVersion) { throw "The module '$ModuleName' is installed in version $($AvailableModule.Version), but version $MinimumVersion or higher is required. Update with: Update-Module $ModuleName" } # --- Installed and version OK, but not yet loaded into this session: import it now. # Explicit Import-Module works regardless of $PSModuleAutoLoadingPreference (All / ModuleQualified / None), # unlike relying on PowerShell's command-triggered autoloading. try { Import-Module -Name $ModuleName -MinimumVersion $MinimumVersion -ErrorAction Stop -Verbose:$false -Debug:$false } catch { throw "The module '$ModuleName' is installed but could not be imported: $_" } } |