Все операции выполняются через единый скрипт rustchat.sh, который работает из Linux
и умеет собирать под Linux, Windows (кросс-компиляция) и Android.
chmod +x rustchat.sh
./rustchat.sh dev # запустить dev-сервер (Linux desktop)
./rustchat.sh build # release-сборка для Linux
./rustchat.sh build --target windows # cross-compile для Windows
./rustchat.sh build --target android # Android APK
./rustchat.sh build --target all # все три платформы подряд
./rustchat.sh test # только юнит-тесты| Режим | Что делает |
|---|---|
dev |
Hot-reload dev-сервер. Поддерживает --target linux (по умолчанию) и --target android. |
build |
Release-сборка с полной оптимизацией (LTO, opt-level=s). Прогоняет тесты перед сборкой. |
debug |
Debug-сборка без оптимизаций, с полными символами. Устанавливает RUST_LOG=debug. |
test |
Только cargo test в src-tauri/. Бинарь не собирается. |
check |
cargo check — быстрая проверка синтаксиса и типов. Быстрее полной сборки в ~10×. |
clean |
Удаляет src-tauri/target/ и dist/. |
| Цель | Платформа | Что нужно дополнительно |
|---|---|---|
linux |
Linux desktop | libwebkit2gtk-4.1-dev (см. ниже) |
windows |
Windows desktop | mingw-w64 + опционально nsis (см. ниже) |
android |
Android APK | Android SDK + NDK + Java (см. ниже) |
all |
Все три | Всё из перечисленного |
--targetприменяется только кbuildиdebug.
devподдерживает толькоlinuxиandroid.
./rustchat.sh <mode> [--target TARGET] [options]
--target linux|windows|android|all целевая платформа (default: linux)
--skip-tests не запускать cargo test
--no-bundle скомпилировать бинарь, пропустить упаковку
--verbose, -v подробный вывод cargo
--help, -h справка
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
# Node.js (LTS)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash -
sudo apt install -y nodejs# Ubuntu / Debian
sudo apt install \
libwebkit2gtk-4.1-dev libgtk-3-dev librsvg2-dev \
libssl-dev patchelf
# Fedora
sudo dnf install webkit2gtk4.1-devel openssl-devel
# Arch
sudo pacman -S webkit2gtk libappindicator-gtk3Сборка выполняется на Linux с помощью mingw-w64.
Производит .exe (бинарь) и, если установлен NSIS, .exe-инсталлятор.
# 1. Компилятор mingw-w64
sudo apt install mingw-w64
# 2. Rust target для Windows
rustup target add x86_64-pc-windows-gnu
# 3. (опционально) NSIS — для генерации установщика
sudo apt install nsis
# 4. Настройка линкера для cargo
# Добавьте в ~/.cargo/config.toml:
cat >> ~/.cargo/config.toml << 'EOF'
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
EOFПримечание. NSIS на Linux генерирует корректный Windows-инсталлятор.
WiX (.msi) требует Windows — для.msiиспользуйте GitHub Actions или Windows-машину.
# 1. Java
sudo apt install openjdk-17-jdk
# 2. Android Studio → SDK Manager → SDK Tools → NDK (Side by side) + Build Tools
# 3. Переменные окружения (добавьте в ~/.bashrc или ~/.zshrc)
export ANDROID_HOME=$HOME/Android/Sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$(ls $ANDROID_HOME/ndk | tail -1)
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
# 4. Rust targets для Android
rustup target add \
aarch64-linux-android \
armv7-linux-androideabi \
i686-linux-android \
x86_64-linux-android
# 5. Инициализация Tauri Android-проекта (один раз)
./rustchat.sh dev --target android # автоматически вызовет tauri android init
# или вручную:
npm run tauri -- android initПроверка подключения устройства:
adb devices # должен показать устройство adb reverse tcp:1420 tcp:1420 # для dev-сервера
# Быстрая итерация — только типы проверить
./rustchat.sh check
# Тесты без сборки
./rustchat.sh test
# Dev с подробным выводом
./rustchat.sh dev --verbose
# Debug-сборка для Linux, пропустить тесты
./rustchat.sh debug --skip-tests
# Debug-бинарь для Windows (без инсталлятора)
./rustchat.sh debug --target windows --no-bundle
# Release для Linux без упаковки (только бинарь)
./rustchat.sh build --no-bundle
# Всё сразу: Linux + Windows + Android
./rustchat.sh build --target all
# Почистить и пересобрать
./rustchat.sh clean && ./rustchat.sh build| Платформа | Артефакты |
|---|---|
| Linux release | src-tauri/target/release/bundle/deb/*.deb |
| Linux release | src-tauri/target/release/bundle/appimage/*.AppImage |
| Windows cross | src-tauri/target/x86_64-pc-windows-gnu/release/plexus.exe |
| Windows installer | src-tauri/target/x86_64-pc-windows-gnu/release/bundle/nsis/*.exe |
| Android APK | src-tauri/gen/android/app/build/outputs/apk/universal/release/*.apk |
| Android AAB | src-tauri/gen/android/app/build/outputs/bundle/universalRelease/*.aab |
| Debug (любой) | src-tauri/target/debug/... |
| Переменная | Назначение | Пример |
|---|---|---|
RUST_LOG |
Уровень логов (устанавливается автоматически в debug-режиме) |
debug, info, plexus=debug,matrix_sdk=warn |
ANDROID_HOME |
Путь к Android SDK | ~/Android/Sdk |
ANDROID_NDK_HOME |
Путь к NDK | ~/Android/Sdk/ndk/26.3.11579264 |
JAVA_HOME |
Путь к JDK | /usr/lib/jvm/java-17-openjdk-amd64 |
rust-chat/
├── rustchat.sh ← главный скрипт сборки/запуска
├── build.ps1 ← PowerShell обёртка для Windows (без кросс-компиляции)
├── BUILD.md ← этот файл
├── package.json
├── src/ ← React фронтенд (TypeScript + Vite)
│ ├── components/
│ │ ├── layout/ ← основной макет (Sidebar, ChatView)
│ │ ├── settings/ ← AccountCard, SettingsPanel
│ │ └── ui/ ← переиспользуемые компоненты
│ ├── stores/ ← Zustand: accounts, messages, ui
│ └── types/ ← TypeScript типы
└── src-tauri/ ← Rust бэкенд (Tauri v2)
├── Cargo.toml
├── tauri.conf.json
└── src/
├── lib.rs ← точка входа + инициализация tracing
├── accounts/ ← AccountManager, AccountKind (Matrix/XMPP/IRC)
├── commands/ ← Tauri IPC-команды (accounts, chat, system)
├── db/ ← SQLite через rusqlite (accounts, rooms, messages)
├── protocols/ ← trait Protocol + реализации
│ ├── mod.rs ← общие типы: Room, Message, ProtocolEvent, ...
│ ├── matrix.rs ← matrix-sdk 0.7
│ ├── irc.rs ← irc crate 1.x
│ └── xmpp.rs ← tokio-xmpp 4
├── proxy/ ← ProxyConfig (HTTP / SOCKS5)
└── state/ ← AppState (event loop → frontend)
- Создать
src-tauri/src/protocols/myproto.rs, реализоватьtrait Protocol - Добавить вариант в
AccountKindвsrc/accounts/mod.rs - Добавить ветку в
AccountManager::connect()там же - Зарегистрировать модуль в
src-tauri/src/protocols/mod.rs
Для автоматических сборок под все платформы:
# .github/workflows/release.yml (пример)
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev librsvg2-dev
- run: ./rustchat.sh build --target linux
build-windows:
runs-on: ubuntu-latest # кросс-компиляция с Linux
steps:
- uses: actions/checkout@v4
- run: sudo apt install mingw-w64 nsis
- run: ./rustchat.sh build --target windows
build-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with: { java-version: '17', distribution: 'temurin' }
- uses: android-actions/setup-android@v3
- run: ./rustchat.sh build --target androidТесты написаны как #[cfg(test)] модули прямо в исходных файлах.
./rustchat.sh test # все тесты
./rustchat.sh check # только типы, без запуска
# Или напрямую через cargo:
cd src-tauri
cargo test # все тесты
cargo test irc # тесты только модуля irc
cargo test --lib # только библиотечные тесты (без binary)Покрытые модули (≈ 32 теста):
| Модуль | Что тестируется |
|---|---|
protocols::irc |
normalise_channel, extract_channel_from_room_id, channel_to_room_id, friendly_irc_error |
protocols::matrix |
normalise_homeserver_url, is_transient_error_msg, is_auth_error_msg |
protocols::mod |
Сериализация RoomId, MessageContent, Room; ProtocolError::Display |
accounts::mod |
Serde round-trip для AccountKind × 3; дефолт auto_connect = true; Account::new |
db::mod |
CRUD аккаунтов, комнат, сообщений; поиск; идемпотентность вставки |