Diese Anleitung behandelt den täglichen Entwicklungs-Workflow für Beiträge zu Bedrud.
Repository-Struktur
bedrud/
├── server/ # Go backend
├── apps/
│ ├── web/ # React frontend (TanStack Start)
│ ├── android/ # Android app
│ ├── ios/ # iOS app
│ └── desktop/ # Desktop app (Rust + Slint)
├── agents/ # Python bot agents
├── packages/ # Shared TypeScript types
├── tools/cli/ # Deployment CLI
├── docs/ # Documentation (MkDocs)
├── Cargo.toml # Rust workspace root
├── Makefile # Build orchestration
└── Dockerfile # Container build
Voraussetzungen
| Tool | Erforderlich für |
|---|---|
| Go 1.24+ | Server |
| Bun | Web-Frontend |
| LiveKit Server | Lokaler Medienserver |
| Android Studio + JDK 17 | Android-App |
| Xcode | iOS-App |
| Rust (stable) | Desktop-App |
| Python 3.10+ | Bot-Agenten |
| FFmpeg | Radio- und Video-Agenten |
Ersteinrichtung
git clone https://github.com/bedrud-ir/bedrud.git
cd bedrud
make initFull-Stack-Entwicklung
Um den gesamten Stack lokal auszuführen:
make devDies startet LiveKit, den Go-Server und den React-Dev-Server gleichzeitig. Drücken Sie Ctrl+C, um alle Prozesse zu stoppen.
Dienste einzeln ausführen
make dev-webLäuft unter http://localhost:3000 mit Hot Module Replacement.
make dev-serverLäuft unter http://localhost:8090. Nach Go-Codeänderungen manuell neu starten.
make dev-livekitLäuft unter http://localhost:7880 mit Entwicklungszugangsdaten.
Server-Entwicklung
Der Einstiegspunkt des Go-Servers ist server/cmd/server/main.go.
Einen API-Endpunkt hinzufügen
- Handler definieren in
server/internal/handlers/ - Repository-Methoden hinzufügen in
server/internal/repository/, falls neue DB-Abfragen benötigt werden - Route registrieren im Server-Setup (normalerweise in
main.gooder einer Routen-Datei) - Middleware hinzufügen, falls der Endpunkt Authentifizierung oder Admin-Prüfungen benötigt
Datenbankänderungen
Fügen Sie GORM-Model-Structs hinzu oder ändern Sie diese in server/internal/models/. GORM migriert automatisch beim Start.
Swagger-Dokumentation
API-Dokumentationsannotationen verwenden das swaggo-Format. Nach Änderungen neu generieren:
cd server
swag init -g cmd/server/main.goSiehe Server-Architektur für das vollständige Verzeichnislayout und das Layered-Design.
Web-Frontend-Entwicklung
Das Frontend befindet sich in apps/web/ und verwendet React 19 mit TanStack Start.
Eine Seite hinzufügen
Erstellen Sie eine neue Datei unter src/routes/ gemäß der dateibasierten Routing-Konvention von TanStack Router (z. B. src/routes/settings.tsx). Exportieren Sie eine Route, die mit createFileRoute erstellt wurde.
Eine API-Client-Funktion hinzufügen
- Funktion in
src/lib/api.tsmitauthFetchhinzufügen - TypeScript-Typen inline oder in einer gemeinsamen Typdatei definieren
- Funktion aus Ihrer Routen-Komponente verwenden, typischerweise über einen TanStack Query
useQuery-Hook
Typprüfung
cd apps/web
bun run check # runs Biome lint + TypeScript type checkSiehe Web-Frontend-Architektur für die vollständige Frontend-Struktur und Muster.
Android-Entwicklung
make dev-android # Opens in Android StudioWichtige Muster
- Alle Bildschirme sind Composable-Funktionen
- Abhängigkeiten kommen vom
InstanceManagerüberkoinInject() - Verwenden Sie
collectAsState().value ?: returnfür nullableStateFlow-Werte - Navigation wird in
MainActivity.ktverwaltet
Build
make build-android-debug # Debug APK
make build-android # Release APK (needs keystore)
make release-android # Build + install on deviceSiehe Android-App-Architektur für detaillierte mobile App-Architektur.
iOS-Entwicklung
make dev-ios # Opens in XcodeWichtige Muster
- Views sind SwiftUI-Structs
- Abhängigkeiten kommen vom
InstanceManagerüber@EnvironmentObject - Verwenden Sie Optional Binding für nullable Published Properties
- Navigation verwendet den nativen Navigation-Stack von SwiftUI
Projektgenerierung
Wenn Sie project.yml ändern, generieren Sie das Xcode-Projekt neu:
cd apps/ios
xcodegen generateBuild
make build-ios # Release archive
make build-ios-sim # Simulator build
make export-ios # Export IPASiehe iOS-App-Architektur für detaillierte mobile App-Architektur.
Desktop-Entwicklung
Die Desktop-App befindet sich in apps/desktop/ und ist ein Rust-Crate im Workspace.
Voraussetzungen (Linux)
sudo apt-get install -y \
libfontconfig1-dev libxkbcommon-dev libxkbcommon-x11-dev \
libwayland-dev libgles2-mesa-dev libegl1-mesa-dev \
libdbus-1-dev libsecret-1-dev \
libasound2-devWindows erfordert Visual Studio Build Tools mit der C++-Workload (MSVC).
Ausführen
make dev-desktop # cargo run -p bedrud-desktopBuild
make build-desktop # optimised binary for the current platformWichtige Muster
- Die gesamte UI ist in
.slint-Dateien unterapps/desktop/ui/definiert; wird zur Build-Zeit vonbuild.rszu Rust kompiliert apps/desktop/src/ui/bridge.rsist der einzige Ort, an dem Slint-Callbacks mit Rust-Logik verbunden werden - halten Sie Geschäftslogik aus den.slint-Dateien heraus- Verwenden Sie
Weak<AppWindow>, wenn Sie Hintergrundaufgaben starten, die die UI aktualisieren müssen
Siehe Desktop-App-Architektur für detaillierte Desktop-App-Architektur.
Bot-Agenten-Entwicklung
Agenten befinden sich in agents/ mit einem Verzeichnis pro Agent.
cd agents/music_agent
pip install -r requirements.txt
python agent.py "http://localhost:8090/m/test-room"Alle Agenten benötigen einen laufenden Bedrud-Server zur Authentifizierung.
CI/CD
GitHub Actions wird bei jedem Push auf main und bei Pull Requests ausgeführt:
| Job | Was geprüft wird |
|---|---|
| Server | go vet, Build, Tests |
| Web | Typprüfung, Build |
| Android | Lint, Unit-Tests, Debug-APK |
| iOS | Build + Test (Simulator, mit Coverage) |
| Desktop | cargo build, cargo test |
Release-Builds werden durch Versions-Tags (v*) ausgelöst.
Code-Stil
- Go: Standard
gofmt-Formatierung - TypeScript/React: Biome (konfiguriert in
apps/web/biome.json) - Kotlin: Android Studio-Standardformatierung
- Swift: Xcode-Standardformatierung
Testing
cd server
go test ./...cd apps/web
bun run checkcd apps/android
./gradlew testmake build-ios-sim # Builds and runs testsSiehe auch
- Makefile-Referenz - alle Build- und Dev-Befehle
- Architekturübersicht - wie die Komponenten zusammenpassen