Skip to content

Commit b74819c

Browse files
🩹 [Refactor]: Remove ConvertTo-Hashtable function and update Import-PSModule for improved clarity and functionality
1 parent 6ce3387 commit b74819c

File tree

5 files changed

+201
-102
lines changed

5 files changed

+201
-102
lines changed

‎README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ This step lets you add custom build logic to process or modify the module conten
2525

2626
## Usage
2727

28-
| Name | Description | Required | Default |
29-
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------- |
30-
| `Name` | Name of the module to process. | `false` | |
31-
| `Path` | Path to the folder where the modules are located. | `false` | `src` |
32-
| `ModulesOutputPath` | Path to the folder where the built modules are outputted. | `false` | `outputs/modules` |
33-
| `Debug` | Enable debug output. | `false` | `'false'` |
34-
| `Verbose` | Enable verbose output. | `false` | `'false'` |
35-
| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | |
36-
| `Prerelease` | Allow prerelease versions if available. | `false` | `'false'` |
28+
| Name | Description | Required | Default |
29+
| --------------------| ----------------------------------------------------------------------------------------------- | -------- | ------------------------- |
30+
| `Name` | Name of the module to process. | `false` | |
31+
| `Path` | Path to the folder where the modules are located. | `false` | `src` |
32+
| `ModulesOutputPath` | Path to the folder where the built modules are outputted. | `false` | `outputs/modules` |
33+
| `Debug` | Enable debug output. | `false` | `'false'` |
34+
| `Verbose` | Enable verbose output. | `false` | `'false'` |
35+
| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | |
36+
| `Prerelease` | Allow prerelease versions if available. | `false` | `'false'` |
37+
| `WorkingDirectory` | The working directory where the script runs. | `false` | `${{ github.workspace }}` |
3738

3839
## Root module
3940

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+
}

‎scripts/helpers/Build/ConvertTo-Hashtable.ps1

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,47 @@
11
function Import-PSModule {
22
<#
3-
.SYNOPSIS
4-
Imports a build PS module.
3+
.SYNOPSIS
4+
Imports a build PS module.
55
6-
.DESCRIPTION
7-
Imports a build PS module.
6+
.DESCRIPTION
7+
Imports a build PS module.
88
9-
.EXAMPLE
10-
Import-PSModule -SourceFolderPath $ModuleFolderPath -ModuleName $ModuleName
9+
.EXAMPLE
10+
Import-PSModule -SourceFolderPath $ModuleFolderPath -ModuleName $moduleName
1111
12-
Imports a module located at $ModuleFolderPath with the name $ModuleName.
12+
Imports a module located at $ModuleFolderPath with the name $moduleName.
1313
#>
1414
[CmdletBinding()]
1515
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
1616
'PSAvoidUsingWriteHost', '', Scope = 'Function',
1717
Justification = 'Want to just write to the console, not the pipeline.'
1818
)]
19-
#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' }
2019
param(
2120
# Path to the folder where the module source code is located.
2221
[Parameter(Mandatory)]
23-
[string] $Path,
24-
25-
# Name of the module.
26-
[Parameter(Mandatory)]
27-
[string] $ModuleName
22+
[string] $Path
2823
)
2924

3025
$moduleName = Split-Path -Path $Path -Leaf
31-
$manifestFileName = "$moduleName.psd1"
32-
$manifestFilePath = Join-Path -Path $Path $manifestFileName
33-
$manifestFile = Get-ModuleManifest -Path $manifestFilePath -As FileInfo -Verbose
34-
35-
Write-Host "Manifest file path: [$($manifestFile.FullName)]" -Verbose
36-
$existingModule = Get-Module -Name $ModuleName -ListAvailable
37-
$existingModule | Remove-Module -Force -Verbose
38-
$existingModule.RequiredModules | ForEach-Object { $_ | Remove-Module -Force -Verbose -ErrorAction SilentlyContinue }
39-
$existingModule.NestedModules | ForEach-Object { $_ | Remove-Module -Force -Verbose -ErrorAction SilentlyContinue }
40-
# Get-InstalledPSResource | Where-Object Name -EQ $ModuleName | Uninstall-PSResource -SkipDependencyCheck -Verbose:$false
41-
Resolve-PSModuleDependency -ManifestFilePath $manifestFile
42-
Import-Module -Name $ModuleName -RequiredVersion '999.0.0'
43-
44-
Write-Host 'List loaded modules'
26+
$manifestFilePath = Join-Path -Path $Path "$moduleName.psd1"
27+
28+
Write-Host " - Manifest file path: [$manifestFilePath]"
29+
Resolve-PSModuleDependency -ManifestFilePath $manifestFilePath
30+
31+
Write-Host ' - List installed modules'
32+
Get-InstalledPSResource | Format-Table -AutoSize
33+
34+
Write-Host " - Importing module [$moduleName] v999"
35+
Import-Module $Path
36+
37+
Write-Host ' - List loaded modules'
4538
$availableModules = Get-Module -ListAvailable -Refresh -Verbose:$false
4639
$availableModules | Select-Object Name, Version, Path | Sort-Object Name | Format-Table -AutoSize
47-
Write-Host 'List commands'
48-
Write-Host (Get-Command -Module $moduleName | Format-Table -AutoSize | Out-String)
40+
Write-Host ' - List commands'
41+
$commands = Get-Command -Module $moduleName -ListImported
42+
Write-Host (Get-Command -Module $moduleName -ListImported | Format-Table -AutoSize | Out-String)
4943

50-
if ($ModuleName -notin $availableModules.Name) {
44+
if ($moduleName -notin $commands.Source) {
5145
throw 'Module not found'
5246
}
5347
}
Lines changed: 69 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,105 @@
11
function Resolve-PSModuleDependency {
22
<#
3-
.SYNOPSIS
4-
Resolve dependencies for a module based on the manifest file.
3+
.SYNOPSIS
4+
Resolves module dependencies from a manifest file using Install-PSResource.
55
6-
.DESCRIPTION
7-
Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure
8-
9-
.EXAMPLE
10-
Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1'
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.)
1111
12+
.EXAMPLE
13+
Resolve-PSModuleDependency -ManifestFilePath 'C:\MyModule\MyModule.psd1'
1214
Installs all modules defined in the manifest file, following PSModuleInfo structure.
1315
14-
.NOTES
15-
Should later be adapted to support both pre-reqs, and dependencies.
16-
Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion,
17-
and latest version within a range MinimumVersion - MaximumVersion.
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.
1820
#>
1921
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
2022
'PSAvoidUsingWriteHost', '', Scope = 'Function',
2123
Justification = 'Want to just write to the console, not the pipeline.'
2224
)]
23-
[Alias('Resolve-PSModuleDependencies')]
2425
[CmdletBinding()]
25-
#Requires -Modules @{ ModuleName = 'Retry'; ModuleVersion = '0.1.3' }
2626
param(
2727
# The path to the manifest file.
2828
[Parameter(Mandatory)]
2929
[string] $ManifestFilePath
3030
)
3131

3232
Write-Host 'Resolving dependencies'
33-
3433
$manifest = Import-PowerShellDataFile -Path $ManifestFilePath
35-
Write-Host "Reading [$ManifestFilePath]"
36-
Write-Host "Found [$($manifest.RequiredModules.Count)] modules to install"
34+
Write-Host " - Reading [$ManifestFilePath]"
35+
Write-Host " - Found [$($manifest.RequiredModules.Count)] module(s) to install"
3736

3837
foreach ($requiredModule in $manifest.RequiredModules) {
39-
$installParams = @{}
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+
}
4047

4148
if ($requiredModule -is [string]) {
42-
$installParams.Name = $requiredModule
49+
$psResourceParams.Name = $requiredModule
50+
$importParams.Name = $requiredModule
4351
} else {
44-
$installParams.Name = $requiredModule.ModuleName
45-
$installParams.MinimumVersion = $requiredModule.ModuleVersion
46-
$installParams.RequiredVersion = $requiredModule.RequiredVersion
47-
$installParams.MaximumVersion = $requiredModule.MaximumVersion
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+
}
4875
}
49-
$installParams.Force = $true
50-
$installParams.Verbose = $false
5176

52-
Write-Host "[$($installParams.Name)] - Installing module"
77+
Write-Host " - [$($psResourceParams.Name)] - Installing module with Install-PSResource using version spec: $($psResourceParams.Version)"
5378
$VerbosePreferenceOriginal = $VerbosePreference
5479
$VerbosePreference = 'SilentlyContinue'
55-
Retry -Count 5 -Delay 10 {
56-
Install-Module @installParams -AllowPrerelease:$false
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+
}
5794
}
5895
$VerbosePreference = $VerbosePreferenceOriginal
59-
Write-Host "[$($installParams.Name)] - Importing module"
96+
97+
Write-Host " - [$($importParams.Name)] - Importing module with legacy version spec"
6098
$VerbosePreferenceOriginal = $VerbosePreference
6199
$VerbosePreference = 'SilentlyContinue'
62-
Import-Module @installParams
100+
Import-Module @importParams
63101
$VerbosePreference = $VerbosePreferenceOriginal
64-
Write-Host "[$($installParams.Name)] - Done"
102+
Write-Host " - [$($importParams.Name)] - Done"
65103
}
66-
Write-Host 'Resolving dependencies - Done'
104+
Write-Host ' - Resolving dependencies - Done'
67105
}

0 commit comments

Comments
 (0)