发布插件

本页内容

插件开发完成后,你可以将其发布到 EmDash Marketplace,供其他站点从管理后台安装。

前置条件

发布前请确认插件:

  • 具有有效的 package.json,且 "." export 指向插件入口
  • 使用 definePlugin(),并提供唯一的 id 与合法的 semver version
  • 声明其 capabilities(需要访问哪些 API)

包格式

已发布插件以包含以下内容的 .tar.gz 压缩包分发:

文件必填说明
manifest.jsondefinePlugin() 提取的插件元数据
backend.js打包后的沙箱代码(自包含 ES 模块)
admin.js打包后的管理后台 UI 代码
README.md插件文档
icon.png插件图标(256×256 PNG)
screenshots/最多 5 张截图(PNG/JPEG,最大 1920×1080)

manifest.json 会根据 definePlugin() 调用自动生成,包含插件 ID、版本、capabilities、钩子名、路由名和管理端配置,但不包含可执行代码。

构建包

emdash plugin bundle 命令会从插件源码生成 tarball:

cd packages/plugins/my-plugin
emdash plugin bundle

该命令会:

  1. 读取 package.json 以定位入口
  2. 使用 tsdown 构建主入口并提取 manifest
  3. 打包 backend.js(压缩、tree-shake、自包含)
  4. 若存在 "./admin" export,则打包 admin.js
  5. 收集资源(README、图标、截图)
  6. 校验包(大小限制、backend 不得引入 Node.js 内置模块)
  7. {id}-{version}.tar.gz 写入 dist/

入口解析

bundle 命令通过 package.json 的 exports 查找代码:

{
  "exports": {
    ".": { "import": "./dist/index.mjs" },
    "./sandbox": { "import": "./dist/sandbox-entry.mjs" },
    "./admin": { "import": "./dist/admin.mjs" }
  }
}
Export用途构建方式
"."主入口 — 用于提取 manifestExternals:emdash@emdash-cms/*
"./sandbox"在沙箱中运行的后端代码完全自包含(无 externals)
"./admin"管理端 UI 组件完全自包含

若缺少 "./sandbox",命令会回退查找 src/sandbox-entry.ts

选项

emdash plugin bundle [--dir <path>] [--outDir <path>]
标志默认值说明
--dir当前目录插件源码目录
--outDir, -odisttarball 输出目录

校验

bundle 命令会检查:

  • 大小限制 — 总包体积须小于 5MB
  • 禁止 Node.js 内置模块backend.js 不得导入 fspathchild_process 等(沙箱代码在 V8 isolate 中运行,而非 Node.js)
  • 图标尺寸icon.png 应为 256×256(不符会警告但仍会包含)
  • 截图限制 — 最多 5 张,最大 1920×1080

发布

emdash plugin publish 命令会将 tarball 上传到 Marketplace:

emdash plugin publish

默认会找到 dist/ 中最新的 .tar.gz 并上传。你也可以显式指定 tarball,或在发布前先构建:

# 显式指定 tarball 路径
emdash plugin publish --tarball dist/my-plugin-1.0.0.tar.gz

# 先构建再发布
emdash plugin publish --build

认证

首次发布时,CLI 会通过 GitHub 完成认证:

  1. CLI 在浏览器中打开 GitHub 设备授权页面
  2. 在终端显示的设备码处输入该码
  3. GitHub 颁发 access token
  4. CLI 将其交换为 Marketplace JWT(保存在 ~/.config/emdash/auth.json

令牌有效期为 30 天。过期后,下次发布时会提示重新认证。

也可单独管理登录状态:

# 仅登录,不发布
emdash plugin login

# 登出(清除已存令牌)
emdash plugin logout

首次注册

若插件 ID 尚不存在于 Marketplace,emdash plugin publish 会在上传首个版本前自动完成注册。

版本要求

每次发布的版本 semver 必须高于上一版。不能覆盖或重复发布已有版本。

安全审计

每个已发布版本都会经过自动安全审计。Marketplace 会扫描 backend.jsadmin.js,检测:

  • 数据外泄模式
  • 通过设置窃取凭据
  • 混淆代码
  • 资源滥用(如挖矿等)
  • 可疑网络行为

审计结果为 passwarnfail,并显示在插件的 Marketplace 页面上。根据 Marketplace 的强制执行策略,fail 可能会阻止发布。

选项

emdash plugin publish [--tarball <path>] [--build] [--dir <path>] [--registry <url>]
标志默认值说明
--tarballdist/ 中最新 .tar.gz显式 tarball 路径
--buildfalse发布前执行 emdash plugin bundle
--dir当前目录插件目录(与 --build 联用)
--registryhttps://marketplace.emdashcms.comMarketplace URL

完整流程

典型发布周期:

# 1. 完成修改
# 2. 在 definePlugin() 与 package.json 中提升版本
# 3. 一步完成打包与发布
emdash plugin publish --build

若希望先检查包内容:

# 构建 tarball
emdash plugin bundle

# 查看输出
tar tzf dist/my-plugin-1.1.0.tar.gz

# 发布
emdash plugin publish