|
1 | 1 | function Resolve-PSModuleDependency { |
2 | 2 | <# |
3 | 3 | .SYNOPSIS |
4 | | - Resolve dependencies for a module based on the manifest file. |
| 4 | + Resolves module dependencies from a manifest file using Install-PSResource. |
5 | 5 |
|
6 | 6 | .DESCRIPTION |
7 | | - Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure |
| 7 | + Reads a module manifest (PSD1) and for each required module converts the old |
| 8 | + Install-Module parameters (MinimumVersion, MaximumVersion, RequiredVersion) |
| 9 | + into a single NuGet version range string for Install-PSResource's –Version parameter. |
| 10 | + (Note: If RequiredVersion is set, that value takes precedence.) |
8 | 11 |
|
9 | 12 | .EXAMPLE |
10 | | - Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1' |
11 | | -
|
12 | | - Installs all modules defined in the manifest file, following PSModuleInfo structure. |
| 13 | + Resolve-PSModuleDependency -ManifestFilePath 'C:\MyModule\MyModule.psd1' |
| 14 | + Installs all modules defined in the manifest file, following PSModuleInfo structure. |
13 | 15 |
|
14 | 16 | .NOTES |
15 | 17 | Should later be adapted to support both pre-reqs, and dependencies. |
|
27 | 29 | [string] $ManifestFilePath |
28 | 30 | ) |
29 | 31 |
|
| 32 | + # Helper: Converts the legacy version parameters into a NuGet version range. |
| 33 | + function Convert-VersionSpec { |
| 34 | + param( |
| 35 | + [string]$MinimumVersion, |
| 36 | + [string]$MaximumVersion, |
| 37 | + [string]$RequiredVersion |
| 38 | + ) |
| 39 | + if ($RequiredVersion) { |
| 40 | + # Exact match – note that for an exact version, using bracket notation |
| 41 | + # helps ensure that Install-PSResource looks for that version only. |
| 42 | + return "[$RequiredVersion]" |
| 43 | + } elseif ($MinimumVersion -and $MaximumVersion) { |
| 44 | + # Both bounds provided; note that this makes both ends inclusive. |
| 45 | + return "[$MinimumVersion,$MaximumVersion]" |
| 46 | + } elseif ($MinimumVersion) { |
| 47 | + # Only a minimum is provided. |
| 48 | + # Using the notation “[1.0.0.0, ]” ensures a minimum-inclusive search. |
| 49 | + return "[$MinimumVersion, ]" |
| 50 | + } elseif ($MaximumVersion) { |
| 51 | + # Only a maximum is provided; here we use an open lower bound. |
| 52 | + return "(, $MaximumVersion]" |
| 53 | + } else { |
| 54 | + return $null |
| 55 | + } |
| 56 | + } |
| 57 | + |
30 | 58 | Write-Host 'Resolving dependencies' |
31 | 59 |
|
32 | 60 | $manifest = Import-PowerShellDataFile -Path $ManifestFilePath |
33 | 61 | Write-Host " - Reading [$ManifestFilePath]" |
34 | | - Write-Host " - Found [$($manifest.RequiredModules.Count)] modules to install" |
| 62 | + Write-Host " - Found [$($manifest.RequiredModules.Count)] module(s) to install" |
35 | 63 |
|
36 | 64 | foreach ($requiredModule in $manifest.RequiredModules) { |
37 | | - $installParams = @{} |
| 65 | + $installParams = @{ |
| 66 | + Force = $true |
| 67 | + Verbose = $false |
| 68 | + } |
38 | 69 |
|
39 | 70 | if ($requiredModule -is [string]) { |
40 | 71 | $installParams.Name = $requiredModule |
41 | 72 | } else { |
42 | 73 | $installParams.Name = $requiredModule.ModuleName |
43 | | - $installParams.MinimumVersion = $requiredModule.ModuleVersion |
44 | | - $installParams.RequiredVersion = $requiredModule.RequiredVersion |
45 | | - $installParams.MaximumVersion = $requiredModule.MaximumVersion |
| 74 | + |
| 75 | + # Convert legacy version parameters into the new –Version spec. |
| 76 | + $versionSpec = Convert-VersionSpec ` |
| 77 | + -MinimumVersion $requiredModule.ModuleVersion ` |
| 78 | + -MaximumVersion $requiredModule.MaximumVersion ` |
| 79 | + -RequiredVersion $requiredModule.RequiredVersion |
| 80 | + |
| 81 | + if ($versionSpec) { |
| 82 | + $installParams.Version = $versionSpec |
| 83 | + } |
46 | 84 | } |
47 | | - $installParams.Force = $true |
48 | | - $installParams.Verbose = $false |
49 | 85 |
|
| 86 | + Write-Host " - [$($installParams.Name)] - Installing module with version spec: $($installParams.Version)" |
50 | 87 | $VerbosePreferenceOriginal = $VerbosePreference |
51 | 88 | $VerbosePreference = 'SilentlyContinue' |
52 | | - Write-Host " - [$($installParams.Name)] - Installing module" |
53 | | - $Count = 5 |
54 | | - $Delay = 10 |
55 | | - for ($i = 0; $i -lt $Count; $i++) { |
| 89 | + |
| 90 | + # Basic retry logic in case of transient errors. |
| 91 | + $retryCount = 5 |
| 92 | + $retryDelay = 10 |
| 93 | + for ($i = 0; $i -lt $retryCount; $i++) { |
56 | 94 | try { |
57 | | - Install-Module @installParams |
| 95 | + Install-PSResource @installParams |
58 | 96 | break |
59 | 97 | } catch { |
60 | | - Write-Warning 'The command:' |
61 | | - Write-Warning $Run.ToString() |
62 | | - Write-Warning "failed with error: $_" |
63 | | - if ($i -eq $Count - 1) { |
| 98 | + Write-Warning "Installation of $($installParams.Name) failed with error: $_" |
| 99 | + if ($i -eq $retryCount - 1) { |
64 | 100 | throw |
65 | 101 | } |
66 | | - Write-Warning "Retrying in $Delay seconds..." |
67 | | - Start-Sleep -Seconds $Delay |
| 102 | + Write-Warning "Retrying in $retryDelay seconds..." |
| 103 | + Start-Sleep -Seconds $retryDelay |
68 | 104 | } |
69 | 105 | } |
70 | 106 | $VerbosePreference = $VerbosePreferenceOriginal |
| 107 | + |
71 | 108 | Write-Host " - [$($installParams.Name)] - Importing module" |
72 | 109 | $VerbosePreferenceOriginal = $VerbosePreference |
73 | 110 | $VerbosePreference = 'SilentlyContinue' |
|
0 commit comments