Шаблоны по языкам
Не хочется собирать скелет вручную? В шаблонах для шести языков уже есть манифест, точка входа, SDK хоста и скрипт упаковки. Склонируйте, поменяйте id — и можно писать логику. В каждом репозитории есть README.md (английский) и README-CN.md (китайский).
| Язык | Репозиторий-шаблон | Результат | Что нужно установить |
|---|---|---|---|
| Java | template-tml-extension-java | com.tywstudio.example.java.jar | JDK (javac, jar) |
| Python | template-tml-extension-python | *.tmlext | Python 3 |
| Node.js | template-tml-extension-node | *.tmlext | Node.js 18+ |
| C | template-tml-extension-c | *.tmlext (с нативным бинарником) | Компилятор C (gcc / clang / MSVC cl) + Python 3 |
| Rust | template-tml-extension-rust | *.tmlext (с нативным бинарником) | Rust (Cargo) + Python 3 |
| Go | template-tml-extension-go | *.tmlext (с нативным бинарником) | Go 1.21+ + Python 3 |
Для Zig шаблона пока нет
Повторите структуру C или Go: runtime = zig, entry указывает на файл, собранный zig build-exe, остальное (поля манифеста, протокол через stdio, упаковка в zip) не меняется.
Три способа начать
1. Через GitHub-шаблон (рекомендуется)
Все шесть репозиториев помечены как template repository. Откройте репозиторий и нажмите Use this template → Create a new repository — новый репозиторий ваш, без связи с шаблоном.
2. git clone
git clone https://github.com/TYWStudio/template-tml-extension-go.git my-ext
cd my-extЕсли нужен только последний снимок без истории, добавьте --depth 1:
git clone --depth 1 https://github.com/TYWStudio/template-tml-extension-go.git my-ext3. Скачать zip
Там, где нет git, используйте Code → Download ZIP на странице репозитория.
Сначала поменяйте три вещи
id— вmanifest.json(для Java — вMETA-INF/tml-extension.json). После установки его нельзя изменить, поэтому пишите вродевашеимя.функция. Заодно обновитеname,version,author.- Логику входа —
src/main.*,main.py,main.js. В шаблоне только одна строка лога и вызовhost.info— замените своим кодом. permissions— объявляйте ровно то, что используете: лишние права видны пользователю и мешают установке.
По языкам
Java
Нужен JDK (java -version должен работать). Хост запускает расширение командой java -cp "<jar>" com.tywstudio.example.Main, поэтому класс входа должен совпадать с манифестом.
git clone https://github.com/TYWStudio/template-tml-extension-java.git my-ext
cd my-ext
bash build.sh # Windows: build.bat
# результат: com.tywstudio.example.java.jarJava-шаблон выдаёт обычный .jar, а не .tmlext — при импорте выбирайте именно jar.
Python
Достаточно Python 3, сторонних пакетов нет.
git clone https://github.com/TYWStudio/template-tml-extension-python.git my-ext
cd my-ext
python3 build.py # Windows: python build.py
# результат: com.tywstudio.example.python.tmlextЗапуск python3 main.py вручную «зависает» в ожидании рукопожатия — это нормально, расширение должен запускать лаунчер.
Node.js
git clone https://github.com/TYWStudio/template-tml-extension-node.git my-ext
cd my-ext
node build.js # или: npm run pack
# результат: com.tywstudio.example.node.tmlextВ package.json нет зависимостей времени выполнения, поэтому npm install не нужен.
C
Нужен любой компилятор C (gcc / clang / MSVC cl) и Python 3 для упаковки.
git clone https://github.com/TYWStudio/template-tml-extension-c.git my-ext
cd my-ext
./build.sh # Windows: build.bat
# результат: template-tml-extension-c.tmlextbuild.sh компилирует, build.py упаковывает манифест, исходники и бинарник в .tmlext.
Rust
SDK подключается как git-зависимость (tml-ext, tag sdk-rust-v1.0.0), поэтому первая сборка один раз клонирует репозиторий TML; дальше всё берётся из кеша Cargo. Не копируйте lib.rs в проект.
git clone https://github.com/TYWStudio/template-tml-extension-rust.git my-ext
cd my-ext
./build.sh # Windows: build.bat
# результат: template-tml-extension-rust.tmlextВнутри: cargo build --release → копирование в bin/tml_ext → упаковка через build.py.
Go
SDK лежит в extensions/sdk/go репозитория TML; build.sh сначала выполняет go mod tidy (в первый раз нужен интернет).
git clone https://github.com/TYWStudio/template-tml-extension-go.git my-ext
cd my-ext
./build.sh # Windows: build.bat
# результат: template-tml-extension-go.tmlextКоманда сборки: CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/tml_ext ./src. CGO_ENABLED=0 даёт статическую сборку и простую кросс-компиляцию:
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/tml_ext.exe ./src
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/tml_ext ./src
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/tml_ext ./srcКак установить
- Запустите скрипт сборки, получите
.jarили.tmlext. - Лаунчер → Настройки → Расширения → Импорт, либо просто перетащите файлы в окно (можно несколько).
- Проверьте список прав и включите. Уже подтверждённый пакет запоминается — повторного вопроса не будет; для другого пакета спросит снова.
- После правок пересоберите и импортируйте заново; если файл просто заменён — нажмите «Обновить».
О кнопках «Подробнее / Включить / Удалить», статусах и автозапуске см. Импорт и управление.
При первой загрузке SHA-256 пакета записывается в extensions/trusted.json. Если содержимое изменилось, лаунчер сообщит «расширение было изменено» — удалите запись и подтвердите доверие снова.
Частые проблемы
| Симптом | Причина |
|---|---|
| После импорта нет в списке | Ошибка JSON в манифесте или повторяющийся id |
| «Среда выполнения недоступна» | Интерпретатор не в PATH (Java/Python/Node), другая архитектура или нет права на запуск |
| Сразу завершается | Точка входа не читает stdin или не отвечает {"ready": true} |
| Первая сборка Rust/Go «висит» | Идёт загрузка SDK из репозитория TML; дальше работает кеш |
| Работает только на одной машине | Нативные пакеты (C / Rust / Go) привязаны к платформе сборки — пересоберите под целевую |
| macOS не открывает | Встроенный бинарник нужно подписать; локально xattr -cr, для релиза — подпись |
Смотрите также
- Среда выполнения и упаковка — все поля
manifest.json,extensions/pack.py - API хоста — доступные методы и их права
- Обзор расширений — загрузка, доверие, жизненный цикл
