本文目标

  • 将 Html 页面挂载到 Gin 的路由中,通过访问接口即可展现 Html 页面
  • 通过运行单独的可执行(二进制)程序,无需加载额外的目录或文件,即可实现上述目标

所使用的库

  • github.com/gin-gonic/gin
  • embed(Go 的官方库)

指定目录挂载

  • 和 r.GET() 等方法类似,只需要调用 r.Static() 方法,分别传入接口的相对路径(string)和文件目录(string),即可在访问该接口的时候展示传入的文件路径下的 Html 页面
  • 如多页面的前端项目,可以使用 r.StaticFile() 方法,在第二个参数处传入文件路径即可
  1. // 这里使用现有路由或新建的路由
  2. r := gin.Default()
  3. r.Static("/web1", "./web/dist")
  4. r.StaticFile("/web2", "./web/dist/index.html")

将页面文件编译进可执行(二进制)文件

  • Go 官方提供了一个库—— embed,它可以将指定的静态文件打包到编译后的文件内
  • 本文只介绍结合 Gin 的调用方式,如需了解更多有关 embed 的知识,可以移步至 TODO: Go embed
  1. // 下面这行注释是必要的,它指定了静态文件的目录或路径
  2. //go:embed "web"
  3. var htmlFiles embed.FS
  4. func setupRouter() *gin.Engine {
  5. r := gin.Default()
  6. // 由于我们指定的是一个目录,所以在这里需要使用 fs.Sub()方法
  7. // 进入目录内部,再传给路由
  8. hf, _ := fs.Sub(htmlFiles, "web")
  9. r.StaticFS("/web", http.FS(hf))
  10. return r
  11. }
  • 打开终端,进入项目根目录,执行编译命令
  1. go build .
  • 执行编译输出的可执行文件
  1. # Linux
  2. ./xxx
  3. # Windows
  4. ./xxx.exe
  • 这时无论我们将二进制文件更换到什么目录,都不会依赖项目根目录下的 web 文件夹,即可通过访问 Gin 路由暴露的接口访问 Html 页面了