Zwiscshenstand - laufende Version
Dieser Commit ist enthalten in:
67
main.py
67
main.py
@ -29,7 +29,62 @@ class SkillMateStarter:
|
||||
if sys.platform != 'win32':
|
||||
signal.signal(signal.SIGINT, self.signal_handler)
|
||||
signal.signal(signal.SIGTERM, self.signal_handler)
|
||||
|
||||
|
||||
def _has_local_binary(self, project_dir: Path, binary: str) -> bool:
|
||||
"""Prüft, ob ein lokales NPM-Binary vorhanden ist (Windows .cmd / Unix ohne Endung)."""
|
||||
bin_dir = project_dir / 'node_modules' / '.bin'
|
||||
if sys.platform == 'win32':
|
||||
return (bin_dir / f'{binary}.cmd').exists() or (bin_dir / f'{binary}.CMD').exists()
|
||||
else:
|
||||
return (bin_dir / binary).exists()
|
||||
|
||||
def _ensure_dependencies(self) -> bool:
|
||||
"""Installiert fehlende Node-Abhängigkeiten in backend, frontend, admin-panel.
|
||||
|
||||
Rückgabe: True bei Erfolg, False wenn Installation irreparabel fehlschlägt.
|
||||
"""
|
||||
projects = [
|
||||
(self.base_dir / 'backend', ['nodemon', 'ts-node']),
|
||||
(self.base_dir / 'frontend', ['vite']),
|
||||
(self.base_dir / 'admin-panel', ['vite'])
|
||||
]
|
||||
|
||||
any_install = False
|
||||
for proj_dir, required_bins in projects:
|
||||
if not proj_dir.exists():
|
||||
continue
|
||||
|
||||
needs_install = not (proj_dir / 'node_modules').exists()
|
||||
if not needs_install:
|
||||
# Prüfe konkrete Binaries
|
||||
for b in required_bins:
|
||||
if not self._has_local_binary(proj_dir, b):
|
||||
needs_install = True
|
||||
break
|
||||
|
||||
if needs_install:
|
||||
any_install = True
|
||||
print(f"🔧 Installiere Abhängigkeiten in {proj_dir.name}...")
|
||||
# Bevorzugt npm ci, fallback auf npm install
|
||||
try:
|
||||
cmd_ci = ["cmd", "/c", "npm ci"] if sys.platform == 'win32' else ["npm", "ci"]
|
||||
result = subprocess.run(cmd_ci, cwd=str(proj_dir), check=False)
|
||||
if result.returncode != 0:
|
||||
cmd_install = ["cmd", "/c", "npm install"] if sys.platform == 'win32' else ["npm", "install"]
|
||||
result = subprocess.run(cmd_install, cwd=str(proj_dir), check=False)
|
||||
if result.returncode != 0:
|
||||
print(f"❌ Konnte Abhängigkeiten in {proj_dir.name} nicht installieren. Prüfen Sie Internet/Proxy.")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler bei der Installation in {proj_dir.name}: {e}")
|
||||
return False
|
||||
|
||||
if any_install:
|
||||
print("✅ Abhängigkeiten installiert. Fahre mit dem Start fort...\n")
|
||||
else:
|
||||
print("✅ Abhängigkeiten geprüft – alles vorhanden.\n")
|
||||
return True
|
||||
|
||||
def signal_handler(self, signum, frame):
|
||||
"""Handle Strg+C und andere Signale"""
|
||||
print("\n\n🛑 SkillMate wird beendet...")
|
||||
@ -121,6 +176,12 @@ class SkillMateStarter:
|
||||
for p in [self.backend_port, self.frontend_port, self.admin_port]:
|
||||
self._free_port_windows(p)
|
||||
|
||||
# Abhängigkeiten sicherstellen, bevor Services gestartet werden
|
||||
print(" Prüfe/Installiere Abhängigkeiten...")
|
||||
if not self._ensure_dependencies():
|
||||
print("❌ Abbruch: Abhängigkeiten konnten nicht installiert werden.")
|
||||
return
|
||||
|
||||
# Backend
|
||||
backend_dir = self.base_dir / "backend"
|
||||
if self.mode == 'dev':
|
||||
@ -136,7 +197,7 @@ class SkillMateStarter:
|
||||
# Frontend
|
||||
frontend_dir = self.base_dir / "frontend"
|
||||
if self.mode == 'dev':
|
||||
self._popen_new_console(frontend_dir, f"npm run dev -- --port {self.frontend_port}")
|
||||
self._popen_new_console(frontend_dir, f"npm run dev -- --strictPort --port {self.frontend_port}")
|
||||
else:
|
||||
self._popen_new_console(frontend_dir, f"cmd /c npm run build && npm run preview -- --port {self.frontend_port}")
|
||||
|
||||
@ -144,7 +205,7 @@ class SkillMateStarter:
|
||||
admin_dir = self.base_dir / "admin-panel"
|
||||
if admin_dir.exists():
|
||||
if self.mode == 'dev':
|
||||
self._popen_new_console(admin_dir, f"npm run dev -- --port {self.admin_port}")
|
||||
self._popen_new_console(admin_dir, f"npm run dev -- --strictPort --port {self.admin_port}")
|
||||
else:
|
||||
self._popen_new_console(admin_dir, f"cmd /c npm run build && npm run preview -- --port {self.admin_port}")
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren