由于项目需要,领导接口文档用swaggger统一输出。
对于go-zero项目,会有多个api模块。使用官方的插件,会生成多个json文件。
再用swagger展示的时候,默认只能显示一个json文件的接口。
goctl api plugin -plugin goctl-swagger="swagger -filename user.json" -api user.api -dir .
现有的项目结构:
api/
|--user/
| |--desc/
| |--role/
| | |--role.api
| |--login/
| | |--login.api
| |--user.api
|--settting/
desc/
swagger/
user.api文件内容:
syntax = "v1"
info (
title: "用户服务"
desc: "用户服务"
version: "v1"
)
import (
"login/login.api" // 这里不能写成 ./login/login.api 虽然这样不影响从api文件生成go代码,但是影响生成swagger的json文件生成
"role/role.api"
)
使用docker启动一个swagger服务。并且把json文件都挂载到指定目录
version: '3.8'
services:
swagger:
image: swaggerapi/swagger-ui
volumes:
- ../service/swagger:/api
ports:
- 8080:8080
environment:
- BASE_URL=/api
- SWAGGER_JSON=/api/swagger.json
编写脚本,从api文件生成json文件,然后再合并多个json文件为一个swagger.json
#!/usr/bash
cd swagger/
baseDir=../api/
for item in `ls $baseDir`
do
if [ -d $baseDir"/"$item ]
then
goctl api plugin -plugin goctl-swagger="swagger -filename $item.json" -api $baseDir"/"$item"/desc/"$item.api -dir .
fi
done
`node ./merge.js`
合并json文件的脚本,应为用node来处理json文件很方便,就直接写了一个merge.js的文件
var fs = require('fs');
let filePath = "./"
let swagger = {
swagger: "2.0",
info: {
title: "ccapi",
description: "",
version: "v1"
},
schemes: [
"http",
"https"
],
consumes: [
"application/json"
],
produces: [
"application/json"
],
paths:[],
definitions:{},
securityDefinitions: {
apiKey: {
type: "apiKey",
description: "Enter JWT Bearer token **_only_**",
name: "Authorization",
in: "header"
}
},
security: [
{
"apiKey": []
}
]
};
//根据文件路径读取文件,返回文件列表
let files = fs.readdirSync(filePath);
//遍历读取到的文件列表
files.forEach(function(filename) {
//获取当前文件的绝对路径
if(filename.includes(".json") && filename != "swagger.json") {
let obj = JSON.parse(fs.readFileSync(filename))
swagger.info.description += "\n"+ `<a target="_blank" href="./${filename}" rel="noopener noreferrer" class="link"><span class="url"> ${obj.info.description}</span></a> ` + filename;
swagger.paths = {...swagger.paths, ...obj.paths}
swagger.definitions = {...swagger.definitions, ...obj.definitions}
}
});
fs.writeFileSync("./swagger.json",JSON.stringify(swagger))
最后效果如下: