在没有 App Engine 独立 SDK 的情况下检测 Go 中的开发应用服务器?

Detecting a development App Server in Go, without the App Engine standalone SDK?

Go 包,google.golang.org/appengine, provides IsDevAppServer which reports whether an App Engine app is running in the development App Server (e.g. localhost:8080). However, this does not work unless the (deprecated) standalone SDK is used. See appengine.go#L57 用于实现。

用 Go 编写的新 GAE 应用程序基本上是一个常规的 Web 服务器,可以像任何 Go 程序一样在本地编译和启动;

在 运行 本地时,检测开发服务器可用于防止 CORS 问题:

func setDevHeaders(w http.ResponseWriter) {
    w.Header().Set("Access-Control-Allow-Origin", "http://localhost:4200")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
    w.Header().Set("Access-Control-Request-Method", "POST, GET")
    w.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
}

需要时我可以分支:

if appengine.IsDevAppServer() {
    setDevHeaders(w)
}

在 App Engine 上的独立 Go 服务器 运行 中实现此目标的推荐方法是什么?

A​​pp Engine 标准 Go 环境会自动设置一些环境变量。您可以查看列表 here.

您可以检查它们是否已设置,如果它们没有,那么您的代码运行正在本地(或至少未部署)。或者您可以在您的机器上将 NODE_ENV 环境变量设置为 development(在您的 shell 中,您在本地 运行 您的应用程序,而不是在 app.yaml 文件中)并检查它的值。在 App Engine 上 运行ning 时,它将设置为 production

这听起来很棘手,但我发现元数据服务器也响应应用引擎标准。

此外,我使用了 cloud.google.com/go/compute/metadata pacakge,

metadata.OnGCE()

快速检查它是在我的本地机器上还是在 google 的机器上(是的,它 returns 在 App Engine 上是正确的)