之前的业务代码中需要生成 gin swagger 用于和前端联调,且和主流程代码放在一起,
导致打包镜像的时候也需要先生成 swagger,目前看这个只是用于本地和前端联调,
因此独立 gin swagger 启动命令。

代码目录结构

/myproject
  /swagger
    docs.go
    swagger.json  # 生成的文档
    swagger.yaml
  /internal
    /server
      server.go   # 主应用代码
    ...
  main.go

示例代码如下,

package main

import (
	"flag"
	"fmt"
	"log"
	"os/exec"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

var port string

func init() {
	flag.StringVar(&port, "port", "8080", "gin swagger http port")
}

func main() {
	flag.Parse()

	startSwaggerServer(fmt.Sprintf(":%s", port))
}

func startSwaggerServer(addr string) {
	cmd := exec.Command("swag", "init", "--parseDependency", "--parseInternal", "-o", "./swagger")
	err := cmd.Run()
	if err != nil {
		log.Fatalf("make swagger failed with %s\n", err)
	}

	r := gin.Default()

	r.Static("/docs", "./swagger")
	r.GET("/swagger/*any", ginSwagger.WrapHandler(
		swaggerFiles.Handler,
		ginSwagger.URL("/docs/swagger.json"),
		ginSwagger.DefaultModelsExpandDepth(-1),
	))

	r.Run(addr)
}