Public/Install-DTXModule.ps1
function Install-DTXModule { param( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$Name, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$Version, [Parameter(Mandatory = $false)] [ValidateSet("CurrentUser", "AllUsers")] [string]$Scope = "CurrentUser", [Parameter(Mandatory = $false)] [string]$BucketName = "dtx-software-repo", [Parameter(Mandatory = $false)] [string]$BucketRegion = "eu-west-1", [Parameter(Mandatory = $false)] [string]$ObjectKey = "powershell-modules/$Name/$Version/$Name-v$Version.zip" , [switch]$SkipDependencyInstall, [switch]$SkipTestImport ) Begin { # Process the Name parameter to make sure it is in the correct format # e.g. DTX should always be all capitals. All other names should be in PascalCase. $Name = ($Name -split '\.').ForEach({ if ($_ -ieq "dtx") { "DTX" } else { $_.Substring(0, 1).ToUpper() + $_.Substring(1).ToLower() } }) -join '.' } Process { $params = @{ Name = $Name Version = $Version.ToLower() Scope = $Scope BucketName = $BucketName.ToLower() BucketRegion = $BucketRegion.ToLower() ObjectKey = $ObjectKey.ToLower() } if ($IsWindows) { $status = Install-ModuleForWindows @params } elseif ($IsMacOS -or $IsLinux) { $status = Install-ModuleForNonWindows @params } else { throw "Unsupported operating system." } if ($status -eq "ALREADY_INSTALLED") { Write-Host "Module $($Name) version $($Version) is already installed." Write-Host "No action required." return } if (-not $SkipDependencyInstall) { # Install the module dependencies try { Write-Host "Installing module dependencies for $($Name) version $($Version)..." $moduleProps = (Get-Module -ListAvailable | Where-Object { $_.Name -eq $Name -and $_.Version -eq $Version }) $modulePath = $moduleProps.ModuleBase # Check if dependencies file exists $dependenciesFile = Join-Path -Path $modulePath -ChildPath "$Name.Dependencies.psm1" if (Test-Path -Path $dependenciesFile) { # Load the dependencies file, which exposes a variable called $requiredModules Import-Module -Name $dependenciesFile -Force | Out-Null foreach ($module in $requiredModules) { # Install if not installed if (-not (Get-Module -ListAvailable | Where-Object { $_.Name -eq $module.ModuleName -and ($_.Version -ge $module.ModuleVersion) -and ($_.Version -le $module.MaximumVersion) })) { Write-Host "Installing $($module.ModuleName) version $($module.ModuleVersion)..." Install-Module -Name $module.ModuleName -MinimumVersion $module.ModuleVersion -MaximumVersion $module.MaximumVersion -Scope $Scope -Force | Out-Null } } Write-Host "Module dependencies for $($Name) version $($Version) installed successfully." } else { Write-Host "Skipping dependency installation for $($Name) version $($Version) because the dependencies file $($dependenciesFile) does not exist." } } catch { Write-Error $_.Exception.Message throw "Failed to install module dependencies for $($Name) version $($Version)." } } if (-not $SkipTestImport) { # Test if the module can be imported try { Write-Host "Testing if module $($Name) can be imported..." Import-Module -Name $Name -Version $Version -ErrorAction Stop Write-Host "Module $($Name) imported successfully." } catch { Write-Error $_.Exception.Message throw "Failed to import module $($Name)." } } } } |