Skip to main content

打包与分发

代码写好了,功能清单也填好了,最后一步——提交到节点索引供其他开发者发现和使用。


一、填写自述清单

自述清单告诉 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 的步骤:

  1. 解压到临时目录
  2. 递归查找 plugin_manifest.json
  3. 读取 plugin_name 作为安装目录名(fallback:app_id → zip 文件名)
  4. 将所有内容复制到 Plugins/<plugin_name>/
  5. 验证 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.jsonFuncList.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 注册

  1. Fork KNodeIndex 仓库
  2. 复制 plugin/_template/(插入式)或 standalone/_template/(独立式)→ 重命名为 节点名-作者名
  3. 将准备好的文件放入该目录
  4. 本地运行 node validate-nodes.js 自检
  5. 提 PR 到 KNodeIndex

PR 合并后,你的节点就会出现在 knotlink.cn/nodes 上,供所有用户发现和调用。

独立式节点额外步骤:KNotHub 通过注册表发现独立式节点。你的应用安装时需写入 HKCU\Software\KnotLink\StandaloneNodesapp_id = 安装路径)。详见 自述清单规范


五、完整流程回顾

恭喜!至此你已经完成了 KnotLink 接入的全部步骤:

① 确定功能       →  想清楚提供什么接口、发送什么信号
② 编写代码 → 用 SDK 实现通信逻辑 [coding]
③ 填写功能清单 → FuncList.json 描述接口和信号 [fill-funclist]
④ 填写自述清单 → plugin_manifest.json 声明节点身份 本文
⑤ 提 PR 发布 → 提交到 KNodeIndex 本文

延伸阅读