@ -1,57 +1,68 @@
<#
. DESCRIPTION
Verifies that installed on the machine . NET SDK versions match the input patterns .
Optionally checks that the nuget . config file is generated correctly .
. PARAMETER Patterns
Specifies the regular expression patterns that should be matched with the installed
on the machine . NET SDK versions . The number of patterns should be equal to the number
of installed . NET versions .
. PARAMETER CheckNugetConfig
Switches the check for the existence of the nuget . config file .
. EXAMPLE
PS > . \ verify-dotnet . ps1 -Paterns " ^3.1.200 $ " , " ^6.0 " -CheckNugetConfig
#>
param (
[ ValidateNotNullOrEmpty ( ) ]
[ Parameter ( Mandatory = $true ) ]
[ string[] ] $Patterns ,
[ ValidateNotNullOrEmpty ( ) ]
[ string ] $ContainedPattern ,
[ switch ] $CheckNugetConfig
)
if ( $CheckNugetConfig . IsPresent ) {
if ( ! ( Test-Path " ../nuget.config " ) )
{
throw " The nuget.config file is not generated correctly. "
}
}
$PatternsList = [ System.Collections.ArrayList ] ( $Patterns )
if ( ! $Patterns . Count )
{
throw " At least 1 dotnet-version pattern should be supplied to script. "
if ( $CheckNugetConfig . IsPresent -and ! ( Test-Path " ../nuget.config " ) ) {
throw " The nuget.config file is not generated correctly. "
}
Write-Host " Those patterns were supplied to the script: $( $Patterns -join ', ' ) . "
$PatternsCount = $PatternsList . Count
Write-Host " Those patterns were supplied to the script: $( $PatternsList -join ', ' ) . "
$dotnet = Get-Command dotnet | Select-Object -First 1 | ForEach-Object { $_ . Path }
Write-Host " Found: ' $dotnet ' "
# SDKs are listed on multiple lines with the path afterwards in square brackets
$versions = & $dotnet - -list -sdks | ForEach-Object { $_ . SubString ( 0 , $_ . IndexOf ( '[' ) ) . Trim ( ) }
Write-Host " Installed versions: $( $versions -join ', ' ) . "
$InstalledVersionCount = 0
foreach ( $pattern in $Patterns )
$Versions = & $dotnet - -list -sdks | ForEach-Object { $_ . SubString ( 0 , $_ . IndexOf ( '[' ) ) . Trim ( ) }
Write-Host " Found installed versions: $( $Versions -join ', ' ) . "
$InstalledVersionCount = $Versions . Count
foreach ( $version in $Versions )
{
foreach ( $version in $versions )
foreach ( $pattern in $PatternsList )
{
if ( $ContainedPattern )
{
if ( $version . StartsWith ( $pattern . ToString ( ) ) -and $version . Contains ( $ContainedPattern ) )
{
$InstalledVersionCount + +
}
}
elseif ( $version . StartsWith ( $pattern . ToString ( ) ) )
{
$InstalledVersionCount + +
}
if ( $version -match $pattern )
{
$PatternsList . Remove ( $pattern )
$InstalledVersionCount - -
break
}
}
}
if ( $InstalledVersionCount -ne $Patterns . Count )
if ( $InstalledVersionCount -ne 0 )
{
throw " An unexpected version of Dotnet is found on the machine, please check the script's dotnet-version patterns ."
throw " An unexpected version of Dotnet is found on the machine, please check the correctness of the -Patterns input ."
}
Write-Host " Changing directory to the ./__tests__/e2e-test-csproj "
Set-Location . / __tests__ / e2e-test -csproj
$workingDir = Get-Location
$testProjectDir = " ./__tests__/e2e-test-csproj "
Set-Location $testProjectDir
$targetFrameworkVersionMapping = @ {
$targetFrameworkVersionMap = @ {
" 1.0 " = " netcoreapp1.0 " ;
" 1.1 " = " netcoreapp1.1 " ;
" 2.0 " = " netcoreapp2.0 " ;
@ -64,14 +75,17 @@ $targetFrameworkVersionMapping = @{
" 7.0 " = " net7.0 " ;
}
foreach ( $version in $ v ersions)
foreach ( $version in $ V ersions)
{
# Creating temporary global.json file inside e2e-test-csproj dir and setting exact version of .NET inside allows to override default behavior of .NET and run build and tests on that exact version.
Write-Host " Creating temporary global.json file for $version .NET version. "
& $dotnet new globaljson - -sdk -version $version - -force
Write-Host " The global.json file for the version $version is created. Currently used .NET version is: $( & $dotnet - -version ) "
Write-Host " The global.json file for the version $version is created. Currently used .NET version is: $( & $dotnet - -version ) . "
# Environment variable TEST_TARGET_FRAMEWORK is used inside the test.csproj file to target required framework version
$version -match " ^(?<key>\d+\.\d+) "
Write-Host " Setting the TEST_TARGET_FRAMEWORK environment variable to $( $targetFrameworkVersionMapping [ $Matches . key ] ) "
[ Environment ] :: SetEnvironmentVariable ( 'TEST_TARGET_FRAMEWORK' , $ ( $targetFrameworkVersionMap ping [ $Matches . key ] ) )
Write-Host " Setting the TEST_TARGET_FRAMEWORK environment variable to $( $targetFrameworkVersionMap [ $Matches . key ] ) "
[ Environment ] :: SetEnvironmentVariable ( 'TEST_TARGET_FRAMEWORK' , $ ( $targetFrameworkVersionMap [ $Matches . key ] ) )
Write-Host " Building test C# project with $version .NET version. "
& $dotnet build - -no -cache
@ -89,8 +103,8 @@ foreach ($version in $versions)
Write-Host " Tests are completed successfully! "
Write-Host " Removing temp rary global.json file."
Write-Host " Removing temp o rary global.json file."
Remove-Item . / global . json
}
Set-Location . . / . .
Set-Location $workingDir