Private/Functions/Server/Init/Get-ModuleDependencies.ps1
function Get-ModuleDependencies { <# .SYNOPSIS Read names of modules to preload from any ModuleDependencies files .DESCRIPTION Modules found in ModuleDependencies files will be pre-loaded into the initial session state for all runspaces used for servicing HTTP requests. This prevents slow-downs caused by scripts calling Import-Module while processing a request. These modules must be installed modules, i.e. be able to be found in PSModulePath This function will verify the existence of any required modules and throw if they cannot be found. .PARAMETER ClassPath List of paths to user controller code .OUTPUTS List of module names #> param ( [string[]]$ClassPath ) Write-OperatingSystemLogEntry -EventId ([EventId]::InitializationStep) -Message "Reading ModuleDependecies.txt" $requiredModules = $ClassPath | Foreach-Object { Get-ChildItem -Recurse -Path $_ -Filter ModuleDependencies.txt | Foreach-Object { Get-Content $_.FullName | Foreach-Object { if ($_ -notmatch '^\s*#') { # Emit module name ($_ -split '#')[0].Trim() } } } } | Where-Object { -not [string]::IsNullOrEmpty($_) } | Sort-Object -Unique if (($requiredModules | Measure-Object).Count -gt 0) { # Verify all the requested modules are available $installedModules = Get-Module -ListAvailable | Select-Object -ExpandProperty Name $requiredModules | Foreach-Object { if ($installedModules -inotcontains $_) { throw "Module $_ cannot be found on this system." } } Write-OperatingSystemLogEntry -EventId ([EventId]::InitializationStep) -Message "Found modules: $($requiredModules -join ', ')" } else { Write-OperatingSystemLogEntry -EventId ([EventId]::InitializationStep) -Message "No modules found." } $requiredModules } |