Система сборки
Единая система сборки
Wails предоставляет единую систему сборки, которая компилирует код Go, упаковывает ресурсы фронтенда, внедряет всё в один исполняемый файл и обрабатывает специфичные для платформы сборки — всё одной командой.
wails3 build
Результат: Нативный исполняемый файл со всем встроенным содержимым.
Обзор процесса сборки
[Заглушка для диаграммы процесса сборки]
Фазы сборки
1. Фаза анализа
Wails сканирует ваш код Go, чтобы понять ваши сервисы:
type GreetService struct {
prefix string
}
func (g *GreetService) Greet(name string) string {
return g.prefix + name + "!"
}Что извлекает Wails:
- Имя сервиса:
GreetService - Имя метода:
Greet - Типы параметров:
string - Типы возвращаемых значений:
string
Используется для: Генерации привязок TypeScript
2. Фаза генерации
Привязки TypeScript
Wails генерирует типобезопасные привязки:
// Auto-generated: frontend/bindings/GreetService.ts
export function Greet(name: string): Promise<string> {
return window.wails.Call('GreetService.Greet', name)
}Преимущества:
- Полная типобезопасность
- Автодополнение в IDE
- Ошибки на этапе компиляции
- Комментарии JSDoc
Сборка фронтенда
Запускается ваш сборщик фронтенда (Vite, webpack и т.д.):
# Пример для Vite
vite build --outDir dist
Что происходит:
- JavaScript/TypeScript компилируется
- CSS обрабатывается и минифицируется
- Ресурсы оптимизируются
- Генерируются карты исходного кода (только для разработки)
- Вывод в
frontend/dist/
3. Фаза компиляции
Компиляция Go
Код Go компилируется с оптимизациями:
go build -ldflags="-s -w" -o myapp.exe
Флаги:
-s: Удалить таблицу символов-w: Удалить информацию отладки DWARF- Результат: Меньший размер бинарного файла (~30% уменьшение)
Специфично для платформ:
- Windows:
.exeсо встроенной иконкой - macOS: Структура пакета
.app - Linux: ELF бинарный файл
Внедрение ресурсов
Ресурсы фронтенда внедряются в бинарный файл Go:
//go:embed frontend/dist
var assets embed.FSРезультат: Один исполняемый файл со всем содержимым внутри.
4. Вывод
Один нативный бинарный файл:
- Windows:
myapp.exe(~15MB) - macOS:
myapp.app(~15MB) - Linux:
myapp(~15MB)
Нет зависимостей (кроме системного WebView).
Разработка против Продакшена
Оптимизировано для скорости:
wails3 dev
Что происходит:
- Запускается сервер разработки фронтенда (Vite на порту 5173)
- Компилируется Go без оптимизаций
- Запускается приложение, указывающее на сервер разработки
- Включается hot reload
- Включаются карты исходного кода
Характеристики:
- Быстрая пересборка (<1s для изменений во фронтенде)
- Нет внедрения ресурсов (обслуживаются с сервера разработки)
- Включены отладочные символы
- Включены карты исходного кода
- Подробное логирование
Размер файла: Больше (~50MB с отладочными символами)
Оптимизировано для размера и производительности:
wails3 build
Что происходит:
- Собирается фронтенд для продакшена (минифицированный)
- Компилируется Go с оптимизациями
- Удаляются отладочные символы
- Внедряются ресурсы
- Создаётся один бинарный файл
Характеристики:
- Оптимизированный код (минифицированный, tree-shaken)
- Ресурсы внедрены (нет внешних файлов)
- Отладочные символы удалены
- Нет карт исходного кода
- Минимальное логирование
Размер файла: Меньше (~15MB)
Команды сборки
Базовая сборка
wails3 build
Результат: build/bin/myapp[.exe]
Сборка для конкретной платформы
# Сборка для Windows (с любой ОС)
wails3 build -platform windows/amd64
# Сборка для macOS
wails3 build -platform darwin/amd64
wails3 build -platform darwin/arm64
# Сборка для Linux
wails3 build -platform linux/amd64
Кросс-компиляция: Сборка для любой платформы с любой платформы.
Сборка с опциями
# Пользовательская директория вывода
wails3 build -o ./dist/myapp
# Пропустить сборку фронтенда (использовать существующую)
wails3 build -skipbindings
# Чистая сборка (удалить кэш)
wails3 build -clean
# Подробный вывод
wails3 build -v
Режимы сборки
# Сборка для отладки (включает символы)
wails3 build -debug
# Сборка для продакшена (по умолчанию, оптимизированная)
wails3 build
# Сборка для разработки (быстрая, неоптимизированная)
wails3 build -devbuild
Конфигурация сборки
Taskfile.yml
Wails использует Taskfile для конфигурации сборки:
# Taskfile.yml
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/amd64Запуск задач:
task build:windows
task build:macos
task build:linux
Файл опций сборки
Создайте build/build.json для постоянной конфигурации:
{
"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}}"
}
}Внедрение ресурсов
Как это работает
Wails использует пакет embed Go:
package main
import (
"embed"
"github.com/wailsapp/wails/v3/pkg/application"
)
//go:embed frontend/dist
var 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()
}На этапе сборки:
- Фронтенд собирается в
frontend/dist/ - Директива
//go:embedвключает файлы - Файлы компилируются в бинарный файл
- Бинарный файл содержит всё содержимое
На этапе выполнения:
- Приложение запускается
- Ресурсы обслуживаются из памяти
- Нет дискового ввода-вывода для ресурсов
- Быстрая загрузка
Пользовательские ресурсы
Внедрите дополнительные файлы:
//go:embed frontend/dist
var frontendAssets embed.FS
//go:embed data/*.json
var dataAssets embed.FS
//go:embed templates/*.html
var templateAssets embed.FSОптимизации сборки
Оптимизации фронтенда
Vite (по умолчанию):
// vite.config.js
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
},
},
},
},
}Результаты:
- JavaScript минифицирован (~70% уменьшение)
- CSS минифицирован (~60% уменьшение)
- Изображения оптимизированы
- Применён tree-shaking
Оптимизации Go
Флаги компилятора:
-ldflags="-s -w"
-s: Удалить таблицу символов (~10% уменьшение)-w: Удалить информацию отладки DWARF (~20% уменьшение)
Дополнительные оптимизации:
-ldflags="-s -w -X main.version=1.0.0"
-X: Установить значения переменных на этапе сборки- Полезно для номеров версий, дат сборки
Сжатие бинарного файла
UPX (опционально):
# После сборки
upx --best build/bin/myapp.exe
Результаты:
- ~50% уменьшение размераВопросы о сборке? Задавайте в Discord или проверяйте примеры сборки.