3文档

Core · 开发插件

创建插件

在已有 App 中使用 @nocobase/create-plugin 创建本地插件,通过 Agent 或手动操作生成骨架、选择能力并接入工作区。

先按创建应用准备一个 App 并完成依赖安装。插件会生成在这个 App 的 packages/ 下,与应用一起开发和构建。

你可以让 Agent 帮你创建,也可以手动使用 pnpm create @nocobase/plugin@beta。两种方式都使用 @nocobase/create-plugin。

使用 Agent

插件开发指引由 App 的 @nocobase/app-skills 提供,同步到 .agents/skills/nocobase-app-plugin-development/SKILL.md,无需全局安装。若文件缺失,先检查已安装的包是否包含该 Skill;包含时运行 pnpm nocobase skills sync,否则按升级 NocoBase Core更新到兼容版本,不要单独更新某一个框架包。

在应用目录中打开 Agent,告诉它插件的名称和用途即可。例如:

纯文本
帮我创建一个叫 demo-tools 的插件,用来扩展当前应用的命令行工具。
先生成基础结构,并检查它能否正常构建。

Agent 使用 @nocobase/create-plugin 生成插件,并根据用途选择能力、处理依赖和检查结果。你可以把示例中的名称和用途换成自己的需求,无需逐项描述命令参数和文件改动。

不使用 Agent

以下命令都在 App 根目录执行,使用应用要求的 Node.js 和 pnpm 版本。创建工具和 App CLI 需要支持 App 工作区;@beta 选择创建工具的 beta 发布渠道。本篇以只选择 cli 能力的 demo-tools 为例,无需启动数据库或 Web 服务。

创建工具会完成什么

@nocobase/create-plugin 根据所选能力生成一个可继续开发的插件包,并接入当前 App 的工作区。

工作 自动完成的内容
插件骨架 生成包声明、开发指引、TypeScript、代码检查及构建配置
能力代码 按 --with 选择生成对应目录、声明、示例或草稿,以及相关测试
公开入口 按能力生成 Client、Server、CLI 或组件等导出,并配置源码与构建产物的导出映射
依赖 根据所选能力确定依赖分类,并从当前 App 已安装的包解析版本
工作区接入 将插件放到 App 的 packages/ 下,补充必要的工作区配置和 App 的本地依赖
安装 默认安装依赖并更新锁文件;可用 --no-install 推迟

创建完成后,继续实现业务逻辑、完善测试,并按插件提供的运行时入口注册到 App。工具不会自动完成业务页面、接口、权限规则,也不会自动发布插件或执行数据库迁移。

选择插件能力

基本用法:

Bash
pnpm create @nocobase/plugin@beta <name> --with <capability>

--with 选择的是要生成的代码能力,不是安装已有插件,也不是启用某项业务功能。必须至少选择一种能力,或者使用 --empty 只生成包基础结构。多个能力通过重复 --with 组合,不使用逗号拼接。

客户端能力

--with 的值 生成内容 需要继续实现的内容
client.routes client/routes.ts 路由声明骨架及测试 页面组件、路由路径、导航与访问条件;不会自动生成业务页面
client.components client/components/plugin-component.tsx 示例组件、公开导出及测试 可复用组件的实际界面、属性和交互
client.service-providers client/providers/ 中的 ServiceProvider 骨架及测试 浏览器端服务注册和生命周期处理
client.react-providers client/contexts.ts、Provider 组件、client/react-providers/ 声明及测试 React 上下文的数据、状态与组件树组合
client.locales client/locales/ 中的语言文件和聚合入口 实际翻译内容,以及组件中的使用

ServiceProvider 用于应用服务与生命周期,React Provider 用于组件树中的上下文,两者按需要分别选择。带客户端代码时,工具还会生成 components.json 和 client/styles.css,准备 shadcn 配置与样式入口;需要的 UI 组件仍要按业务安装或编写。

服务端能力

--with 的值 生成内容 需要继续实现的内容
server.service-providers server/services/、server/providers/、server/tokens.ts 及测试 服务接口、业务逻辑和服务注册
server.routes server/routes/index.ts 路由声明骨架及测试 API 或 Root Route 的方法、路径、输入校验、认证授权和响应
server.jobs server/jobs/ 中的示例 Job、管理执行器的 Provider 及测试 任务逻辑、提交任务的位置、重试与幂等要求
server.locales server/locales/ 中的语言文件和聚合入口 服务端使用的实际翻译内容

server.routes 不会自动生成 CRUD 接口,也不要求一定同时选择 server.service-providers;需要独立业务服务时再组合。server.jobs 已包含管理任务执行器的 Provider,任务后端由 App 配置,具体何时提交任务需要自行实现。

数据库、CLI 与 Skills

--with 的值 生成内容 需要继续实现的内容
database database/migrations/、database/seeds/ 中的 .ts.example 草稿、服务端资源声明及测试;构建时生成数据库任务清单 具体表结构、迁移与种子逻辑;草稿完善并改为 .ts 后,才纳入数据库任务
cli cli/index.ts、示例 info 命令、./cli 导出及测试 实际命令、参数、结果和错误处理
skills skills/<插件技能名>/SKILL.md 草稿,并纳入包的分发文件 向使用插件的 Agent 说明触发条件、公开能力、前提和验证方式

skills 面向使用插件的应用 Agent。插件根目录的 AGENTS.md 则面向维护插件源码的开发者和 Agent,属于基础文件,不需要额外选择 skills。Skill 草稿应根据真实实现完善后再同步给应用使用。

运行时入口如何生成

工具会根据能力推导入口,不需要额外指定 --with client 或 --with server:

所选能力 自动生成的运行时入口
client.routes、client.service-providers、client.react-providers、client.locales 中任意一种 client/index.ts、client/plugin.ts 和 ./client 导出
任意 server.* 能力,或 database server/index.ts、server/plugin.ts 和 ./server 导出
cli cli/index.ts 和 ./cli 导出
仅 client.components 组件的公开导出,不生成客户端插件注册入口
仅 skills 或 --empty 不生成运行时入口

这些入口的生成与 App 中的注册是两个步骤。仅引用公开组件时,通过包导入使用即可;提供 Client、Server 或 CLI 贡献时,再注册对应入口。

常见组合

下面是相互独立的创建示例,按功能选择即可。

仅提供可复用组件:

Bash
pnpm create @nocobase/plugin@beta feature-card --with client.components

需要页面、服务、接口和插件自有数据的业务模块:

Bash
pnpm create @nocobase/plugin@beta orders \
  --with client.routes \
  --with server.service-providers \
  --with server.routes \
  --with database

提供工具命令,并附带 Agent 使用指引:

Bash
pnpm create @nocobase/plugin@beta audit-tools --with cli --with skills

只建立包基础结构:

Bash
pnpm create @nocobase/plugin@beta shared-tools --empty

--empty 不生成业务能力目录,不能与 --with 混用。--with all 会选择当前工具版本支持的全部能力,适合查看完整骨架;实际开发通常明确选择需要的能力即可。

1. 预览生成计划

Bash
pnpm create @nocobase/plugin@beta demo-tools --with cli --dry-run --json

dry-run 不生成插件文件、不修改 App,也不安装 App 的依赖;pnpm create 本身仍可能下载并缓存创建工具。返回的 JSON 中,ok 应为 true,status 为 success-noop,重点检查:

字段 应看到什么
result.project kind 为 application,root 为当前 App 根目录
result.plugin 包名为 @nocobase/app-plugin-demo-tools,目标目录为 App 下的 packages/app-plugin-demo-tools/
result.requestedCapabilities、result.capabilities 请求的能力与规范化后的选择结果
result.derivedStructure 是否生成客户端或服务端插件入口;本例两者均为 false
result.files 文件路径和生成原因,包含 cli/index.ts、cli/info.ts 和对应测试
result.projectEdits 计划修改的应用文件,例如 package.json,必要时还有 pnpm-workspace.yaml
result.dependencies 根据当前应用已安装的包解析出的插件依赖
result.nextSteps 后续安装、检查和注册等建议;结合实际能力执行

创建工具通过应用 package.json 中的 nocobase.templateKind: "app" 识别 App。它读取现有工作区和已安装依赖,先检查路径、名称与版本,再生成文件。因此需要先完成应用的依赖安装。

2. 创建插件并接入工作区

使用相同的名称和能力执行创建:

Bash
pnpm create @nocobase/plugin@beta demo-tools --with cli

创建工具会完成以下工作:

  • 生成 packages/app-plugin-demo-tools/,包括包声明、CLI 实现、测试和开发配置;本地插件默认 private: true。
  • 确保应用的 pnpm 工作区包含插件目录,保留已有设置;仅在需要时补充 packages/*。
  • 在应用 package.json 的 dependencies 中加入 "@nocobase/app-plugin-demo-tools": "workspace:*"。
  • 根据应用已安装的包确定外部依赖版本,对实际存在的本地工作区包保留工作区引用,然后安装依赖并更新锁文件。

workspace:* 让应用使用本地插件包。创建工具不会把插件的外部依赖一律写成 workspace:*,也不会随意选择最新版本;它以应用实际安装的版本为依据,避免生成后找不到包或版本不兼容。

3. 检查生成结果

Bash
pnpm --filter @nocobase/app-plugin-demo-tools check

检查通过后,插件骨架已经生成并成为 App 的本地依赖。各文件的职责见插件的结构。

安装依赖让应用能够解析这个包,运行时注册则决定应用加载哪些能力。创建工具不会自动注册运行时入口;后续通过 pnpm nocobase plugin register <完整包名> --no-install 注册实际提供的 Client、Server 或 CLI 入口。完整的实现、注册和验收流程见编写第一个插件。

名称与常用选项

短名称 demo-tools 默认生成 @nocobase/app-plugin-demo-tools。自己的插件可以使用完整包名保留组织 scope,例如:

Bash
pnpm create @nocobase/plugin@beta @my-company/app-plugin-audit-tools --with cli

目录仍为 packages/app-plugin-audit-tools/,注册时使用完整包名。名称中的能力部分以小写字母开头,使用小写字母、数字和单连字符。创建工具拒绝已有目录或冲突的包名。本地插件不必发布;需要发布时,再检查 private、包名、导出、兼容性和发布内容。

选项 用途
--dir <directory> 显式选择已有 App,例如从父目录传入 --dir ./my-app
--dry-run --json 只读预览生成文件、应用改动和依赖版本,便于人或 Agent 检查
--json 输出结构化结果;安装过程的日志写入 stderr
--no-install 生成文件但暂不安装;注册前需在 App 根目录运行 pnpm install
--display-name <name>、--description <text> 设置插件的显示名称和描述,含空格时加引号
--help、-h 查看当前版本支持的能力和参数
--version 查看创建工具的版本

JSON 输出

--json 可以与实际创建或 --dry-run 组合,便于 Agent 和脚本读取。成功时查看 ok: true 和 result;失败时返回非零退出码,并在 error.code、error.message 和 error.suggestions 中说明原因与处理建议。安装日志写入 stderr,创建工具的 stdout 保持为一个 JSON 结果文档。

--dry-run 是预览,--no-install 则会真实写入插件和 App 文件,只推迟依赖安装,两者作用不同。

常见问题

现象 处理方式
找不到 App 在 create-app 生成的应用根目录执行,或用 --dir 指向该应用;确认已安装依赖且工具版本支持 App 工作区
缺少依赖,或依赖版本不兼容 先完成 App 的依赖安装,按报错修复所需版本,再重新预览
目标目录、包名或应用依赖已存在 检查已有实现,或换用不冲突的名称,不要覆盖已有插件
工作区规则排除了插件目录 检查 pnpm-workspace.yaml 的排除规则,按项目需要调整后再预览
文件已生成,但安装失败 保留生成结果,解决安装错误后在 App 根目录重新运行 pnpm install,无需再次创建
想给已有插件增加一种能力 创建工具用于新建包,不会增量修改已有插件;按插件的结构补充实现、声明、导出、依赖和测试,再检查 App 注册
选择路由或数据库能力后没有业务功能 生成的是声明骨架或草稿,还需实现页面、接口或迁移,并完成接入与验证
包已安装,但命令不存在 检查 ./cli 导出和应用 cli/plugins.ts 注册,并从 App 根目录调用

下一篇插件的结构介绍生成文件的职责;然后跟随编写第一个插件完成实现与接入。日常安装、更新和移除见管理插件。

NocoBase 3 文档 · 草稿 2026-10-24