diff --git a/TOOLS/ARCHITECTURE.md b/TOOLS/ARCHITECTURE.md index 133db9c..2fce171 100644 --- a/TOOLS/ARCHITECTURE.md +++ b/TOOLS/ARCHITECTURE.md @@ -237,6 +237,9 @@ Enforced by scripts (run before build/commit): - `TOOLS/scripts/check_hardcoded_service_ids.sh` — forbids `svc.ID == N` / `ServiceID == N` outside the registries. -Build rule: `provider/internal/resources_gen` is a transient sync copy, never a -build source. Canonical build is `03_build_and_upload_provider.sh` (temp copy from -`generated//go`); `build-provider.sh` refuses direct build from `provider/`. +Build rule: `provider/internal/resources_gen` and `provider/resources_yaml` are +ephemeral by design and never a build source. Canonical build is +`03_build_and_upload_provider.sh` (temp copy from `generated//go`); +`build-provider.sh` refuses direct build from `provider/`. For local IDE, +`go build` and `go test`, materialize one stand first: +`TOOLS/scripts/dev-materialize.sh ` (output is git-ignored). diff --git a/TOOLS/scripts/check_generated_drift.sh b/TOOLS/scripts/check_generated_drift.sh index d18d8ec..6a939b9 100755 --- a/TOOLS/scripts/check_generated_drift.sh +++ b/TOOLS/scripts/check_generated_drift.sh @@ -41,7 +41,8 @@ if [[ ! -d "$PROV_GO_DIR" ]]; then fi # Сравнение по содержимому, включая файлы, присутствующие только с одной стороны. -if diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >/dev/null; then +# .stand — маркер стенда, который кладёт dev-materialize.sh; в сравнении не участвует. +if diff -rq --exclude='.stand' "$GEN_GO_DIR" "$PROV_GO_DIR" >/dev/null; then echo "OK: no drift for stand '${STAND}' (generated go == provider copy)." exit 0 fi @@ -51,8 +52,9 @@ echo " source: $GEN_GO_DIR" >&2 echo " target: $PROV_GO_DIR" >&2 echo "" >&2 echo "Сгенерированный код стенда расходится с рабочей копией провайдера." >&2 -echo "Сборка должна идти через 03_build_and_upload_provider.sh (temp-копия);" >&2 -echo "provider/internal/resources_gen надо привести в соответствие с generated." >&2 +echo "Релиз собирается через 03_build_and_upload_provider.sh (temp-копия)." >&2 +echo "Для локальной разработки перематериализуй стенд:" >&2 +echo " TOOLS/scripts/dev-materialize.sh ${STAND}" >&2 echo "Различия:" >&2 -diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >&2 || true +diff -rq --exclude='.stand' "$GEN_GO_DIR" "$PROV_GO_DIR" >&2 || true exit 1 diff --git a/TOOLS/scripts/dev-materialize.sh b/TOOLS/scripts/dev-materialize.sh new file mode 100755 index 0000000..110c349 --- /dev/null +++ b/TOOLS/scripts/dev-materialize.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -euo pipefail + +# dev-materialize.sh — локально материализовать сгенерированный код стенда в provider/. +# +# Кладёт в provider/ ЭФЕМЕРНУЮ копию (git-ignored), чтобы штатно работали +# go build / go test / IDE. Это НЕ путь релиза: релиз собирается только через +# 03_build_and_upload_provider.sh (temp-копия со свежесгенерированным кодом). +# +# Использование: +# ./TOOLS/scripts/dev-materialize.sh dev # dev | test | prod +# +# Требует предварительной генерации: +# TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/ + +STAND="${1:-}" +if [[ -z "$STAND" ]]; then + echo "Usage: $0 # dev | test | prod" >&2 + exit 2 +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" + +GEN_GO_DIR="${ROOT_DIR}/generated/${STAND}/go" +GEN_YAML_DIR="${ROOT_DIR}/generated/${STAND}/resources_yaml" +PROV_GO_DIR="${ROOT_DIR}/provider/internal/resources_gen" +PROV_YAML_DIR="${ROOT_DIR}/provider/resources_yaml" + +if [[ ! -d "$GEN_GO_DIR" ]]; then + echo "ERROR: no generated go for stand '${STAND}': $GEN_GO_DIR" >&2 + echo " Run: TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/${STAND}" >&2 + exit 2 +fi +if [[ ! -d "$GEN_YAML_DIR" ]]; then + echo "ERROR: no generated yaml for stand '${STAND}': $GEN_YAML_DIR" >&2 + exit 2 +fi + +# 1) Go-ресурсы. +mkdir -p "$PROV_GO_DIR" +find "$PROV_GO_DIR" -maxdepth 1 -type f -name '*.go' -delete +cp -R "$GEN_GO_DIR"/*.go "$PROV_GO_DIR/" + +# 2) YAML-спеки + embed.go (нужны для go:embed в resources_core). +mkdir -p "$PROV_YAML_DIR" +find "$PROV_YAML_DIR" -maxdepth 1 -type f \( -name '*.yaml' -o -name 'embed.go' \) -delete +cp -a "$GEN_YAML_DIR"/*.yaml "$PROV_YAML_DIR/" +cp "$GEN_YAML_DIR"/embed.go "$PROV_YAML_DIR/embed.go" 2>/dev/null || true + +# 3) Маркер стенда — чтобы не спутать, какой стенд лежит в provider/. +printf '%s\n' "$STAND" > "$PROV_GO_DIR/.stand" + +echo "Materialized stand '${STAND}' into provider/ (internal/resources_gen + resources_yaml)." +echo "This copy is ephemeral and git-ignored. Release build always uses 03_build_and_upload_provider.sh."