refactor(build): эфемерные generated-копии — dev-materialize по стенду вместо постоянного дубля

This commit is contained in:
Repinoid
2026-09-22 13:48:36 +03:00
parent c14f7de7bc
commit 78f9dfbcfb
3 changed files with 67 additions and 7 deletions
+6 -3
View File
@@ -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/<stand>/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/<stand>/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 <stand>` (output is git-ignored).
+6 -4
View File
@@ -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
+55
View File
@@ -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>
STAND="${1:-}"
if [[ -z "$STAND" ]]; then
echo "Usage: $0 <stand> # 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."