Sistem Build
Sistem Build Terpadu
Section titled “Sistem Build Terpadu”Wails menyediakan sistem build terpadu yang mengompilasi kode Go, membundel aset frontend, meng-embed semuanya ke executable tunggal, dan menangani build spesifik platform—semuanya dengan satu perintah.
wails3 buildOutput: Executable native dengan semuanya ter-embed.
Ringkasan Proses Build
Section titled “Ringkasan Proses Build”[Placeholder Diagram Proses Build]
Fase Build
Section titled “Fase Build”1. Fase Analisis
Section titled “1. Fase Analisis”Wails memindai kode Go Anda untuk memahami service Anda:
type GreetService struct { prefix string}
func (g *GreetService) Greet(name string) string { return g.prefix + name + "!"}Yang diekstrak Wails:
- Nama service:
GreetService - Nama metode:
Greet - Tipe parameter:
string - Tipe return:
string
Digunakan untuk: Menghasilkan binding TypeScript
2. Fase Generasi
Section titled “2. Fase Generasi”Binding TypeScript
Section titled “Binding TypeScript”Wails menghasilkan binding type-safe:
// Auto-generated: frontend/bindings/<full-go-import-path>/greetservice.js// (TypeScript is also generated when you pass `-ts`. The shape below is the real// runtime call format — numeric IDs via $Call.ByID, imported from /wails/runtime.js.)import { Call as $Call } from "/wails/runtime.js";
export function Greet($0) { return $Call.ByID(1234567890, $0);}Manfaat:
- Type safety penuh
- Autocomplete IDE
- Error compile-time
- Komentar JSDoc
Build Frontend
Section titled “Build Frontend”Bundler frontend Anda berjalan (Vite, webpack, dll.):
# Vite examplevite build --outDir distYang terjadi:
- JavaScript/TypeScript dikompilasi
- CSS diproses dan diminify
- Aset dioptimasi
- Source map dihasilkan (dev saja)
- Output ke
frontend/dist/
3. Fase Kompilasi
Section titled “3. Fase Kompilasi”Kompilasi Go
Section titled “Kompilasi Go”Kode Go dikompilasi dengan optimasi:
go build -ldflags="-s -w" -o myapp.exeFlag:
-s: Strip symbol table-w: Strip info debugging DWARF- Hasil: Binary lebih kecil (~30% reduksi)
Spesifik platform:
- Windows:
.exedengan ikon ter-embed - macOS: Struktur bundle
.app - Linux: Binary ELF
Embedding Aset
Section titled “Embedding Aset”Aset frontend di-embed ke binary Go:
//go:embed frontend/distvar assets embed.FSHasil: Executable tunggal dengan semuanya di dalam.
4. Output
Section titled “4. Output”Binary native tunggal:
- Windows:
myapp.exe(~15MB) - macOS:
myapp.app(~15MB) - Linux:
myapp(~15MB)
Tanpa dependensi (kecuali WebView sistem).
Development vs Production
Section titled “Development vs Production”Dioptimasi untuk kecepatan:
wails3 devYang terjadi:
- Memulai dev server frontend (Vite di port 9245 secara default)
- Mengompilasi Go tanpa optimasi
- Meluncurkan app yang mengarah ke dev server
- Mengaktifkan hot reload
- Menyertakan source maps
Karakteristik:
- Rebuild cepat (<1s untuk perubahan frontend)
- Tanpa embedding aset (disajikan dari dev server)
- Debug symbols disertakan
- Source maps diaktifkan
- Logging verbose
Ukuran file: Lebih besar (~50MB dengan debug symbols)
Dioptimasi untuk ukuran dan performa:
wails3 buildYang terjadi:
- Build frontend untuk production (diminify)
- Kompilasi Go dengan optimasi
- Strip debug symbols
- Embed aset
- Buat binary tunggal
Karakteristik:
- Kode dioptimasi (diminify, tree-shaken)
- Aset ter-embed (tanpa file eksternal)
- Debug symbols di-strip
- Tanpa source maps
- Logging minimal
Ukuran file: Lebih kecil (~15MB)
Perintah Build
Section titled “Perintah Build”Build Dasar
Section titled “Build Dasar”wails3 buildOutput: bin/<APP_NAME> (atau bin/<APP_NAME>.exe di Windows). Direktori bin/ berada di root proyek.
wails3 build adalah wrapper tipis di sekitar wails3 task build. Satu-satunya flag build-time yang diteruskan adalah --tags, yang menjadi variabel Taskfile EXTRA_TAGS:
# Build with extra Go build tagswails3 build --tags "myfeature,gtk4"Tidak ada flag -platform, -o, -skipbindings, -clean, -debug, -devbuild, -icon, -ldflags, atau -package pada wails3 build. Cross-compilation, path output, ikon, dan packaging dikontrol melalui Taskfile proyek (Taskfile.yml + build/config.yml).
Build lintas platform dan spesifik platform
Section titled “Build lintas platform dan spesifik platform”Build platform diekspos sebagai task Taskfile di namespace darwin: / windows: / linux: (didefinisikan di build/Taskfile.<platform>.yml). Contoh:
# macOS — universal binarywails3 task darwin:build:universal
# macOS — arsitektur saat iniwails3 task darwin:build
# Windowswails3 task windows:build
# Linuxwails3 task linux:buildUntuk melihat setiap task yang tersedia di proyek saat ini:
wails3 task --listIkon dan packaging
Section titled “Ikon dan packaging”Hasilkan ikon platform (build/icons.icns, build/icon.ico, dll.) dari PNG sumber:
wails3 generate icons -input appicon.pngBuild installer/paket spesifik platform:
wails3 package # uses the current Go build envwails3 task linux:create:debwails3 task windows:packagewails3 task darwin:package:universalKonfigurasi Build
Section titled “Konfigurasi Build”Taskfile.yml
Section titled “Taskfile.yml”Proyek Wails 3 menggunakan Taskfile sebagai orchestrator build mereka. Taskfile.yml root menyertakan file task per-platform dari build/:
# Taskfile.yml (excerpt — the real templates are richer)version: '3'
includes: common: ./build/Taskfile.yml darwin: ./build/Taskfile.darwin.yml windows: ./build/Taskfile.windows.yml linux: ./build/Taskfile.linux.yml
tasks: build: desc: Build the application cmds: - task: "{{OS}}:build"Jalankan task dengan wails3 task <name> atau task <name>:
wails3 task windows:buildwails3 task darwin:package:universalwails3 task linux:create:appimageKonfigurasi proyek: build/config.yml
Section titled “Konfigurasi proyek: build/config.yml”Metadata proyek (nama, identifier, versi, nilai info-plist, pengaturan NSIS, field .desktop, protokol kustom, dll.) berada di build/config.yml. Taskfile membaca file ini saat menghasilkan ikon, manifest, installer, dan sejenisnya. Tidak ada file build/build.json di Wails 3.
# build/config.yml (illustrative)info: productName: "My App" productIdentifier: "com.example.myapp" productVersion: "1.0.0" companyName: "Example Ltd." productDescription: "An application built with Wails"Jalankan wails3 generate build-assets (atau wails3 update build-assets) untuk memperbarui aset build spesifik platform dari konfigurasi ini.
Embedding Aset
Section titled “Embedding Aset”Cara Kerjanya
Section titled “Cara Kerjanya”Wails menggunakan paket embed Go:
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()}Saat build:
- Frontend di-build ke
frontend/dist/ - Direktif
//go:embedmenyertakan file - File dikompilasi ke binary
- Binary berisi semuanya
Saat runtime:
- App start
- Aset disajikan dari memori
- Tanpa I/O disk untuk aset
- Loading cepat
Aset Kustom
Section titled “Aset Kustom”Embed file tambahan:
//go:embed frontend/distvar frontendAssets embed.FS
//go:embed data/*.jsonvar dataAssets embed.FS
//go:embed templates/*.htmlvar templateAssets embed.FSOptimasi Build
Section titled “Optimasi Build”Optimasi Frontend
Section titled “Optimasi Frontend”Vite (default):
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 }, }, }, },}Hasil:
- JavaScript diminify (~70% reduksi)
- CSS diminify (~60% reduksi)
- Gambar dioptimasi
- Tree-shaking diterapkan
Optimasi Go
Section titled “Optimasi Go”Flag compiler:
-ldflags="-s -w"-s: Strip symbol table (~10% reduksi)-w: Strip info debug DWARF (~20% reduksi)
Optimasi tambahan:
-ldflags="-s -w -X main.version=1.0.0"-X: Set nilai variabel saat build- Berguna untuk nomor versi, tanggal build
Kompresi Binary
Section titled “Kompresi Binary”UPX (opsional):
# After buildingupx --best bin/myapp.exeHasil:
- ~50% reduksi ukuran
- Startup sedikit lebih lambat (~100ms)
- Tidak direkomendasikan untuk macOS (masalah code signing)
Build Spesifik Platform
Section titled “Build Spesifik Platform”Windows
Section titled “Windows”Output: myapp.exe
Termasuk:
- Ikon aplikasi
- Informasi versi
- Manifest (pengaturan UAC)
Ikon:
# Generate platform icons from a source PNGwails3 generate icons -input appicon.png -windowsfilename build/icon.icoLangkah tool package Windows kemudian meng-embed .ico yang dihasilkan ke executable.
Manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" name="MyApp"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo></assembly>Output: myapp.app (application bundle)
Struktur:
myapp.app/├── Contents/│ ├── Info.plist # App metadata│ ├── MacOS/│ │ └── myapp # Binary│ ├── Resources/│ │ └── icon.icns # Icon│ └── _CodeSignature/ # Code signature (if signed)Info.plist:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>CFBundleName</key> <string>My App</string> <key>CFBundleIdentifier</key> <string>com.example.myapp</string> <key>CFBundleVersion</key> <string>1.0.0</string></dict></plist>Universal Binary:
Taskfile macOS menyediakan task darwin:build:universal (dan darwin:package:universal) yang mem-build kedua arsitektur dan menggabungkannya via wails3 tool lipo:
wails3 task darwin:build:universalOutput: myapp (binary ELF)
Dependensi:
- GTK3
- WebKitGTK
File desktop:
# myapp.desktop[Desktop Entry]Name=My AppExec=/usr/bin/myappIcon=myappType=ApplicationCategories=Utility;Instalasi:
# Copy binarysudo cp myapp /usr/bin/
# Copy desktop filesudo cp myapp.desktop /usr/share/applications/
# Copy iconsudo cp icon.png /usr/share/icons/hicolor/256x256/apps/myapp.pngPerforma Build
Section titled “Performa Build”Waktu Build Tipikal
Section titled “Waktu Build Tipikal”| Fase | Waktu | Catatan |
|---|---|---|
| Analisis | <1s | Pemindaian kode Go |
| Generasi Binding | <1s | Generasi TypeScript |
| Build Frontend | 5-30s | Tergantung ukuran proyek |
| Kompilasi Go | 2-10s | Tergantung ukuran kode |
| Embedding Aset | <1s | Embedding frontend |
| Total | 10-45s | Build pertama |
| Incremental | 5-15s | Build berikutnya |
Mempercepat Build
Section titled “Mempercepat Build”1. Gunakan build cache:
# Go build cache is automatic# Frontend cache (Vite)npm run build # Uses cache by default2. Jalankan hanya yang Anda butuhkan:
# Pick the specific Taskfile target you actually needwails3 task common:build:frontend # rebuild only the frontendwails3 task windows:build # rebuild only the Windows binary3. Build paralel (multi-machine / CI):
Cross-compilation antara Linux/Windows/macOS di v3 umumnya terjadi di container Docker wails-cross atau di runner khusus per platform — wails3 build sendiri menargetkan OS host. Lihat Build Lintas Platform untuk alur kerja yang didukung.
4. Gunakan alat yang lebih cepat:
# Use esbuild instead of webpack# (Vite uses esbuild by default)Troubleshooting
Section titled “Troubleshooting”Build Gagal
Section titled “Build Gagal”Gejala: wails3 build keluar dengan error
Penyebab umum:
-
Error kompilasi Go
Terminal window # Check Go code compilesgo build -
Error build frontend
Terminal window # Check frontend buildscd frontendnpm run build -
Dependensi hilang
Terminal window # Install dependenciesnpm installgo mod download
Binary Terlalu Besar
Section titled “Binary Terlalu Besar”Gejala: Binary >50MB
Solusi:
-
Strip debug symbols (Taskfile yang dikirim sudah meneruskan
-ldflags="-s -w"kego build). -
Periksa aset ter-embed
Terminal window # Remove unnecessary files from frontend/dist/# Check for large images, videos, etc. -
Gunakan kompresi UPX
Terminal window upx --best bin/myapp.exe
Build Lambat
Section titled “Build Lambat”Gejala: Build memakan waktu >1 menit
Solusi:
-
Gunakan build cache
- Cache Go otomatis
- Cache frontend (Vite) otomatis
-
Jalankan hanya task yang Anda butuhkan
Terminal window wails3 task common:build:frontendwails3 task windows:build -
Optimasi build frontend
vite.config.js export default {build: {minify: 'esbuild', // Faster than terser},}
Praktik Terbaik
Section titled “Praktik Terbaik”✅ Lakukan
Section titled “✅ Lakukan”- Gunakan
wails3 devselama development - Iterasi cepat - Gunakan
wails3 builduntuk rilis - Output dioptimasi - Versioning build Anda - Gunakan
-ldflagsuntuk embed versi - Uji build di platform target - Cross-compilation tidak sempurna
- Jaga build frontend tetap cepat - Optimasi konfigurasi bundler
- Gunakan build cache - Mempercepat build berikutnya
❌ Jangan
Section titled “❌ Jangan”- Jangan commit direktori
build/- Tambahkan ke.gitignore - Jangan lewati pengujian build - Selalu uji sebelum rilis
- Jangan embed aset yang tidak perlu - Jaga binary tetap kecil
- Jangan gunakan debug build untuk production - Gunakan build dioptimasi
- Jangan lupa code signing - Diperlukan untuk distribusi
Langkah Selanjutnya
Section titled “Langkah Selanjutnya”Mem-build Aplikasi - Panduan detail untuk build dan packaging
Pelajari Selengkapnya →
Build Lintas Platform - Build untuk semua platform dari satu mesin
Pelajari Selengkapnya →
Membuat Installer - Buat installer untuk pengguna akhir
Pelajari Selengkapnya →
Pertanyaan tentang build? Tanyakan di Discord atau lihat contoh build.