Совместимость
Это руководство предназначено для авторов плагинов, у которых уже есть нативный проект Tauri и которые хотят, чтобы один и тот же код одновременно поддерживал:
- публикацию как самостоятельного desktop‑приложения
- публикацию как плагина OTools
Рекомендуемый подход — не поддерживать два frontend‑проекта. Лучше сохранить один Web‑проект и добавить совместимость на уровне сборки и runtime.
1. Оставить frontend в стандартном стиле Tauri
Следуя подходу otools-plugin-sdk, frontend может продолжать использовать официальные API Tauri:
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";После этого подключите слой совместимости на уровне Vite:
import { defineConfig } from "vite";
import { otoolsTauriShimPlugin } from "otools-plugin-sdk/vite";
export default defineConfig({
plugins: [otoolsTauriShimPlugin()],
});Плюсы такого подхода:
- standalone‑версия по‑прежнему использует стандартные возможности Tauri
- при сборке плагина внутренняя реализация
invoke/listenавтоматически подменяется - в бизнес‑коде не нужно поддерживать отдельные API‑вызовы для standalone и plugin режимов
Если код напрямую обращается к window.otools, достаточно добавить объявление типов:
/// <reference types="otools-plugin-sdk" />Для открытия путей, браузера и выбора файлов лучше использовать совместимые обёртки SDK, а не жёстко привязываться к одному runtime:
import {
isOtoolsPluginRuntime,
openExternal,
openPath,
pickDirectory,
pickFile,
saveFile,
} from "otools-plugin-sdk";2. Разделить native‑возможности на «общее ядро + две оболочки»
Если в исходном проекте Tauri уже есть команды в src-tauri, рекомендуется вынести бизнес‑логику в общий Rust crate и затем использовать его из:
- слоя команд Tauri standalone‑версии
- слоя динамической библиотеки
native/для плагина OTools
Более устойчивая структура проекта может выглядеть так:
project-root/
src/ # общий frontend
src-tauri/ # standalone Tauri shell
native/ # native shell плагина OTools
crates/app-core/ # общее Rust‑ядро
plugin.json # манифест плагина OTools
vite.config.tsРекомендуемое разделение ответственности:
src/отвечает только за UI и вызовыinvoke/listencrates/app-core/содержит настоящую бизнес‑логикуsrc-tauri/отвечает за desktop‑окна, меню, tray и регистрацию команд Taurinative/экспортирует интерфейсы динамической библиотеки, которые нужны OTools
Такой подход помогает не дублировать Rust‑логику в двух местах.
3. Конфигурации и артефакты могут сосуществовать
Исходную конфигурацию Tauri можно сохранить без изменений, например:
src-tauri/tauri.conf.jsonCargo.toml
Чтобы поддержать публикацию плагина OTools, дополнительно понадобятся:
plugin.jsonв корне проектаlogo.png- артефакты сборки в
lib/илиnative/, если нужны native‑возможности
Оба набора конфигурации могут существовать параллельно без конфликта:
- standalone‑версия выпускается через
tauri build - plugin‑версия следует потоку упаковки OTools
Обычно frontend может использовать один и тот же dist/, а отличается только среда хоста.
4. Рекомендуемые границы совместимости
Лучше всего сначала адаптировать:
invokelisten- файловые диалоги
- открытие пути / внешней ссылки
Менее подходящие возможности для прямого переноса:
- управление несколькими окнами
- системный tray
- автозапуск
- updater
- логика, жёстко завязанная на жизненный цикл desktop‑окон
Такие возможности лучше собрать в отдельный слой runtime‑адаптации, а не разносить по бизнес‑страницам.
5. Практичный путь миграции
- Оставить существующую структуру
src/ + src-tauri/без изменений, чтобы standalone‑версия продолжала работать. - Подключить
otools-plugin-sdkво frontend и унифицироватьinvoke/listenчерез слой совместимости. - Вынести Rust‑логику в общий crate, чтобы избежать дублирования между Tauri и plugin native.
- Добавить
plugin.jsonв корень и заполнить метаданные, необходимые для плагинов OTools. - В конце обработать сильно зависящие от хоста возможности: окна, tray, автозапуск и т.п.