fix(epf-build,epf-dump,web-publish): надёжный резолв пути к платформе 1С

Распространение фикса резолва (см. предыдущий коммит по db-*) на
оставшиеся навыки с тем же дублированным блоком:
- epf-build, epf-dump (ps1+py): резолв 1cv8.exe — реестр .v8-project.json
  → числовая сортировка версий → glob Program Files [+ (x86)] с заметкой.
- web-publish (ps1+py): резолв bin-каталога (для wsap24.dll) — те же
  приоритеты; v8path из реестра уже есть нужный bin-каталог.

Чинит лексикографический выбор версии и узкую область поиска; py
деградирует без падения вне Windows. Версии: epf-* 1.0→1.1,
web-publish 1.2→1.3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-21 14:35:48 +03:00
co-authored by Claude Opus 4.8
parent e507e6bfba
commit 3d36c20269
6 changed files with 201 additions and 26 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# web-publish v1.2 — Publish 1C infobase via Apache
# web-publish v1.3 — Publish 1C infobase via Apache
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
"""
@@ -11,6 +11,7 @@
import argparse
import glob
import json
import os
import re
import shutil
@@ -24,6 +25,33 @@ import zipfile
import psutil
def _find_project_v8path():
"""Walk up from CWD to find .v8-project.json and read its v8path."""
d = os.getcwd()
while True:
pf = os.path.join(d, ".v8-project.json")
if os.path.isfile(pf):
try:
with open(pf, encoding="utf-8-sig") as f:
data = json.load(f)
v = data.get("v8path")
if v:
return v
except Exception:
pass
return None
parent = os.path.dirname(d)
if parent == d:
return None
d = parent
def _version_key(p):
"""Numeric sort key from version dir name (.../1cv8/<ver>/bin/1cv8.exe)."""
ver = os.path.basename(os.path.dirname(os.path.dirname(p)))
return [int(x) for x in re.findall(r"\d+", ver)]
def get_our_httpd(httpd_exe_norm):
"""Filter httpd processes by our ApachePath."""
result = []
@@ -78,10 +106,17 @@ def main():
# --- Resolve V8Path ---
v8_path = args.V8Path
if not v8_path:
candidates = glob.glob(r'C:\Program Files\1cv8\*\bin\1cv8.exe')
candidates.sort(reverse=True)
v8_path = _find_project_v8path()
if not v8_path:
candidates = (
glob.glob(r'C:\Program Files\1cv8\*\bin\1cv8.exe')
+ glob.glob(r'C:\Program Files (x86)\1cv8\*\bin\1cv8.exe')
)
if candidates:
v8_path = os.path.dirname(candidates[0])
best = max(candidates, key=_version_key)
v8_path = os.path.dirname(best)
ver = os.path.basename(os.path.dirname(v8_path))
print(f'Auto-selected platform {ver}: {v8_path}')
else:
print('Error: платформа 1С не найдена. Укажите -V8Path', file=sys.stderr)
sys.exit(1)