Build-System
Einheitliches Build-System
Abschnitt betitelt „Einheitliches Build-System“Wails bietet ein einheitliches Build-System, das Go-Code kompiliert, Frontend-Assets bündelt, alles in eine einzige ausführbare Datei einbettet und plattformspezifische Builds durchführt – alles mit einem einzigen Befehl.
wails3 buildAusgabe: Native ausführbare Datei mit allem eingebettet.
Überblick über den Build-Prozess
Abschnitt betitelt „Überblick über den Build-Prozess“[Platzhalter für Build-Prozess-Diagramm]
Build-Phasen
Abschnitt betitelt „Build-Phasen“1. Analysephase
Abschnitt betitelt „1. Analysephase“Wails scannt Ihren Go-Code, um Ihre Dienste zu verstehen:
type GreetService struct { prefix string}
func (g *GreetService) Greet(name string) string { return g.prefix + name + "!"}Was Wails extrahiert:
- Dienstname:
GreetService - Methodenname:
Greet - Parametertypen:
string - Rückgabetypen:
string
Verwendet für: Generieren von TypeScript-Bindings
2. Generierungsphase
Abschnitt betitelt „2. Generierungsphase“TypeScript-Bindings
Abschnitt betitelt „TypeScript-Bindings“Wails generiert typsichere Bindings:
export function Greet(name: string): Promise<string> { return window.wails.Call('GreetService.Greet', name)}Vorteile:
- Volle Typsicherheit
- IDE-Autovervollständigung
- Fehler zur Kompilierzeit
- JSDoc-Kommentare
Frontend-Build
Abschnitt betitelt „Frontend-Build“Ihr Frontend-Bundler läuft (Vite, webpack, usw.):
# Vite-Beispielvite build --outDir distWas passiert:
- JavaScript/TypeScript kompiliert
- CSS verarbeitet und minimiert
- Assets optimiert
- Source Maps generiert (nur für Entwicklung)
- Ausgabe nach
frontend/dist/
3. Kompilierungsphase
Abschnitt betitelt „3. Kompilierungsphase“Go-Kompilierung
Abschnitt betitelt „Go-Kompilierung“Go-Code wird mit Optimierungen kompiliert:
go build -ldflags="-s -w" -o myapp.exeFlags:
-s: Symboltabelle entfernen-w: DWARF-Debugging-Informationen entfernen- Ergebnis: Kleinere Binärdatei (~30% Reduzierung)
Plattformspezifisch:
- Windows:
.exemit eingebettetem Icon - macOS:
.app-Bundle-Struktur - Linux: ELF-Binärdatei
Asset-Einbettung
Abschnitt betitelt „Asset-Einbettung“Frontend-Assets werden in die Go-Binärdatei eingebettet:
//go:embed frontend/distvar assets embed.FSErgebnis: Einzelne ausführbare Datei mit allem darin.
4. Ausgabe
Abschnitt betitelt „4. Ausgabe“Einzelne native Binärdatei:
- Windows:
myapp.exe(~15MB) - macOS:
myapp.app(~15MB) - Linux:
myapp(~15MB)
Keine Abhängigkeiten (außer System-WebView).
Entwicklung vs. Produktion
Abschnitt betitelt „Entwicklung vs. Produktion“Für Geschwindigkeit optimiert:
wails3 devWas passiert:
- Startet Frontend-Entwicklungsserver (Vite auf Port 5173)
- Kompiliert Go ohne Optimierungen
- Startet App, die auf Entwicklungsserver zeigt
- Aktiviert Hot Reload
- Enthält Source Maps
Eigenschaften:
- Schnelle Neukompilierung (<1s für Frontend-Änderungen)
- Keine Asset-Einbettung (wird vom Entwicklungsserver bereitgestellt)
- Debug-Symbole enthalten
- Source Maps aktiviert
- Ausführliche Protokollierung
Dateigröße: Größer (~50MB mit Debug-Symbolen)
Für Größe und Leistung optimiert:
wails3 buildWas passiert:
- Erstellt Frontend für Produktion (minimiert)
- Kompiliert Go mit Optimierungen
- Entfernt Debug-Symbole
- Bettet Assets ein
- Erstellt einzelne Binärdatei
Eigenschaften:
- Optimierter Code (minimiert, tree-shaken)
- Assets eingebettet (keine externen Dateien)
- Debug-Symbole entfernt
- Keine Source Maps
- Minimale Protokollierung
Dateigröße: Kleiner (~15MB)
Build-Befehle
Abschnitt betitelt „Build-Befehle“Basis-Build
Abschnitt betitelt „Basis-Build“wails3 buildAusgabe: build/bin/myapp[.exe]
Build für spezifische Plattform
Abschnitt betitelt „Build für spezifische Plattform“# Build für Windows (von jedem OS aus)wails3 build -platform windows/amd64
# Build für macOSwails3 build -platform darwin/amd64wails3 build -platform darwin/arm64
# Build für Linuxwails3 build -platform linux/amd64Cross-Kompilierung: Build für jede Plattform von jeder Plattform aus.
Build mit Optionen
Abschnitt betitelt „Build mit Optionen“# Benutzerdefiniertes Ausgabeverzeichniswails3 build -o ./dist/myapp
# Frontend-Build überspringen (bestehende verwenden)wails3 build -skipbindings
# Sauberer Build (Cache entfernen)wails3 build -clean
# Ausführliche Ausgabewails3 build -vBuild-Modi
Abschnitt betitelt „Build-Modi“# Debug-Build (enthält Symbole)wails3 build -debug
# Produktions-Build (Standard, optimiert)wails3 build
# Entwicklungs-Build (schnell, nicht optimiert)wails3 build -devbuildBuild-Konfiguration
Abschnitt betitelt „Build-Konfiguration“Taskfile.yml
Abschnitt betitelt „Taskfile.yml“Wails verwendet Taskfile für die Build-Konfiguration:
version: '3'
tasks: build: desc: Build the application cmds: - wails3 build
build:windows: desc: Build for Windows cmds: - wails3 build -platform windows/amd64
build:macos: desc: Build for macOS (Universal) cmds: - wails3 build -platform darwin/amd64 - wails3 build -platform darwin/arm64 - lipo -create -output build/bin/myapp.app build/bin/myapp-amd64.app build/bin/myapp-arm64.app
build:linux: desc: Build for Linux cmds: - wails3 build -platform linux/amd64Aufgaben ausführen:
task build:windowstask build:macostask build:linuxBuild-Optionsdatei
Abschnitt betitelt „Build-Optionsdatei“Erstellen Sie build/build.json für persistente Konfiguration:
{ "name": "My Application", "version": "1.0.0", "author": "Your Name", "description": "Application description", "icon": "build/appicon.png", "outputFilename": "myapp", "platforms": ["windows/amd64", "darwin/amd64", "linux/amd64"], "frontend": { "dir": "./frontend", "install": "npm install", "build": "npm run build", "dev": "npm run dev" }, "go": { "ldflags": "-s -w -X main.version={{.Version}}" }}Asset-Einbettung
Abschnitt betitelt „Asset-Einbettung“Wie es funktioniert
Abschnitt betitelt „Wie es funktioniert“Wails verwendet Go’s embed-Paket:
package main
import ( "embed" "github.com/wailsapp/wails/v3/pkg/application")
//go:embed frontend/distvar assets embed.FS
func main() { app := application.New(application.Options{ Name: "My App", Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), }, })
app.Window.New() app.Run()}Während des Builds:
- Frontend wird nach
frontend/dist/gebaut //go:embed-Direktive schließt Dateien ein- Dateien werden in die Binärdatei kompiliert
- Binärdatei enthält alles
Während der Laufzeit:
- App startet
- Assets werden aus dem Speicher bereitgestellt
- Keine Festplatten-E/A für Assets
- Schnelles Laden
Benutzerdefinierte Assets
Abschnitt betitelt „Benutzerdefinierte Assets“Zusätzliche Dateien einbetten:
//go:embed frontend/distvar frontendAssets embed.FS
//go:embed data/*.jsonvar dataAssets embed.FS
//go:embed templates/*.htmlvar templateAssets embed.FSBuild-Optimierungen
Abschnitt betitelt „Build-Optimierungen“Frontend-Optimierungen
Abschnitt betitelt „Frontend-Optimierungen“Vite (Standard):
export default { build: { minify: 'terser', terserOptions: { compress: { drop_console: true, // Remove console.log drop_debugger: true, }, }, rollupOptions: { output: { manualChunks: { vendor: ['react', 'react-dom'], // Separate vendor bundle }, }, }, },}Ergebnisse:
- JavaScript minimiert (~70% Reduzierung)
- CSS minimiert (~60% Reduzierung)
- Bilder optimiert
- Tree-Shaking angewendet
Go-Optimierungen
Abschnitt betitelt „Go-Optimierungen“Compiler-Flags:
-ldflags="-s -w"-s: Symboltabelle entfernen (~10% Reduzierung)-w: DWARF-Debug-Informationen entfernen (~20% Reduzierung)
Zusätzliche Optimierungen:
-ldflags="-s -w -X main.version=1.0.0"-X: Variablenwerte zur Build-Zeit setzen- Nützlich für Versionsnummern, Build-Daten
Binärdatei-Kompression
Abschnitt betitelt „Binärdatei-Kompression“UPX (optional):
# Nach dem Buildupx --best build/bin/myapp.exeErgebnisse:
- ~50% GrößenreduzierungFragen zum Bauen? Fragen Sie im Discord oder prüfen Sie die Build-Beispiele.