Система сборки
Единая система сборки
Заголовок раздела «Единая система сборки»Wails предоставляет единую систему сборки, которая компилирует код Go, упаковывает ресурсы фронтенда, внедряет всё в один исполняемый файл и обрабатывает специфичные для платформы сборки — всё одной командой.
wails3 buildРезультат: Нативный исполняемый файл со всем встроенным содержимым.
Обзор процесса сборки
Заголовок раздела «Обзор процесса сборки»[Заглушка для диаграммы процесса сборки]
Фазы сборки
Заголовок раздела «Фазы сборки»1. Фаза анализа
Заголовок раздела «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. Фаза генерации
Заголовок раздела «2. Фаза генерации»Привязки TypeScript
Заголовок раздела «Привязки TypeScript»Wails генерирует типобезопасные привязки:
export function Greet(name: string): Promise<string> { return window.wails.Call('GreetService.Greet', name)}Преимущества:
- Полная типобезопасность
- Автодополнение в IDE
- Ошибки на этапе компиляции
- Комментарии JSDoc
Сборка фронтенда
Заголовок раздела «Сборка фронтенда»Запускается ваш сборщик фронтенда (Vite, webpack и т.д.):
# Пример для Vitevite build --outDir distЧто происходит:
- JavaScript/TypeScript компилируется
- CSS обрабатывается и минифицируется
- Ресурсы оптимизируются
- Генерируются карты исходного кода (только для разработки)
- Вывод в
frontend/dist/
3. Фаза компиляции
Заголовок раздела «3. Фаза компиляции»Компиляция Go
Заголовок раздела «Компиляция Go»Код Go компилируется с оптимизациями:
go build -ldflags="-s -w" -o myapp.exeФлаги:
-s: Удалить таблицу символов-w: Удалить информацию отладки DWARF- Результат: Меньший размер бинарного файла (~30% уменьшение)
Специфично для платформ:
- Windows:
.exeсо встроенной иконкой - macOS: Структура пакета
.app - Linux: ELF бинарный файл
Внедрение ресурсов
Заголовок раздела «Внедрение ресурсов»Ресурсы фронтенда внедряются в бинарный файл Go:
//go:embed frontend/distvar assets embed.FSРезультат: Один исполняемый файл со всем содержимым внутри.
4. Вывод
Заголовок раздела «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
# Сборка для macOSwails3 build -platform darwin/amd64wails3 build -platform darwin/arm64
# Сборка для Linuxwails3 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
Заголовок раздела «Taskfile.yml»Wails использует Taskfile для конфигурации сборки:
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:windowstask build:macostask 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/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()}На этапе сборки:
- Фронтенд собирается в
frontend/dist/ - Директива
//go:embedвключает файлы - Файлы компилируются в бинарный файл
- Бинарный файл содержит всё содержимое
На этапе выполнения:
- Приложение запускается
- Ресурсы обслуживаются из памяти
- Нет дискового ввода-вывода для ресурсов
- Быстрая загрузка
Пользовательские ресурсы
Заголовок раздела «Пользовательские ресурсы»Внедрите дополнительные файлы:
//go:embed frontend/distvar frontendAssets embed.FS
//go:embed data/*.jsonvar dataAssets embed.FS
//go:embed templates/*.htmlvar templateAssets embed.FSОптимизации сборки
Заголовок раздела «Оптимизации сборки»Оптимизации фронтенда
Заголовок раздела «Оптимизации фронтенда»Vite (по умолчанию):
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
Заголовок раздела «Оптимизации 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 или проверяйте примеры сборки.