Skip to content

Commit 95b8b04

Browse files
Add functions to convert version specifications and resolve module dependencies
1 parent dfd3688 commit 95b8b04

File tree

2 files changed

+203
-0
lines changed

2 files changed

+203
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
function Convert-VersionSpec {
2+
<#
3+
.SYNOPSIS
4+
Converts legacy version parameters into a NuGet version range string.
5+
6+
.DESCRIPTION
7+
This function takes minimum, maximum, or required version parameters
8+
and constructs a NuGet-compatible version range string.
9+
10+
- If `RequiredVersion` is specified, the output is an exact match range.
11+
- If both `MinimumVersion` and `MaximumVersion` are provided,
12+
an inclusive range is returned.
13+
- If only `MinimumVersion` is provided, it returns a minimum-inclusive range.
14+
- If only `MaximumVersion` is provided, it returns an upper-bound range.
15+
- If no parameters are provided, `$null` is returned.
16+
17+
.EXAMPLE
18+
Convert-VersionSpec -MinimumVersion "1.0.0" -MaximumVersion "2.0.0"
19+
20+
Output:
21+
```powershell
22+
[1.0.0,2.0.0]
23+
```
24+
25+
Returns an inclusive version range from 1.0.0 to 2.0.0.
26+
27+
.EXAMPLE
28+
Convert-VersionSpec -RequiredVersion "1.5.0"
29+
30+
Output:
31+
```powershell
32+
[1.5.0]
33+
```
34+
35+
Returns an exact match for version 1.5.0.
36+
37+
.EXAMPLE
38+
Convert-VersionSpec -MinimumVersion "1.0.0"
39+
40+
Output:
41+
```powershell
42+
[1.0.0, ]
43+
```
44+
45+
Returns a minimum-inclusive version range starting at 1.0.0.
46+
47+
.EXAMPLE
48+
Convert-VersionSpec -MaximumVersion "2.0.0"
49+
50+
Output:
51+
```powershell
52+
(, 2.0.0]
53+
```
54+
55+
Returns an upper-bound range up to version 2.0.0.
56+
57+
.OUTPUTS
58+
string
59+
60+
.NOTES
61+
The NuGet version range string based on the provided parameters.
62+
The returned string follows NuGet versioning syntax.
63+
64+
.LINK
65+
https://psmodule.io/Convert/Functions/Convert-VersionSpec
66+
#>
67+
[OutputType([string])]
68+
[CmdletBinding()]
69+
param(
70+
# The minimum version for the range. If specified alone, the range is open-ended upwards.
71+
[Parameter()]
72+
[string] $MinimumVersion,
73+
74+
# The maximum version for the range. If specified alone, the range is open-ended downwards.
75+
[Parameter()]
76+
[string] $MaximumVersion,
77+
78+
# Specifies an exact required version. If set, an exact version range is returned.
79+
[Parameter()]
80+
[string] $RequiredVersion
81+
)
82+
83+
if ($RequiredVersion) {
84+
# Use exact match in bracket notation.
85+
return "[$RequiredVersion]"
86+
} elseif ($MinimumVersion -and $MaximumVersion) {
87+
# Both bounds provided; both are inclusive.
88+
return "[$MinimumVersion,$MaximumVersion]"
89+
} elseif ($MinimumVersion) {
90+
# Only a minimum is provided. Use a minimum-inclusive range.
91+
return "[$MinimumVersion, ]"
92+
} elseif ($MaximumVersion) {
93+
# Only a maximum is provided; lower bound open.
94+
return "(, $MaximumVersion]"
95+
} else {
96+
return $null
97+
}
98+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
function Resolve-PSModuleDependency {
2+
<#
3+
.SYNOPSIS
4+
Resolves module dependencies from a manifest file using Install-PSResource.
5+
6+
.DESCRIPTION
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.)
11+
12+
.EXAMPLE
13+
Resolve-PSModuleDependency -ManifestFilePath 'C:\MyModule\MyModule.psd1'
14+
Installs all modules defined in the manifest file, following PSModuleInfo structure.
15+
16+
.NOTES
17+
Should later be adapted to support both pre-reqs, and dependencies.
18+
Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion,
19+
and latest version within a range MinimumVersion - MaximumVersion.
20+
#>
21+
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
22+
'PSAvoidUsingWriteHost', '', Scope = 'Function',
23+
Justification = 'Want to just write to the console, not the pipeline.'
24+
)]
25+
[CmdletBinding()]
26+
param(
27+
# The path to the manifest file.
28+
[Parameter(Mandatory)]
29+
[string] $ManifestFilePath
30+
)
31+
32+
Write-Host 'Resolving dependencies'
33+
$manifest = Import-PowerShellDataFile -Path $ManifestFilePath
34+
Write-Host " - Reading [$ManifestFilePath]"
35+
Write-Host " - Found [$($manifest.RequiredModules.Count)] module(s) to install"
36+
37+
foreach ($requiredModule in $manifest.RequiredModules) {
38+
# Build parameters for Install-PSResource (new version spec).
39+
$psResourceParams = @{
40+
TrustRepository = $true
41+
}
42+
# Build parameters for Import-Module (legacy version spec).
43+
$importParams = @{
44+
Force = $true
45+
Verbose = $false
46+
}
47+
48+
if ($requiredModule -is [string]) {
49+
$psResourceParams.Name = $requiredModule
50+
$importParams.Name = $requiredModule
51+
} else {
52+
$psResourceParams.Name = $requiredModule.ModuleName
53+
$importParams.Name = $requiredModule.ModuleName
54+
55+
# Convert legacy version info for Install-PSResource.
56+
$versionSpec = Convert-VersionSpec `
57+
-MinimumVersion $requiredModule.ModuleVersion `
58+
-MaximumVersion $requiredModule.MaximumVersion `
59+
-RequiredVersion $requiredModule.RequiredVersion
60+
61+
if ($versionSpec) {
62+
$psResourceParams.Version = $versionSpec
63+
}
64+
65+
# For Import-Module, keep the original version parameters.
66+
if ($requiredModule.ModuleVersion) {
67+
$importParams.MinimumVersion = $requiredModule.ModuleVersion
68+
}
69+
if ($requiredModule.RequiredVersion) {
70+
$importParams.RequiredVersion = $requiredModule.RequiredVersion
71+
}
72+
if ($requiredModule.MaximumVersion) {
73+
$importParams.MaximumVersion = $requiredModule.MaximumVersion
74+
}
75+
}
76+
77+
Write-Host " - [$($psResourceParams.Name)] - Installing module with Install-PSResource using version spec: $($psResourceParams.Version)"
78+
$VerbosePreferenceOriginal = $VerbosePreference
79+
$VerbosePreference = 'SilentlyContinue'
80+
$retryCount = 5
81+
$retryDelay = 10
82+
for ($i = 0; $i -lt $retryCount; $i++) {
83+
try {
84+
Install-PSResource @psResourceParams
85+
break
86+
} catch {
87+
Write-Warning "Installation of $($psResourceParams.Name) failed with error: $_"
88+
if ($i -eq $retryCount - 1) {
89+
throw
90+
}
91+
Write-Warning "Retrying in $retryDelay seconds..."
92+
Start-Sleep -Seconds $retryDelay
93+
}
94+
}
95+
$VerbosePreference = $VerbosePreferenceOriginal
96+
97+
Write-Host " - [$($importParams.Name)] - Importing module with legacy version spec"
98+
$VerbosePreferenceOriginal = $VerbosePreference
99+
$VerbosePreference = 'SilentlyContinue'
100+
Import-Module @importParams
101+
$VerbosePreference = $VerbosePreferenceOriginal
102+
Write-Host " - [$($importParams.Name)] - Done"
103+
}
104+
Write-Host ' - Resolving dependencies - Done'
105+
}

0 commit comments

Comments
 (0)