合并多个swagger的json文件

570 阅读1分钟

由于项目需要,领导接口文档用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>&nbsp;` + filename;
        swagger.paths = {...swagger.paths, ...obj.paths}
        swagger.definitions = {...swagger.definitions, ...obj.definitions}
    }
});
fs.writeFileSync("./swagger.json",JSON.stringify(swagger))

最后效果如下:

image.png