按 插件规范 搭好的最小可运行插件骨架。点 Use this template 复制到你的账号,改名、补业务逻辑,就能得到一个可独立分发的 TuraIDC 插件仓库。
本仓库同时是 v2 清单的活样例:config.php、生命周期实现、Provider、校验脚本都可直接对照抄。
# 1. Use this template 复制本仓库,然后克隆到本地
git clone https://github.com/<你>/<你的插件>.git my_plugin && cd my_plugin
# 2. 一条命令改名:slug、类名、命名空间、动作前缀一起换
php scripts/rename.php my_sms "我的短信"
# 3. 改域(默认 addons):同步改 config.php 的 'domain' 与命名空间首段
# TuraIDC\Plugins\Addons\ -> TuraIDC\Plugins\Sms\
# 4. 本地验证(三条都要过)
php -l config.php
php scripts/validate-manifest.php
composer install && vendor/bin/pint --test校验脚本会打印逐项结果并以退出码表示成败:0 通过,1 有错误。CI 与本地跑的是同一个脚本。
├── config.php # 清单:info(元信息)+ config(配置项定义)
├── MyPluginPlugin.php # 入口类:execute(array $request): array
├── src/
│ ├── MyPluginLifecycle.php # 生命周期钩子(安装/启用/停用/卸载/升级)
│ └── Providers/ # ServiceProvider:只注册自己前缀下的路由
├── lib/ # 业务逻辑,运行期自动加载
├── docs/SPEC.md # 插件规范原文(清单字段、生命周期、数据与路由边界)
├── scripts/
│ ├── rename.php # 模板改名
│ ├── validate-manifest.php # 清单与类签名校验
│ └── platform-stubs.php # 校验用的平台类桩,不参与运行
└── .github/workflows/ # CI:php -l + 清单校验 + Pint
version语义化;Git tag 必须与它一致(v1.2.3↔1.2.3)。capabilities用点号命名空间(addons.health),不写自然语言。- 需要注册路由/中间件才填
provider;需要安装/升级钩子才填lifecycle。 - 配置项用
config声明,管理端据此渲染表单;密钥字段加secret => true。 - 详细字段表见 docs/SPEC.md。
- 改
config.php的version(例如1.0.0→1.1.0)。 - 把
upgrade.from加上你允许直接升上来的旧版本,如['1.0.0']。 - 新增表/列写成
database/migrations/下的迁移(只新增,不删列、不改类型)。 - 需要读旧值再写新值的修补写进
src/MyPluginLifecycle.php的upgrade(),按版本分段、可重复执行。 - 平台执行顺序:升级前迁移 →
upgrade()→ 升级后迁移 → 写回版本;任一步失败保留旧版本号,下次重试。
不要自己跑 artisan migrate,也不要在 upgrade() 里建表——建表只应存在于迁移中,否则重试会重复执行。
- 不要自建鉴权:不写登录接口、不造鉴权中间件,鉴权一律复用平台中间件(
ensure.admin/ensure.client/auth:sanctum/permission:*)。 - 不要注册全局中间件、全局配置或调度任务:路由只能挂在自己 slug 前缀下,调度走清单
extra.scheduled_tasks声明。 - 不要删表删列:迁移只新增;卸载默认不删业务数据,确需清理要在 README 写明并提供独立命令。
- 不要占用核心公共路径:
api/v2/client/*、api/v2/admin/*下除自己 slug 前缀以外的路径都不属于插件。 - 不要改已审核版本的 tag/sha:市场安装器按审核锁定的引用下载代码,改了就不一致。
- 发 Release:tag =
v{major.minor.patch},与清单version一致。 - 到 插件市场索引仓库 提 PR,在
plugins.json的plugins数组加一条目。 - 合并即上架,管理端插件中心可直接搜索安装。
模板骨架为 MIT;你复制出来的插件可自行声明许可(与清单 license 字段保持一致)。TuraIDC 主仓为 AGPL-3.0-or-later:独立插件通过清单与 execute() 契约集成,不直接复制主仓代码;是否构成联合作品请自行评估。