Skip to content

Publish 插件

本文记录 OpenFairyGUI Node 发布链路当前支持的插件口径。这里的插件只面向 OpenFairyGUI 自动化发布链路,不等同于 FairyGUI 编辑器插件。

宿主边界

只有 Node adapter(@openfairygui/functions/nodepublishNode())会从工程 plugins/ 目录自动发现和加载 publish 插件。

  • 低层 publish() 内核不访问 Node 文件系统;它只执行调用方通过 PublishOptions.plugins 注入的 hooks。
  • publishBrowser() 不注入插件,因此 browser-safe 发布不会加载 Node 插件。
  • genCode 仍是通用发布后的处理能力;Node adapter 默认启用,browser adapter 默认关闭。

插件目录

publishNode() 默认从工程根目录下的 plugins/ 目录加载 publish 插件:

text
MyProject/
  MyProject.fairy
  assets/
  plugins/
    my-openfairygui-plugin/
      package.json
      index.mjs

读取工程后,publishNode() 会优先按文档的工程根目录查找该目录。若文档没有工程根目录, 但传入的 assetsPath 可定位到工程根目录,则按该根目录查找;两者都不可用时不加载插件, 发布流程继续执行。

Manifest

每个 OpenFairyGUI publish 插件必须放在独立子目录中,并提供 package.json

json
{
  "name": "my-openfairygui-plugin",
  "main": "index.mjs"
}

当前规则:

字段规则
name必填,用于日志和插件标识
main必填,必须解析到当前插件目录内部

缺少必要字段、入口越界、入口加载失败或不符合 OpenFairyGUI 插件 API 的目录会被跳过。 跳过插件不会阻断发布流程。

插件 API

插件可以使用 default object export:

js
export default {
  async genCode(doc, settings, options) {
    // custom code generation
  },
};

也可以使用 named export:

js
export async function genCode(doc, settings, options) {
  // custom code generation
}

当前支持的 hook:

Hook签名说明
onPublishStart(doc, options)发布主流程开始前执行
genCode(doc, settings, options)代码生成阶段执行
onPublishEnd(doc, options)发布主流程结束前执行

genCode 的参数含义:

参数说明
doc当前 Document
settings已解析并补齐默认值的代码生成设置
options发布时传入的代码生成上下文,包含 fspackagesbasePathplugins

生命周期与降级规则

当前执行顺序:

text
onPublishStart -> atlas / binary publish -> genCode -> onPublishEnd

代码生成阶段的规则:

场景行为
没有 genCode 插件使用 OpenFairyGUI 内置代码生成
至少一个 genCode 插件成功执行视为插件已接管代码生成,跳过内置代码生成
genCode 插件执行失败记录 warning,继续尝试其他插件
所有 genCode 插件都失败回退到内置代码生成
publish hook 执行失败记录 warning,不阻断发布

与 FairyGUI 编辑器插件的关系

OpenFairyGUI publish 插件和 FairyGUI 编辑器插件不是同一种插件协议,不能直接通用。

两类插件可以放在相同的 plugins/ 目录下,不会互相影响:

  • OpenFairyGUI 只按本文档的 manifest 与 API 约定加载 publish 插件。
  • FairyGUI 编辑器按编辑器自身的插件规则加载编辑器插件。
  • 不符合 OpenFairyGUI publish 插件约定的目录会被跳过,不应影响自动化发布。

如果同一个功能需要同时支持 FairyGUI 编辑器和 OpenFairyGUI 自动化发布,需要分别开发 两套插件入口或适配层。两边可以共享内部业务代码,但插件入口、生命周期和 API 契约必须 分别实现。

当前限制

  • 插件加载依赖 Node 环境。
  • 插件不属于 browser-safe authoring session 的能力。
  • 插件 API 以当前实现为准,不承诺与 FairyGUI 编辑器插件 API 兼容。

MIT Licensed