# 插件开发 开发

进行插件开发需要您当前的产品许可包括查看平台源代码,详情信息请联系您的客户经理。

# 目标读者

此文档主要目标读者为希望了解如何进行牧言开发平台插件开发的高级开发者。

# 前置知识

读者需要对 Hibernate, GORM, Grails 有一定的了解。如下是相关的参考资料:

# 创建插件

  1. 联系客户经理获取平台后端系统的源代码,或者如果您已经被授予了直接访问源代码库 的权限,可以从 这里 (opens new window) 下载系统 源代码。
  2. 复制文件夹 <project-root-folder>/grails-plugin/plugin-template<project-root-folder>/grails-plugin/my-plugin 将目录重命名为你的插件名称 (上述举例中为 my-plugin)。
  3. (建议) 在 Intellij IDEA 中刷新gradle项目,插件将自动添加到 grails-plugin 子项目中。
  4. 重命名插件的配置文件 <project-root-folder>/grails-plugin/my-plugin/src/main/groovy/tech/muyan/plugin/PluginTemplateGrailsPlugin.groovy (例如 <project-root-folder>/grails-plugin/my-plugin/src/main/groovy/tech/muyan/plugin/MyPluginGrailsPlugin.groovy)
  5. 编辑文件 <project-root-folder>/grails-plugin/my-plugin/grails-app/conf/application.yml
    • 更改 grails.codegen.defaultPackage 值,用你的插件名称替换 <plugin_name> 部分。
  6. 进行业务开发。

提示

当前的主流 IDE 中,只有 Idea 商业版对 Grails 开发的支持最优,建议使用该 IDE 进行 本平台的插件开发。

提示

请特别注意,插件配置文件中的插件名称需要与您使用的目录名完全匹配,否则插件无法被编译或使用

# 插件载入顺序

在插件的配置文件,如 /grails-plugin/<your_plugin_folder>/src/main/groovy/tech/muyan/plugin/MyPluginGrailsPlugin.groovy 中,通过 loadAfter 进行指定,如

// 表示当前插件依赖于 hibernate, domain, muyanPlatform 和 aiProvider 这几个插件
List loadAfter = ['hibernate5', 'domain', 'muyanPlatform', 'aiProvider']
1
2

系统会识别插件间的依赖关系,并按照依赖关系先后顺序进行加载

提示

loadAfter 中填写的其所依赖插件的名称为,该插件的配置文件,去掉后面的 GrailsPlugin.groovy 部分,然后将首字母小写而得到。

MyPluginGrailsPlugin.groovy 其在 loadAfter 中的插件名称为 myPlugin

AiProviderGrailsPlugin 其在 loadAfter 中的插件名称为 aiProvider

# GORM 支持

如果你的插件需要使用 GORM 将数据存储到数据库并向前端提供 API,请在 build.gradle 的依赖部分增加如下行

  implementation "org.springframework.boot:spring-boot-starter-actuator"
  implementation "org.grails:grails-plugin-url-mappings"
  implementation "org.grails:grails-plugin-rest"
  implementation "org.grails:grails-plugin-codecs"
  implementation "org.grails:grails-plugin-interceptors"
  implementation "org.grails:grails-plugin-services"
  implementation "org.grails:grails-plugin-datasource"
  implementation "org.grails:grails-plugin-databinding"
  implementation "org.grails:grails-web-boot"
  implementation "org.grails:grails-logging"
  implementation "org.grails.plugins:cache"
  implementation "org.grails.plugins:async"
  implementation "org.grails.plugins:spring-security-rest:3.0.1"
  implementation "org.grails.plugins:hibernate5"
  implementation "org.hibernate:hibernate-core:5.6.5.Final"
  implementation "org.grails.plugins:events"
  implementation "org.grails.plugins:views-json"
  implementation "org.grails.plugins:views-json-templates"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 单元测试支持

请在 build.gradle 中取消以下依赖项的注释以添加单元测试支持

  testImplementation "org.grails:grails-gorm-testing-support"
  testImplementation "org.mockito:mockito-inline"
  testImplementation "io.micronaut:micronaut-http-client"
  testImplementation "org.grails:grails-web-testing-support"
  testImplementation "org.grails:views-json-testing-support"

1
2
3
4
5
6

在根目录下运行 ./gradlew :grails-plugin:${your-plugin-name}:test 来运行单元测试。

# 种子数据

请将种子数据放在 /grails-plugin/<your_plugin_folder>/data/<profile_name>/<tenant_id> 文件夹中。 默认情况下,系统的测试 profile 和租户分别为 review 和 muyan, 因此您需要将种子数 据存放在如下目录 /grails-plugin/<your_plugin_folder>/data/review/muyan, 推荐的种子数据目录结 构如下:

data                                               : 插件根目录的 data 子目录存放所有种子数据 
├── groovy                                         : 存放客制化用到的源代码文件
│   └── generateActionDefinitionPostLogic.groovy
├── prompts                                        : 存放客制化用到的 prompt 文件
│   └── generateActionDefinition.txt
└── review                                         : Spring profile, 默认为 review 
    └── muyan                                      : 租户,默认为 muyan, 存放所有 CSV 种子数据 
        ├── DynamicAction.csv
        ├── DynamicActionDomainClass.csv
        ├── DynamicConfig.csv
        ├── DynamicFieldDefinition.csv
        ├── DynamicFieldInstance.csv
        ├── DynamicLogic.csv
        ├── DynamicLogicEngine.csv
        └── DynamicPrompt.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 运行插件

  1. starter 子项目的 build.gradle 中,将插件添加为项目依赖。之后启动平台测 试系统时,即包含了新插件的相关功能,并会自动导入插件中的种子数据
implementation project(":grails-plugin:${your-plugin-name}")
1

通过 ./gradlew :starter:bootRun 或者 ./gradlew bootRun 运行 starter 项目。

注意

平台模块 (muyanPlatform) 永远不应该依赖任何插件,插件应该依赖平台否则,将导致 循环依赖错误。如果需要测试插件,请按照上述步骤,将插件添加为 starter 模块的依赖

# 插件发布

插件将由构建脚本自动发布,artifactId 将是你的插件文件夹名称,其版本通过 gradle.properties 文件中的 techMuyanVersion 变量进行指定,同一发布中的平台和所有 插件的版本均相同。

# 插件依赖

在具体产品,或其他插件的 build.gradle 文件中,使用如下方式声明对某插件的依赖

// 在平台开发中,使用 gradle 的子项目方式依赖
implementation project(":grails-plugin:<plugin-folder-name>")

// 在具体产品开发中,使用如下方式声明对某插件的依赖
def platformVersion = '0.25.0-rc4'
implementation "tech.muyan.platform.plugin:<plugin-folder-name>:$platformVersion"
1
2
3
4
5
6

提示

使用子项目方式,而非 java 库方式依赖的情况下,还需要参考上述 插件载入顺序 章节,指定插件的载入顺序。

# 可用插件列表

以下列出了系统中当前的可用插件及其说明

# 核心插件


muyan-platform                  : 平台核心组件

1
2
3

# 非核心插件

.
starter                          : 用于开发过程中,以 web 应用方式运行平台并测试插件功能的组件
├── ai-provider                  : 提供 AI 能力 使用 AI 作为客制化逻辑引擎支持,当前支持 OpenAI
├── ai-assistant                 : 提供聊天形式的 AI 智能助手
├── i18n-support                 : 提供系统多语言支持,包括为前端提供多语言翻译信息及翻译种子数据
├── plugin-template              : 插件的的代码目录模板,拷贝该目录并进行对应修改以创建新插件
├── samples                      : 用于展示系统中相关组件,如甘特图等的使用的样例插件
1
2
3
4
5
6
7
最后更新: 2024/2/23 07:44:20