Skip to content

Replace modules.json with RequiredModules #1457

Closed
@andyleejordan

Description

@andyleejordan

This awesome tool RequiredModules is a complete implementation of our partial modules.json PowerShell module dependency specification, and our Invoke-Build task for parsing and installing them:

task RestorePsesModules -After Build {
$submodulePath = (Resolve-Path $PsesSubmodulePath).Path + [IO.Path]::DirectorySeparatorChar
Write-Host "`nRestoring EditorServices modules..."
# Read in the modules.json file as a hashtable so it can be splatted
$moduleInfos = @{}
(Get-Content -Raw $ModulesJsonPath | ConvertFrom-Json).PSObject.Properties | ForEach-Object {
$name = $_.Name
$body = @{
Name = $name
MinimumVersion = $_.Value.MinimumVersion
MaximumVersion = $_.Value.MaximumVersion
AllowPrerelease = $script:IsPreview
Repository = if ($_.Value.Repository) { $_.Value.Repository } else { $DefaultModuleRepository }
Path = $submodulePath
}
if (-not $name)
{
throw "EditorServices module listed without name in '$ModulesJsonPath'"
}
$moduleInfos.Add($name, $body)
}
if ($moduleInfos.Keys.Count -gt 0) {
# `#Requires` doesn't display the version needed in the error message and `using module` doesn't work with InvokeBuild in Windows PowerShell
# so we'll just use Import-Module to check that PowerShellGet 1.6.0 or higher is installed.
# This is needed in order to use the `-AllowPrerelease` parameter
Import-Module -Name PowerShellGet -MinimumVersion 1.6.0 -ErrorAction Stop
}
# Save each module in the modules.json file
foreach ($moduleName in $moduleInfos.Keys)
{
if (Test-Path -Path (Join-Path -Path $submodulePath -ChildPath $moduleName))
{
Write-Host "`tModule '${moduleName}' already detected. Skipping"
continue
}
$moduleInstallDetails = $moduleInfos[$moduleName]
$splatParameters = @{
Name = $moduleName
AllowPrerelease = $moduleInstallDetails.AllowPrerelease
Repository = if ($moduleInstallDetails.Repository) { $moduleInstallDetails.Repository } else { $DefaultModuleRepository }
Path = $submodulePath
}
# Only add Min and Max version if we're doing a stable release.
# This is due to a PSGet issue with AllowPrerelease not installing the latest preview.
if (!$moduleInstallDetails.AllowPrerelease) {
$splatParameters.MinimumVersion = $moduleInstallDetails.MinimumVersion
$splatParameters.MaximumVersion = $moduleInstallDetails.MaximumVersion
}
Write-Host "`tInstalling module: ${moduleName} with arguments $(ConvertTo-Json $splatParameters)"
Save-Module @splatParameters
}
Write-Host "`n"
}

Thanks for the tip @JustinGrote

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions