#!/usr/bin/env pwsh <# .SYNOPSIS Полный локальный гейт: формат, сборка, тесты. .DESCRIPTION То, что имеет смысл прогнать перед коммитом. Обёртка вокруг `dotnet build` сама по себе бесполезна — ценность здесь в том, что шаги идут в правильном порядке, падают быстро и возвращают ненулевой код возврата. .PARAMETER Configuration Debug или Release. По умолчанию Release — гейт должен проверять то, что уедет. .PARAMETER Fix Переформатировать код вместо проверки. Без этого флага несформатированный код валит сборку. .PARAMETER SkipFormat Пропустить проверку форматирования. .PARAMETER SkipTests Только собрать, не запускать тесты. .EXAMPLE ./build.ps1 Формат, сборка и тесты в Release. .EXAMPLE ./build.ps1 -Fix Переформатировать код, затем собрать и прогнать тесты. #> [CmdletBinding()] param( [ValidateSet('Debug', 'Release')] [string] $Configuration = 'Release', [switch] $Fix, [switch] $SkipFormat, [switch] $SkipTests ) $ErrorActionPreference = 'Stop' Set-Location $PSScriptRoot $solution = 'AvParser.slnx' $started = Get-Date function Invoke-Step { param( [Parameter(Mandatory)] [string] $Name, [Parameter(Mandatory)] [scriptblock] $Action ) Write-Host '' Write-Host "==> $Name" -ForegroundColor Cyan & $Action # Native executables do not raise terminating errors, so the exit code is the only signal. if ($LASTEXITCODE -ne 0) { throw "$Name — код возврата $LASTEXITCODE" } } try { Invoke-Step 'Локальные инструменты' { dotnet tool restore } Invoke-Step 'Восстановление пакетов' { dotnet restore $solution } if (-not $SkipFormat) { if ($Fix) { Invoke-Step 'Форматирование (csharpier format)' { dotnet csharpier format . } } else { # Before the build: an unformatted file is the cheapest possible failure. Invoke-Step 'Проверка форматирования (csharpier check)' { dotnet csharpier check . } } } Invoke-Step "Сборка ($Configuration)" { dotnet build $solution -c $Configuration --no-restore --nologo } if (-not $SkipTests) { Invoke-Step 'Тесты' { dotnet test $solution -c $Configuration --no-build --nologo } } $elapsed = (Get-Date) - $started Write-Host '' Write-Host ("OK — {0:mm\:ss}" -f $elapsed) -ForegroundColor Green } catch { Write-Host '' Write-Host "СБОЙ: $_" -ForegroundColor Red exit 1 }