Skip to content

Repository files navigation

Plexus — Build & Development Guide

Все операции выполняются через единый скрипт 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                   # только юнит-тесты

Режимы (mode)

Режим Что делает
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/.

Платформы (--target)

Цель Платформа Что нужно дополнительно
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

Linux desktop (--target linux)

# 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

Windows кросс-компиляция (--target windows)

Сборка выполняется на 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-машину.


Android (--target android)

# 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)

Добавление нового протокола

  1. Создать src-tauri/src/protocols/myproto.rs, реализовать trait Protocol
  2. Добавить вариант в AccountKind в src/accounts/mod.rs
  3. Добавить ветку в AccountManager::connect() там же
  4. Зарегистрировать модуль в src-tauri/src/protocols/mod.rs

CI / GitHub Actions

Для автоматических сборок под все платформы:

# .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 аккаунтов, комнат, сообщений; поиск; идемпотентность вставки

About

rust & react matrix client

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages