语言模板
不想从零搭骨架?六个语言的模板仓库已经把清单、入口程序、宿主 SDK 和打包脚本准备好了, 克隆下来把 id 改成自己的就能开工。每个仓库都带 README-CN.md(中文)和 README.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 的机器(比如刚装好的 Windows)用仓库页面的 Code → Download ZIP,解压就是工程目录。
先改这三处
id:manifest.json(Java 是META-INF/tml-extension.json)里的id,装上后不能改, 建议写成你的名字.功能,例如tyw.auto-login。同时把name、version、author一起改掉。- 入口逻辑:
src/main.*(原生)、main.py、main.js—— 模板里只有一行日志 + 一次host.info调用,替换成你自己的。 permissions:用到哪个能力就声明哪个,多声明一个用户就多看到一条,容易被拒装。
逐个语言
Java
需要 JDK(java -version 能跑)。宿主用 java -cp "<jar>" com.tywstudio.example.Main 启动, 所以入口类名要和清单里的 entry 对上。
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.tmlextpython3 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.tmlextpackage.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),第一次构建会去 clone 一次 TML 仓库, 之后走 Cargo 缓存。别把 SDK 的 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 在 TML 仓库的 extensions/sdk/go,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 首次构建卡住 | 正在从 GitHub 拉 TML 仓库里的 SDK,等它下完;之后有缓存 |
| 换了电脑就不能用 | 原生包(C / Rust / Go)只认编译时的平台,要按目标平台重编 |
| macOS 打不开 | .app 里带的二进制要签名,本地调试用 xattr -cr 清属性,正式发布要签名 |
