Groovy 本地扩展
提示
此方式维护困难, 请谨慎使用。
介绍
- 针对极其特殊的情况, 无法使用简单配置实现需求时, 可以使用 groovy 扩展以获得极高的定制化功能。
- 相对普通配置来说, 对于开发者有一定的技术要求,包括 groovy 以及当前插件的结构等都要有一定的了解。
- wiki
- offical
- demo
使用步骤
在项目目录下创建
/.easyapi/ext
创建扩展文件
${ActionName}Ext.groovy
当前可支持的操作有:ApiCallAction
ApiDashBoardAction
YApiDashBoardAction
FieldsToJsonAction
MarkdownExportAction
PostmanExportAction
YapiExportAction
在扩展文件中声明扩展类:
class ActionNameExt implements ActionExt {
void init(ActionContext.ActionContextBuilder builder) {
//在这里通过`bind`注入定制化组件,实现需要的功能
builder.bind(Xxx.class, KtHelper.INSTANCE.ktFunction({
it.to(Yyy.class).in(com.google.inject.Singleton.class)
return null
}))
}
}
Demo
YapiExportActionExt.groovy
import com.intellij.psi.*
import com.itangcent.common.model.Request
import com.itangcent.idea.plugin.api.export.ClassExporter
import com.itangcent.idea.plugin.api.export.SpringRequestClassExporter
import com.itangcent.idea.plugin.api.export.yapi.YapiClassExportRuleKeys
import com.itangcent.idea.plugin.api.export.yapi.YapiRequestKitKt
import com.itangcent.idea.plugin.script.ActionExt
import com.itangcent.idea.plugin.utils.KtHelper
import com.itangcent.intellij.context.ActionContext
import java.util.stream.Collectors
import java.util.stream.Stream
class YapiExportActionExt implements ActionExt {
void init(ActionContext.ActionContextBuilder builder) {
builder.bind(ClassExporter.class, KtHelper.INSTANCE.ktFunction({
it.to(CustomClassExporter.class).in(com.google.inject.Singleton.class)
return null
}))
}
static class CustomClassExporter extends SpringRequestClassExporter {
void processCompleted(PsiMethod method, Request request) {
super.processCompleted(method, request)
String tags = ruleComputer.computer(YapiClassExportRuleKeys.TAG, method)
if (tags != null && !tags.isEmpty()) {
YapiRequestKitKt.setTags(request, Stream.of(tags.split("\n"))
.map { it.trim() }
.filter { !it.isEmpty() }
.collect(Collectors.toList())
)
}
String status = ruleComputer.computer(YapiClassExportRuleKeys.STATUS, method)
logger.info(YapiRequestKitKt.class.toString())
YapiRequestKitKt.setStatus(request, status)
}
}
}
特别注意
由于插件源码语言是 kotlin,在 groovy 中无法使用一些语法糖。
- kotlin 中声明的扩展方法如
fun Doc.setTags(tags: List<String>?) {
...
}
- 在 groovy 中使用如下:
YapiRequestKitKt.setTags(request,tags)