refactor: Build-Output in Build/{OS}/-Ordnerstruktur

Plattformspezifische bin/obj/publish-Ordner unter Build/Linux/
und Build/Windows/ statt bin-linux/, obj-linux/, publish/ etc.

- Directory.Build.props: OS-Erkennung setzt BaseOutputPath,
  BaseIntermediateOutputPath und MSBuildProjectExtensionsPath
  auf Build/{Linux|Windows|macOS}/
- gott.csproj: Vereinfacht auf ein einziges Build/** Exclude
- deploy.sh: publish-Output nach Build/Linux/publish
- OpenClawEndpoint.cs: DB-Pfad relativ zu AppContext.BaseDirectory
- Doku (README, ARCHITECTURE, ARCHITECTURE_QUICK) aktualisiert
This commit is contained in:
Meleki committed 2026-03-09 15:50:11 +01:00
1 parent 809e59d540
commit b40a872c29
8 files changed
+59 -48

No files matched your search

+2 -3
View File
@@ -1,8 +1,7 @@
Build/
bin/
data/
obj/
publish/
publish-win/
data/
Temp/
appsettings.Production.json
DEVY.md
+11 -7
View File
@@ -235,7 +235,11 @@ gott/
│ ├── MainWindow.xaml/cs # WebView2 Host Window
│ └── appsettings.json # Server-URL Konfiguration
│
└── publish/ # Build-Output (NICHT editieren!)
└── Build/ # Build-Output (NICHT editieren!)
├── Linux/
│ ├── bin/ obj/ publish/
└── Windows/
├── bin/ obj/ publish/
└── data/
├── gott.db # SQLite Datenbank
├── agents/ # Agent Memory-Dateien
@@ -1527,7 +1531,7 @@ Im `WindowsApp/`-Ordner liegt ein minimaler **WPF WebView2 Client**:
## OpenClaw Import
Sessions können mit Chatverlauf aus einer **OpenClaw-Instanz** befüllt werden. Die Import-Quelle ist eine SQLite-Datenbank (`publish/data/openclaw-sessions.db`).
Sessions können mit Chatverlauf aus einer **OpenClaw-Instanz** befüllt werden. Die Import-Quelle ist eine SQLite-Datenbank (`Build/<OS>/publish/data/openclaw-sessions.db`).
### Funktionsweise
@@ -1570,7 +1574,7 @@ set -e
cd /app/gott
export PATH="$HOME/.dotnet:$PATH"
systemctl stop gott
dotnet publish -c Release -o publish
dotnet publish -c Release -o Build/Linux/publish
systemctl start gott
echo "OK"
```
@@ -1578,9 +1582,9 @@ echo "OK"
### Verzeichnisse
- **Quell-Code**: `/app/gott/` (wwwroot/, Services/, etc.)
- **Build-Output**: `/app/gott/publish/`
- **Laufzeit-Daten**: `/app/gott/publish/data/` (DB, Agents, Images, Skills)
- **WICHTIG**: Änderungen IMMER in `wwwroot/` machen, NIEMALS in `publish/wwwroot/`
- **Build-Output**: `/app/gott/Build/<OS>/publish/`
- **Laufzeit-Daten**: `/app/gott/Build/<OS>/publish/data/` (DB, Agents, Images, Skills)
- **WICHTIG**: Änderungen IMMER in `wwwroot/` machen, NIEMALS in `Build/*/publish/wwwroot/`
### systemd
@@ -1606,7 +1610,7 @@ Die Anwendung läuft als systemd Service (`gott.service`), Kestrel auf Port 1900
### appsettings.Production.json
Überschreibt Werte aus `appsettings.json` im Production-Environment. Wird **nicht** beim Publish mitkopiert (liegt nur im `publish/`-Verzeichnis). Verwaltung über die **Admin-UI** (Servereinstellungen, `#/server-settings`).
Überschreibt Werte aus `appsettings.json` im Production-Environment. Wird **nicht** beim Publish mitkopiert (liegt nur im `Build/<OS>/publish/`-Verzeichnis). Verwaltung über die **Admin-UI** (Servereinstellungen, `#/server-settings`).
### Environment
+9 -5
View File
@@ -41,7 +41,11 @@ gott/
│ ├── js/pages/ # Seiten-Komponenten (inkl. telegram-bot-page.js)
│ └── css/ # Styles (theme.css = CSS Variables)
├── WindowsApp/ # WPF + WebView2 Desktop Client
└── publish/ # ⛔ NICHT editieren!
└── Build/ # ⛔ NICHT editieren!
├── Linux/
│ ├── bin/ obj/ publish/
└── Windows/
├── bin/ obj/ publish/
└── data/
├── gott.db # SQLite DB
├── agents/{id}/ # Memory-Dateien pro Agent
@@ -252,7 +256,7 @@ User-Input → POST /api/chat (SSE)
}
```
Verwaltung über **Admin-UI** (`#/server-settings`): Liest `appsettings.Production.json` (Fallback: `appsettings.json` → Default). Schreibt immer in `appsettings.Production.json`. Die Datei wird **nicht** beim Publish mitkopiert.
Verwaltung über **Admin-UI** (`#/server-settings`): Liest `appsettings.Production.json` (Fallback: `appsettings.json` → Default). Schreibt immer in `appsettings.Production.json`.
---
@@ -295,8 +299,8 @@ Eine Session kann bis zu **vier Agents** haben: Worker (Pflicht), Preparer (opti
## Wichtige Regeln beim Entwickeln
- ⚠️ **Quelldateien in `wwwroot/`** editieren, NICHT in `publish/wwwroot/`
- ⛔ **`publish/data/gott.db`** niemals manuell modifizieren/löschen
- ⛔ **`publish/`** generell nicht anfassen
- ⚠️ **Quelldateien in `wwwroot/`** editieren, NICHT in `Build/*/publish/wwwroot/`
- ⛔ **`Build/*/publish/data/gott.db`** niemals manuell modifizieren/löschen
- ⛔ **`Build/`** generell nicht anfassen
- 🔧 **.NET 10** ohne Nullable, ohne Implicit Usings
- 📦 DB-Migrationen sind idempotent (IF NOT EXISTS Pattern in `DatabaseService`)
+17
View File
@@ -0,0 +1,17 @@
<Project>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
<BaseIntermediateOutputPath>Build\Windows\obj\</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>Build\Windows\obj\</MSBuildProjectExtensionsPath>
<BaseOutputPath>Build\Windows\bin\</BaseOutputPath>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Linux'))">
<BaseIntermediateOutputPath>Build/Linux/obj/</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>Build/Linux/obj/</MSBuildProjectExtensionsPath>
<BaseOutputPath>Build/Linux/bin/</BaseOutputPath>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('OSX'))">
<BaseIntermediateOutputPath>Build/macOS/obj/</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>Build/macOS/obj/</MSBuildProjectExtensionsPath>
<BaseOutputPath>Build/macOS/bin/</BaseOutputPath>
</PropertyGroup>
</Project>
+2 -13
View File
@@ -17,7 +17,7 @@ namespace Gott.Endpoints;
public static class OpenClawEndpoint
{
private const string OpenClawDbRelativePath = "publish/data/openclaw-sessions.db";
private static readonly string OpenClawDbRelativePath = Path.Combine("data", "openclaw-sessions.db");
private const string ImportTag = "openclaw-import";
public static void MapOpenClawEndpoints(this IEndpointRouteBuilder app)
@@ -28,18 +28,7 @@ public static class OpenClawEndpoint
private static string GetOpenClawDbPath()
{
// Resolve relative to the app base directory
var basePath = AppContext.BaseDirectory;
// Navigate up from bin/Debug/net10.0 or similar to the project root
var candidate = Path.Combine(basePath, OpenClawDbRelativePath);
if (File.Exists(candidate)) return candidate;
// Try from current directory
candidate = Path.Combine(Directory.GetCurrentDirectory(), OpenClawDbRelativePath);
if (File.Exists(candidate)) return candidate;
// Try absolute common path
candidate = Path.Combine("/app/gott", OpenClawDbRelativePath);
var candidate = Path.Combine(AppContext.BaseDirectory, OpenClawDbRelativePath);
if (File.Exists(candidate)) return candidate;
return null;
+12 -4
View File
@@ -55,7 +55,7 @@ Self-hosted AI-Coding-Agent auf Basis der Anthropic Claude API. Stellt eine Web-
## Konfiguration
Beim ersten Start wird `appsettings.json` mit Standardwerten verwendet. Für eigene Einstellungen eine `appsettings.Production.json` im `publish/`-Verzeichnis anlegen (oder über die Admin-UI verwalten):
Beim ersten Start wird `appsettings.json` mit Standardwerten verwendet. Für eigene Einstellungen eine `appsettings.Production.json` im `Build/Linux/publish/`-Verzeichnis anlegen (oder über die Admin-UI verwalten):
```json
{
@@ -79,7 +79,7 @@ Beim ersten Start wird `appsettings.json` mit Standardwerten verwendet. Für eig
| `KreaToken` | Krea AI API Token (optional) | – |
| `KreaApiKey` | API-Key für Krea-Endpoints ohne User-Auth (optional) | – |
> **Hinweis:** Die `appsettings.Production.json` wird **nicht** beim `dotnet publish` mitkopiert. Sie lebt ausschließlich im `publish/`-Verzeichnis und kann über die Admin-UI (`#/server-settings`) verwaltet werden.
> **Hinweis:** Die `appsettings.Production.json` wird **nicht** beim `dotnet publish` mitkopiert. Sie lebt ausschließlich im `Build/Linux/publish/`-Verzeichnis und kann über die Admin-UI (`#/server-settings`) verwaltet werden.
## Starten
@@ -117,7 +117,7 @@ After=network.target
[Service]
Type=exec
WorkingDirectory=/app/gott
ExecStart=/app/gott/publish/gott
ExecStart=/app/gott/Build/Linux/publish/gott
Restart=on-failure
RestartSec=5
@@ -142,7 +142,15 @@ gott/
│ ├── js/ # App, Router, API, Chat, UI-Module (modular aufgeteilt), Pages
│ └── css/ # Styles (theme.css = CSS Variables)
├── WindowsApp/ # WPF + WebView2 Desktop Client
└── publish/ # Build-Output + Laufzeit-Daten
└── Build/ # Build-Output + Laufzeit-Daten
├── Linux/
│ ├── bin/
│ ├── obj/
│ └── publish/
└── Windows/
├── bin/
├── obj/
└── publish/
└── data/
├── gott.db # SQLite Datenbank
├── agents/{id}/ # Memory-Dateien pro Agent
+1 -1
View File
@@ -3,6 +3,6 @@ set -e
cd /app/gott
export PATH="$HOME/.dotnet:$PATH"
systemctl stop gott
dotnet publish -c Release -o publish
dotnet publish -c Release -o Build/Linux/publish
systemctl start gott
echo "OK"
+5 -15
View File
@@ -5,18 +5,12 @@
<NoWarn>ASP0015;IDE0017;IDE0028;IDE0130;IDE0305;IDE1006;SYSLIB1045</NoWarn>
</PropertyGroup>
<!-- Exclude Build output and other non-source directories -->
<ItemGroup>
<Compile Remove="publish/**" />
<Content Remove="publish/**" />
<EmbeddedResource Remove="publish/**" />
<None Remove="publish/**" />
</ItemGroup>
<ItemGroup>
<Compile Remove="publish-win/**" />
<Content Remove="publish-win/**" />
<EmbeddedResource Remove="publish-win/**" />
<None Remove="publish-win/**" />
<Compile Remove="Build/**" />
<Content Remove="Build/**" />
<EmbeddedResource Remove="Build/**" />
<None Remove="Build/**" />
</ItemGroup>
<ItemGroup>
@@ -37,10 +31,6 @@
<Content Include="Templates/**" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.Production.json" CopyToOutputDirectory="Never" CopyToPublishDirectory="Never" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Cronos" Version="0.11.1" />
<PackageReference Include="Dapper" Version="2.1.66" />