diff --git a/Build.ps1 b/Build.ps1 index c385d8b1..3b80be47 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -30,7 +30,7 @@ $script:DependencyVersions = @{ 'powershell-yaml' = $null 'ps1xmlgen' = $null 'PlatyPS' = $null - 'Pester' = @{ MinimumVersion = '5.0' } + 'Pester' = @{ RequiredVersion = '6.0.0-rc4'; AllowPrerelease = $true } } } @@ -122,11 +122,15 @@ Function Install-PsModule($Module, $Version) { Write-Verbose "Restoring module $Module" $minVersion = if ($Version -is [hashtable]) { $Version['MinimumVersion'] } else { $null } - $exactVersion = if ($Version -is [hashtable]) { $null } else { $Version } + $exactVersion = if ($Version -is [hashtable]) { $Version['RequiredVersion'] } else { $Version } + $allowPrerelease = ($Version -is [hashtable]) -and $Version['AllowPrerelease'] $existing = Get-Module $Module -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1 if ($existing) { - if ($exactVersion -and $existing.Version -ne [version]$exactVersion) { <# fall through to install #> } + $existingVersion = $existing.Version.ToString() + if ($existing.PrivateData.PSData.Prerelease) { $existingVersion = "$existingVersion-$($existing.PrivateData.PSData.Prerelease)" } + + if ($exactVersion -and $existingVersion -ne $exactVersion) { <# fall through to install #> } elseif ($minVersion -and $existing.Version -lt [version]$minVersion) { <# fall through to install #> } else { Write-Verbose "PowerShell module $Module found; Skipping..." @@ -140,8 +144,9 @@ Function Install-PsModule($Module, $Version) { } $installArgs = @{ Name = $Module; Scope = 'CurrentUser'; Force = $true; AllowClobber = $true } - if ($exactVersion) { $installArgs['RequiredVersion'] = $exactVersion } - if ($minVersion) { $installArgs['MinimumVersion'] = $minVersion } + if ($exactVersion) { $installArgs['RequiredVersion'] = $exactVersion } + if ($minVersion) { $installArgs['MinimumVersion'] = $minVersion } + if ($allowPrerelease) { $installArgs['AllowPrerelease'] = $true } Install-Module @installArgs | Write-Verbose } @@ -200,6 +205,8 @@ try { $pesterSpec = $script:DependencyVersions.PsModules['Pester'] $pesterMinVersion = if ($pesterSpec -is [hashtable]) { $pesterSpec['MinimumVersion'] } else { $null } + $pesterRequiredVersion = if ($pesterSpec -is [hashtable]) { $pesterSpec['RequiredVersion'] } else { $pesterSpec } + $pesterAllowPrerelease = ($pesterSpec -is [hashtable]) -and $pesterSpec['AllowPrerelease'] Invoke-Psake -Nologo -BuildFile $psakeScript -TaskList $Targets -Verbose:$IsVerbose -ErrorAction SilentlyContinue ` -Parameters @{ @@ -215,7 +222,9 @@ try { SkipReleaseNotes = $SkipReleaseNotes.IsPresent Incremental = $Incremental.IsPresent IsCI = $isCI - PesterMinVersion = $pesterMinVersion + PesterMinVersion = $pesterMinVersion + PesterRequiredVersion = $pesterRequiredVersion + PesterAllowPrerelease = $pesterAllowPrerelease } Write-Verbose "=== END PSAKE ===" diff --git a/psake.ps1 b/psake.ps1 index da74ea1e..b526aa23 100644 --- a/psake.ps1 +++ b/psake.ps1 @@ -57,6 +57,8 @@ Properties { # Test dependencies $PesterMinVersion = $null + $PesterRequiredVersion = $null + $PesterAllowPrerelease = $false } Task Rebuild -Depends Clean, Build { @@ -247,7 +249,10 @@ Task AllTests -PreCondition { -not $SkipTests } { try { Write-Output ' == PowerShell Core ==' - if ($PesterMinVersion) { + if ($PesterRequiredVersion) { + $allowPrereleaseArg = if ($PesterAllowPrerelease) { '-AllowPrerelease' } else { '' } + Exec { pwsh.exe -NonInteractive -NoLogo -Command "if (-not (Get-Module Pester -ListAvailable | Where-Object { `$version = `$_.Version.ToString(); if (`$_.PrivateData.PSData.Prerelease) { `$version = `$version + '-' + `$_.PrivateData.PSData.Prerelease }; `$version -eq '$PesterRequiredVersion' })) { Install-Module Pester -RequiredVersion $PesterRequiredVersion $allowPrereleaseArg -Force -Scope CurrentUser -SkipPublisherCheck -AllowClobber }" } + } elseif ($PesterMinVersion) { Exec { pwsh.exe -NonInteractive -NoLogo -Command "if (-not (Get-Module Pester -ListAvailable | Where-Object { `$_.Version -ge [version]'$PesterMinVersion' })) { Install-Module Pester -MinimumVersion $PesterMinVersion -Force -Scope CurrentUser -SkipPublisherCheck -AllowClobber }" } } Exec { pwsh.exe -NonInteractive -NoLogo -Command "`$cfg = New-PesterConfiguration; `$cfg.Run.Exit = `$true; `$cfg.TestResult.Enabled = `$true; `$cfg.Output.Verbosity = '$outputLevel'; `$cfg.Filter.ExcludeTag = @('Desktop', 'Server'); Invoke-Pester -Configuration `$cfg" } @@ -255,7 +260,10 @@ Task AllTests -PreCondition { -not $SkipTests } { Move-Item 'coverage.xml' -Destination $OutDir/Coverage-Pester-Core.xml -Force Write-Output ' == PowerShell Desktop ==' - if ($PesterMinVersion) { + if ($PesterRequiredVersion) { + $allowPrereleaseArg = if ($PesterAllowPrerelease) { '-AllowPrerelease' } else { '' } + Exec { powershell.exe -NonInteractive -NoLogo -Command "if (-not (Get-Module Pester -ListAvailable | Where-Object { `$version = `$_.Version.ToString(); if (`$_.PrivateData.PSData.Prerelease) { `$version = `$version + '-' + `$_.PrivateData.PSData.Prerelease }; `$version -eq '$PesterRequiredVersion' })) { Install-Module Pester -RequiredVersion $PesterRequiredVersion $allowPrereleaseArg -Force -Scope CurrentUser -SkipPublisherCheck -AllowClobber }" } + } elseif ($PesterMinVersion) { Exec { powershell.exe -NonInteractive -NoLogo -Command "if (-not (Get-Module Pester -ListAvailable | Where-Object { `$_.Version -ge [version]'$PesterMinVersion' })) { Install-Module Pester -MinimumVersion $PesterMinVersion -Force -Scope CurrentUser -SkipPublisherCheck -AllowClobber }" } } Exec { powershell.exe -NonInteractive -NoLogo -Command "`$cfg = New-PesterConfiguration; `$cfg.Run.Exit = `$true; `$cfg.TestResult.Enabled = `$true; `$cfg.Output.Verbosity = '$outputLevel'; `$cfg.Filter.ExcludeTag = @('Core', 'Server'); Invoke-Pester -Configuration `$cfg" }