Skip to content

Commit fc58cca

Browse files
Refactor Resolve-PSModuleDependency to support Install-PSResource and improve version handling
1 parent ab4de46 commit fc58cca

File tree

1 file changed

+60
-23
lines changed

1 file changed

+60
-23
lines changed

scripts/helpers/Resolve-PSModuleDependency.ps1

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
function Resolve-PSModuleDependency {
22
<#
33
.SYNOPSIS
4-
Resolve dependencies for a module based on the manifest file.
4+
Resolves module dependencies from a manifest file using Install-PSResource.
55
66
.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.)
811
912
.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.
1315
1416
.NOTES
1517
Should later be adapted to support both pre-reqs, and dependencies.
@@ -27,47 +29,82 @@
2729
[string] $ManifestFilePath
2830
)
2931

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+
3058
Write-Host 'Resolving dependencies'
3159

3260
$manifest = Import-PowerShellDataFile -Path $ManifestFilePath
3361
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"
3563

3664
foreach ($requiredModule in $manifest.RequiredModules) {
37-
$installParams = @{}
65+
$installParams = @{
66+
Force = $true
67+
Verbose = $false
68+
}
3869

3970
if ($requiredModule -is [string]) {
4071
$installParams.Name = $requiredModule
4172
} else {
4273
$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+
}
4684
}
47-
$installParams.Force = $true
48-
$installParams.Verbose = $false
4985

86+
Write-Host " - [$($installParams.Name)] - Installing module with version spec: $($installParams.Version)"
5087
$VerbosePreferenceOriginal = $VerbosePreference
5188
$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++) {
5694
try {
57-
Install-Module @installParams
95+
Install-PSResource @installParams
5896
break
5997
} 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) {
64100
throw
65101
}
66-
Write-Warning "Retrying in $Delay seconds..."
67-
Start-Sleep -Seconds $Delay
102+
Write-Warning "Retrying in $retryDelay seconds..."
103+
Start-Sleep -Seconds $retryDelay
68104
}
69105
}
70106
$VerbosePreference = $VerbosePreferenceOriginal
107+
71108
Write-Host " - [$($installParams.Name)] - Importing module"
72109
$VerbosePreferenceOriginal = $VerbosePreference
73110
$VerbosePreference = 'SilentlyContinue'

0 commit comments

Comments
 (0)