#!/usr/bin/env bash # Полный локальный гейт: формат, сборка, тесты. # # Обёртка вокруг `dotnet build` сама по себе бесполезна — ценность в том, что шаги идут в # правильном порядке, падают быстро и возвращают ненулевой код возврата. # # ./build.sh формат, сборка и тесты в Release # ./build.sh --fix переформатировать код, затем собрать и прогнать тесты # ./build.sh -c Debug другая конфигурация # ./build.sh --skip-tests только собрать set -euo pipefail cd "$(dirname "$0")" SOLUTION=AvParser.slnx CONFIGURATION=Release FIX=0 SKIP_FORMAT=0 SKIP_TESTS=0 while [ $# -gt 0 ]; do case "$1" in -c|--configuration) CONFIGURATION="$2"; shift 2 ;; --fix) FIX=1; shift ;; --skip-format) SKIP_FORMAT=1; shift ;; --skip-tests) SKIP_TESTS=1; shift ;; -h|--help) sed -n '2,10p' "$0"; exit 0 ;; *) echo "Неизвестный аргумент: $1" >&2; exit 2 ;; esac done case "$CONFIGURATION" in Debug|Release) ;; *) echo "Конфигурация должна быть Debug или Release, получено: $CONFIGURATION" >&2; exit 2 ;; esac step() { printf '\n\033[36m==> %s\033[0m\n' "$1"; } trap 'printf "\n\033[31mСБОЙ на шаге: %s\033[0m\n" "${CURRENT_STEP:-?}" >&2' ERR CURRENT_STEP='Локальные инструменты'; step "$CURRENT_STEP" dotnet tool restore CURRENT_STEP='Восстановление пакетов'; step "$CURRENT_STEP" dotnet restore "$SOLUTION" if [ "$SKIP_FORMAT" -eq 0 ]; then if [ "$FIX" -eq 1 ]; then CURRENT_STEP='Форматирование (csharpier format)'; step "$CURRENT_STEP" dotnet csharpier format . else # До сборки: несформатированный файл — самый дешёвый повод упасть. CURRENT_STEP='Проверка форматирования (csharpier check)'; step "$CURRENT_STEP" dotnet csharpier check . fi fi CURRENT_STEP="Сборка ($CONFIGURATION)"; step "$CURRENT_STEP" dotnet build "$SOLUTION" -c "$CONFIGURATION" --no-restore --nologo if [ "$SKIP_TESTS" -eq 0 ]; then CURRENT_STEP='Тесты'; step "$CURRENT_STEP" dotnet test "$SOLUTION" -c "$CONFIGURATION" --no-build --nologo fi printf '\n\033[32mOK\033[0m\n'