如何使用Go在Cloud Function中提供swagger ui dist?
云外功能环境我会做:
package main
import (
"fmt"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./swagger-ui-dist"))
http.Handle("/swaggerui/", http.StripPrefix("/swaggerui/", fs))
http.ListenAndServe(":8080", nil)
}
但由于Cloud函数使用一个普通函数作为使用标准http的处理程序。HanlderFunc接口我不知道如何让它工作。
我试着模拟这个场景,用http进行测试。ServeFile,但不起作用。似乎没有下载文件夹的所有内容。
package main
import (
"fmt"
"net/http"
)
func cloudFunctionHandler(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./swagger-ui-dist")
}
func main() {
http.HanldeFunc("/swaggerui/", handler)
http.ListenAndServe(":8080", nil)
}
我尝试了几种方法,它在本地以与Cloud Function相同的行为工作(相同的函数签名(,但在Cloud Function上部署后就不起作用了。
我明白为什么。事实上,Buildpack(谷歌开发的用于构建没有Dockerfile的容器的工具,现在位于CNCF沙盒中(编译.go文件并将二进制文件复制到最终的容器层。省略了所有其他文件/目录。因此,它不起作用!
我建议您使用Cloud Run(与Cloud Functions相同的底层平台,在某些情况下更便宜。我写了一篇关于这方面的文章(
另一种解决方案是使用未编译的语言,如NodeJS或Python。
实际上有三种可能(我知道(:
- 从CDN提供静态文件。例如,来自http://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.40.0/
- 将静态文件自己托管在另一个端点上
- 将静态文件添加到云函数的根文件夹中。这些将与您的代码打包在一起,因此在部署时可用
(我选择了选项3(
对于选项2和3,必须覆盖swaggerui用于其静态资源的文件夹。如何做到这一点取决于如何配置swagger ui。
在我的案例中,我使用flask_restx Python包来生成swagger.json
并提供swaggerui。所以我像这样打了猴痘:
from flask_restx.apidoc import apidoc
apidoc.static_folder = '<MY STATIC FOLDER PATH' # e.g. os.path.abspath('static/swaggerui')
此外,在运行gcloud function deploy ...
之前,您需要将文件从swaggerui库复制到函数的根目录。
在CI管道期间,我将static
文件夹从flask_restx复制到函数的根目录。
希望这能帮助到任何人!