feat: add plugin development docs (#123)
### What this PR does? 添加插件开发文档 ### Which issue(s) this PR fixes Fixes #113 /area docs ```release-note None ```JohnNiang-patch-1
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: 静态资源代理
|
||||||
|
description: 了解如果使用静态资源代理来访问插件中的静态资源
|
||||||
|
---
|
||||||
|
|
||||||
|
插件中的静态资源如图片等如果想被外部访问到,需要放到 `src/main/resources` 目录下,并通过创建 ReverseProxy 自定义模型来进行静态资源代理访问。
|
||||||
|
|
||||||
|
例如 `src/main/resources` 下的 `static` 目录下有一张 `halo.jpg`:
|
||||||
|
|
||||||
|
1. 首先需要在 `src/main/resources/extensions` 下创建一个 `yaml`,文件名可以任意。
|
||||||
|
2. 示例配置如下。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: plugin.halo.run/v1alpha1
|
||||||
|
kind: ReverseProxy
|
||||||
|
metadata:
|
||||||
|
# name 为此资源的唯一标识名称,不允许重复,为了避免与其他插件冲突,推荐带上插件名称前缀
|
||||||
|
name: my-plugin-fake-reverse-proxy
|
||||||
|
rules:
|
||||||
|
- path: /res/**
|
||||||
|
file:
|
||||||
|
directory: static
|
||||||
|
# 如果想代理 static 下所有静态资源则省略 filename 配置
|
||||||
|
filename: halo.jpg
|
||||||
|
```
|
||||||
|
|
||||||
|
插件启动后会根据 `/plugins/{plugin-name}/assets/**` 规则生成 API。
|
||||||
|
因此该 `ReverseProxy` 的访问路径为: `/plugins/my-plugin/assets/res/halo.jpg`。
|
||||||
|
|
||||||
|
- `rules` 下可以添加多组规则。
|
||||||
|
- `path` 为路径前缀。
|
||||||
|
- `file` 表示访问文件系统,目前暂时仅支持这一种。
|
||||||
|
- `directory` 表示要代理的目标文件目录,它相对于 `src/main/resources/` 目录。
|
||||||
|
- `filename` 表示要代理的目标文件名。
|
||||||
|
|
||||||
|
`directory` 和 `filename` 都是可选的,但必须至少有一个被配置。
|
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
title: 生命周期
|
||||||
|
description: 了解插件从启动到卸载的过程
|
||||||
|
---
|
||||||
|
|
||||||
|
根据[插件项目文件结构](./structure.md)所展示的 `StarterPlugin.java` 中,具有如下方法:
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
System.out.println("插件启动成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
System.out.println("插件停止!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete() {
|
||||||
|
System.out.println("插件被删除!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 插件启动
|
||||||
|
|
||||||
|
插件被安装后,只加载了插件的 `plugin.yaml`,类及其他资源文件的加载均在启动时进行。
|
||||||
|
当插件加载完类文件并准备好启动插件后就会调用插件的 `start()` 方法,这有助于插件在启动时做一些事情,例如初始化。
|
||||||
|
|
||||||
|
### 插件停止
|
||||||
|
|
||||||
|
插件停止时,会删除在启动时创建的自定义资源,例如插件设置等通过 `yaml` 创建的自定义模型资源。
|
||||||
|
插件定义的自定义模型也需要在此时清理掉。
|
||||||
|
|
||||||
|
### 插件删除
|
||||||
|
|
||||||
|
插件被卸载时被调用。
|
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
title: 项目结构
|
||||||
|
description: 了解插件的文件结构
|
||||||
|
---
|
||||||
|
|
||||||
|
新创建的插件项目典型的目录结构如下所示:
|
||||||
|
|
||||||
|
```text
|
||||||
|
.
|
||||||
|
├── LICENSE
|
||||||
|
├── README.md
|
||||||
|
├── gradle
|
||||||
|
│ └── .
|
||||||
|
├── lib
|
||||||
|
│ └── halo-2.0.0-SNAPSHOT-plain.jar
|
||||||
|
├── src
|
||||||
|
│ ├── main
|
||||||
|
│ │ ├── java
|
||||||
|
│ │ │ └── run
|
||||||
|
│ │ │ └── halo
|
||||||
|
│ │ │ └── starter
|
||||||
|
│ │ │ └── StarterPlugin.java
|
||||||
|
│ │ └── resources
|
||||||
|
│ │ ├── console
|
||||||
|
│ │ │ ├── main.js
|
||||||
|
│ │ │ └── style.css
|
||||||
|
│ │ └── plugin.yaml
|
||||||
|
├── gradlew
|
||||||
|
├── gradlew.bat
|
||||||
|
├── gradle.properties
|
||||||
|
├── settings.gradle
|
||||||
|
├── build.gradle
|
||||||
|
├── console
|
||||||
|
│ ├── package.json
|
||||||
|
│ ├── pnpm-lock.yaml
|
||||||
|
│ ├── src
|
||||||
|
│ │ ├── assets
|
||||||
|
│ │ │ └── logo.svg
|
||||||
|
│ │ ├── components
|
||||||
|
│ │ │ └── HelloWorld.vue
|
||||||
|
│ │ ├── index.ts
|
||||||
|
│ │ ├── styles
|
||||||
|
│ │ │ └── index.css
|
||||||
|
│ │ └── views
|
||||||
|
│ │ └── DefaultView.vue
|
||||||
|
│ ├── tsconfig.app.json
|
||||||
|
│ ├── tsconfig.config.json
|
||||||
|
│ ├── tsconfig.json
|
||||||
|
│ ├── tsconfig.vitest.json
|
||||||
|
│ └── vite.config.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
该目录包含了前端和后端两个部分,让我们依次看一下它们中的每一个。
|
||||||
|
|
||||||
|
### 后端部分
|
||||||
|
|
||||||
|
所有的后端代码都放在 `src` 目录下,它是一个常规的 `Java` 项目目录结构。
|
||||||
|
|
||||||
|
- `StarterPlugin.java` 为插件的后端入口文件。
|
||||||
|
|
||||||
|
- `resources` 下的 `plugin.yaml` 为插件的资源描述文件,它是必须的。
|
||||||
|
|
||||||
|
- `resources/console` 下的两个文件 `main.js` 和 `style.css` 是前端插件部分打包时输出的产物。一个插件可以没有前端部分,因此 `resources/console` 同样可以不存在。
|
||||||
|
|
||||||
|
`lib/halo-2.0.0-SNAPSHOT-plain.jar` 它是 Halo 的类型依赖,目前使用 `JAR` 文件的方式引入依赖只是暂时的,后续将会改进它,它只作为编译时依赖使用。
|
||||||
|
|
||||||
|
### 前端部分
|
||||||
|
|
||||||
|
`console` 目录下为插件的前端部分的工程目录,包括了源码、配置文件和静态资源文件。
|
||||||
|
同样的,将所有前端项目源码放到 `src` 中。我们建议使用 `TypeScript` 作为编程语言,它可以帮助你在编译时而非运行时捕获错误。
|
||||||
|
|
||||||
|
- `src/index.ts` 作为前端部分的插件的入口文件。
|
||||||
|
- `views` 中存放视图文件。
|
||||||
|
- `styles` 中存放样式。
|
||||||
|
- `components` 中放一些公共组件。
|
||||||
|
- `assets` 用于放静态资源文件。
|
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 158 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 245 KiB |
After Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 194 KiB |
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: 静态资源代理
|
||||||
|
description: 了解如果使用静态资源代理来访问插件中的静态资源
|
||||||
|
---
|
||||||
|
|
||||||
|
插件中的静态资源如图片等如果想被外部访问到,需要放到 `src/main/resources` 目录下,并通过创建 ReverseProxy 自定义模型来进行静态资源代理访问。
|
||||||
|
|
||||||
|
例如 `src/main/resources` 下的 `static` 目录下有一张 `halo.jpg`:
|
||||||
|
|
||||||
|
1. 首先需要在 `src/main/resources/extensions` 下创建一个 `yaml`,文件名可以任意。
|
||||||
|
2. 示例配置如下。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: plugin.halo.run/v1alpha1
|
||||||
|
kind: ReverseProxy
|
||||||
|
metadata:
|
||||||
|
# name 为此资源的唯一标识名称,不允许重复,为了避免与其他插件冲突,推荐带上插件名称前缀
|
||||||
|
name: my-plugin-fake-reverse-proxy
|
||||||
|
rules:
|
||||||
|
- path: /res/**
|
||||||
|
file:
|
||||||
|
directory: static
|
||||||
|
# 如果想代理 static 下所有静态资源则省略 filename 配置
|
||||||
|
filename: halo.jpg
|
||||||
|
```
|
||||||
|
|
||||||
|
插件启动后会根据 `/plugins/{plugin-name}/assets/**` 规则生成 API。
|
||||||
|
因此该 `ReverseProxy` 的访问路径为: `/plugins/my-plugin/assets/res/halo.jpg`。
|
||||||
|
|
||||||
|
- `rules` 下可以添加多组规则。
|
||||||
|
- `path` 为路径前缀。
|
||||||
|
- `file` 表示访问文件系统,目前暂时仅支持这一种。
|
||||||
|
- `directory` 表示要代理的目标文件目录,它相对于 `src/main/resources/` 目录。
|
||||||
|
- `filename` 表示要代理的目标文件名。
|
||||||
|
|
||||||
|
`directory` 和 `filename` 都是可选的,但必须至少有一个被配置。
|
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
title: 生命周期
|
||||||
|
description: 了解插件从启动到卸载的过程
|
||||||
|
---
|
||||||
|
|
||||||
|
根据[插件项目文件结构](./structure.md)所展示的 `StarterPlugin.java` 中,具有如下方法:
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
System.out.println("插件启动成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop() {
|
||||||
|
System.out.println("插件停止!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete() {
|
||||||
|
System.out.println("插件被删除!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 插件启动
|
||||||
|
|
||||||
|
插件被安装后,只加载了插件的 `plugin.yaml`,类及其他资源文件的加载均在启动时进行。
|
||||||
|
当插件加载完类文件并准备好启动插件后就会调用插件的 `start()` 方法,这有助于插件在启动时做一些事情,例如初始化。
|
||||||
|
|
||||||
|
### 插件停止
|
||||||
|
|
||||||
|
插件停止时,会删除在启动时创建的自定义资源,例如插件设置等通过 `yaml` 创建的自定义模型资源。
|
||||||
|
插件定义的自定义模型也需要在此时清理掉。
|
||||||
|
|
||||||
|
### 插件删除
|
||||||
|
|
||||||
|
插件被卸载时被调用。
|
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
title: 项目结构
|
||||||
|
description: 了解插件的文件结构
|
||||||
|
---
|
||||||
|
|
||||||
|
新创建的插件项目典型的目录结构如下所示:
|
||||||
|
|
||||||
|
```text
|
||||||
|
.
|
||||||
|
├── LICENSE
|
||||||
|
├── README.md
|
||||||
|
├── gradle
|
||||||
|
│ └── .
|
||||||
|
├── lib
|
||||||
|
│ └── halo-2.0.0-SNAPSHOT-plain.jar
|
||||||
|
├── src
|
||||||
|
│ ├── main
|
||||||
|
│ │ ├── java
|
||||||
|
│ │ │ └── run
|
||||||
|
│ │ │ └── halo
|
||||||
|
│ │ │ └── starter
|
||||||
|
│ │ │ └── StarterPlugin.java
|
||||||
|
│ │ └── resources
|
||||||
|
│ │ ├── console
|
||||||
|
│ │ │ ├── main.js
|
||||||
|
│ │ │ └── style.css
|
||||||
|
│ │ └── plugin.yaml
|
||||||
|
├── gradlew
|
||||||
|
├── gradlew.bat
|
||||||
|
├── gradle.properties
|
||||||
|
├── settings.gradle
|
||||||
|
├── build.gradle
|
||||||
|
├── console
|
||||||
|
│ ├── package.json
|
||||||
|
│ ├── pnpm-lock.yaml
|
||||||
|
│ ├── src
|
||||||
|
│ │ ├── assets
|
||||||
|
│ │ │ └── logo.svg
|
||||||
|
│ │ ├── components
|
||||||
|
│ │ │ └── HelloWorld.vue
|
||||||
|
│ │ ├── index.ts
|
||||||
|
│ │ ├── styles
|
||||||
|
│ │ │ └── index.css
|
||||||
|
│ │ └── views
|
||||||
|
│ │ └── DefaultView.vue
|
||||||
|
│ ├── tsconfig.app.json
|
||||||
|
│ ├── tsconfig.config.json
|
||||||
|
│ ├── tsconfig.json
|
||||||
|
│ ├── tsconfig.vitest.json
|
||||||
|
│ └── vite.config.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
该目录包含了前端和后端两个部分,让我们依次看一下它们中的每一个。
|
||||||
|
|
||||||
|
### 后端部分
|
||||||
|
|
||||||
|
所有的后端代码都放在 `src` 目录下,它是一个常规的 `Java` 项目目录结构。
|
||||||
|
|
||||||
|
- `StarterPlugin.java` 为插件的后端入口文件。
|
||||||
|
|
||||||
|
- `resources` 下的 `plugin.yaml` 为插件的资源描述文件,它是必须的。
|
||||||
|
|
||||||
|
- `resources/console` 下的两个文件 `main.js` 和 `style.css` 是前端插件部分打包时输出的产物。一个插件可以没有前端部分,因此 `resources/console` 同样可以不存在。
|
||||||
|
|
||||||
|
`lib/halo-2.0.0-SNAPSHOT-plain.jar` 它是 Halo 的类型依赖,目前使用 `JAR` 文件的方式引入依赖只是暂时的,后续将会改进它,它只作为编译时依赖使用。
|
||||||
|
|
||||||
|
### 前端部分
|
||||||
|
|
||||||
|
`console` 目录下为插件的前端部分的工程目录,包括了源码、配置文件和静态资源文件。
|
||||||
|
同样的,将所有前端项目源码放到 `src` 中。我们建议使用 `TypeScript` 作为编程语言,它可以帮助你在编译时而非运行时捕获错误。
|
||||||
|
|
||||||
|
- `src/index.ts` 作为前端部分的插件的入口文件。
|
||||||
|
- `views` 中存放视图文件。
|
||||||
|
- `styles` 中存放样式。
|
||||||
|
- `components` 中放一些公共组件。
|
||||||
|
- `assets` 用于放静态资源文件。
|