Skip to content

语言模板 ​

不想从零搭骨架?六个语言的模板仓库已经把清单、入口程序、宿主 SDK 和打包脚本准备好了, 克隆下来把 id 改成自己的就能开工。每个仓库都带 README-CN.md(中文)和 README.md(英文)。

语言模板仓库产物需要装什么
Javatemplate-tml-extension-javacom.tywstudio.example.java.jarJDK(含 javac、jar)
Pythontemplate-tml-extension-python*.tmlextPython 3
Node.jstemplate-tml-extension-node*.tmlextNode.js 18+
Ctemplate-tml-extension-c*.tmlext(内含原生程序)C 编译器(gcc / clang / MSVC cl)+ Python 3
Rusttemplate-tml-extension-rust*.tmlext(内含原生程序)Rust 工具链(Cargo)+ Python 3
Gotemplate-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 ​

想留在本地、或者要换个远程仓库:

bash
git clone https://github.com/TYWStudio/template-tml-extension-go.git my-ext
cd my-ext

只要最新代码、不要历史就加 --depth 1,能少下一半体积:

bash
git clone --depth 1 https://github.com/TYWStudio/template-tml-extension-go.git my-ext

3. 直接下 zip ​

没有 git 的机器(比如刚装好的 Windows)用仓库页面的 Code → Download ZIP,解压就是工程目录。

先改这三处 ​

  1. id:manifest.json(Java 是 META-INF/tml-extension.json)里的 id,装上后不能改, 建议写成 你的名字.功能,例如 tyw.auto-login。同时把 name、version、author 一起改掉。
  2. 入口逻辑:src/main.*(原生)、main.py、main.js —— 模板里只有一行日志 + 一次 host.info 调用,替换成你自己的。
  3. permissions:用到哪个能力就声明哪个,多声明一个用户就多看到一条,容易被拒装。

逐个语言 ​

Java ​

需要 JDK(java -version 能跑)。宿主用 java -cp "<jar>" com.tywstudio.example.Main 启动, 所以入口类名要和清单里的 entry 对上。

bash
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.jar

Java 版直接输出 .jar,不是 .tmlext,导入时选这个 jar 文件。

Python ​

只要 Python 3,没有第三方依赖。

bash
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 ​

bash
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。

bash
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.tmlext

build.sh 负责编译,build.py 负责把清单、源码和可执行文件压进 .tmlext。

Rust ​

SDK 是 git 依赖(tml-ext,tag sdk-rust-v1.0.0),第一次构建会去 clone 一次 TML 仓库, 之后走 Cargo 缓存。别把 SDK 的 lib.rs 复制进模板。

bash
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 把它拉下来(第一次需要网络)。

bash
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 让产物静态链接、跨平台交叉编译最省事:

bash
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

构建完怎么装 ​

  1. 跑上面的构建脚本,得到 .jar 或 .tmlext。
  2. 启动器 → 设置 → 拓展 → 导入,选中产物;也可以直接把文件拖进窗口(支持多选)。
  3. 确认权限清单,启用。同一个包确认过一次就会记住,之后启用不再重复弹窗;换了包才重新问。
  4. 改代码后重新构建、重新导入;只是换了文件也可以先覆盖再点「刷新」。

卡片上的「详情 / 启用 / 卸载」、状态徽标和自动启动的说明见 导入与管理拓展。

首次加载会记录包的 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 清属性,正式发布要签名

相关 ​