打包与分发
代码写好了,功能清单也填好了,最后一步——提交到节点索引供其他开发者发现和使用。
一、填写自述清单
自述清单告诉 KnotLink 平台如何识别和加载你的程序。节点类型由文件名决定:
- 插入式节点使用
plugin_manifest.json(由平台管理生命周期) - 独立式节点使用
standalone_manifest.json(自行管理进程)
1.1 文件位置
与 FuncList.json 一样,放在项目根目录:
MsgNotification/
├── FuncList.json
├── plugin_manifest.json ← 插入式节点放这里
├── main.py
└── ...
1.2 基本结构
插入式节点(plugin_manifest.json):
{
"app_id": "com.example.msgreminder",
"plugin_name": "消息提醒",
"author": "YourName",
"version": "v1.0.0",
"description": "在屏幕顶端弹出消息通知窗口",
"download_url": "https://github.com/your-org/your-repo/releases/latest",
"auto_start": "false",
"exe_path": "MsgNotification.exe"
}
独立式节点(standalone_manifest.json):
{
"app_id": "com.example.myapp",
"app_name": "我的桌面应用",
"author": "开发者名称",
"version": "v1.0.0",
"description": "一个独立运行的桌面应用",
"download_url": "https://github.com/your-org/your-repo/releases/latest"
}
接口和信号的详细定义在
FuncList.json中,自述清单只描述节点本身的基本信息。
1.3 字段说明
| 字段 | 必填 | 适用文件 | 说明 |
|---|---|---|---|
app_id | 是 | 两者 | 应用唯一标识(倒置域名格式),与代码和 FuncList.json 中一致 |
plugin_name | 是 | 仅 plugin | 插入式节点显示名称,与 FuncList 的 appName 一致 |
app_name | 是 | 仅 standalone | 独立式节点显示名称,与 FuncList 的 appName 一致 |
author | 是 | 两者 | 作者或组织名称 |
version | 是 | 两者 | 版本号,建议遵循语义化版本(如 v1.0.0) |
description | 是 | 两者 | 一句话描述节点功能 |
download_url | 否 | 两者 | 下载地址,指向 GitHub Releases 等发布页面 |
auto_start | 否 | 仅 plugin | 是否在 KnotLinkService 启动时自动加载,"true" 或 "false",默认 "false" |
exe_path | 是 | 仅 plugin | 可执行文件路径(相对于清单文件所在目录) |
完整字段规范参见 自述清单规范。
二、打包格式(插入式节点)
插入式节点以 zip 压缩包 分发。用户将 zip 拖入操作面板,KnotHub 自动安装。
2.1 Zip 文件结构
MsgNotification.zip
├── plugin_manifest.json ← 必须存在(可在子目录里)
├── FuncList.json
├── MsgNotification.exe ← exe_path 指向的文件
├── logo.png
└── ...(其他依赖文件)
2.2 安装流程
KnotHub 处理 zip 的步骤:
- 解压到临时目录
- 递归查找
plugin_manifest.json - 读取
plugin_name作为安装目录名(fallback:app_id→ zip 文件名) - 将所有内容复制到
Plugins/<plugin_name>/ - 验证
plugin_manifest.json存在于最终目录
exe_path是相对于plugin_manifest.json的路径。KnotHub 根据此字段启动和停止插件。
2.3 兼容旧格式
如果 plugin_manifest.json 不存在,KnotHub 回退到 FuncList.json → 旧 plugin_manifest.json 依次查找名称字段。
三、打包格式(独立式节点)
独立式节点自行管理安装和生命周期,但需要配合 KnotHub 的发现机制。
3.1 清单文件放在根目录
打包你的应用时,把两份清单放在安装目录的根目录下:
MyApp 安装目录/
├── MyApp.exe
├── standalone_manifest.json ← 必须放在根目录
├── FuncList.json ← 必须放在根目录
└── ...(其他应用文件)
KnotHub 扫描注册表获取安装路径后,直接从根目录读取这两份文件。
3.2 安装时写入注册表
你的应用安装程序需要写入:
HKCU\Software\KnotLink\StandaloneNodes
└── <app_id> = "<安装目录完整路径>"
示例(安装脚本中执行):
# PowerShell
New-Item -Path "HKCU:\Software\KnotLink\StandaloneNodes" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\KnotLink\StandaloneNodes" `
-Name "com.example.myapp" -Value "C:\Program Files\MyApp"
:: 批处理
reg add HKCU\Software\KnotLink\StandaloneNodes /v com.example.myapp /t REG_SZ /d "C:\Program Files\MyApp" /f
KnotHub 启动时扫描此键,读取每个路径下的 standalone_manifest.json 和 FuncList.json。
卸载时记得删除对应注册表值:
Remove-ItemProperty -Path "HKCU:\Software\KnotLink\StandaloneNodes" -Name "com.example.myapp"
四、发布到节点索引
4.1 准备文件
插入式节点:
MyPlugin-HXH/
├── plugin_manifest.json
├── FuncList.json
├── logo.png
└── README.md
独立式节点:
MyApp-HXH/
├── standalone_manifest.json ← 自述清单(节点身份)
├── FuncList.json ← 功能清单(接口 + 信号,两个清单都要)
├── logo.png
└── README.md
独立式节点需要两份清单同时存在:
standalone_manifest.json声明节点身份,FuncList.json声明接口和信号。缺一不可。
4.2 提 PR 注册
- Fork KNodeIndex 仓库
- 复制
plugin/_template/(插入式)或standalone/_template/(独立式)→ 重命名为节点名-作者名 - 将准备好的文件放入该目录
- 本地运行
node validate-nodes.js自检 - 提 PR 到 KNodeIndex
PR 合并后,你的节点就会出现在 knotlink.cn/nodes 上,供所有用户发现和调用。
独立式节点额外步骤:KNotHub 通过注册表发现独立式节点。你的应用安装时需写入
HKCU\Software\KnotLink\StandaloneNodes(app_id= 安装路径)。详见 自述清单规范。
五、完整流程回顾
恭喜!至此你已经完成了 KnotLink 接入的全部步骤:
① 确定功能 → 想清楚提供什么接口、发送什么信号
② 编写代码 → 用 SDK 实现通信逻辑 [coding]
③ 填写功能清单 → FuncList.json 描述接口和信号 [fill-funclist]
④ 填写自述清单 → plugin_manifest.json 声明节点身份 本文
⑤ 提 PR 发布 → 提交到 KNodeIndex 本文