Обнаружение сервера приложений для разработки в Go без автономного SDK App Engine?
Пакет Go, https://godoc.org/google.golang.org/appengine, предоставляет IsDevAppServer, который сообщает, запущено ли приложение App Engine на сервере приложений разработки (например,localhost:8080
). Однако это не работает, если не используется (устаревший) автономный SDK. См. Реализацию на appengine.go#L57.
Новые приложения GAE, написанные на Go, в основном представляют собой обычный веб-сервер, который можно скомпилировать и запустить локально, как любую программу Go;
- старый;
dev_appserver.py
- новый;
go run main.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)
}
Каков рекомендуемый способ добиться этого на автономном сервере Go, работающем на App Engine?
2 ответа
Среда App Engine Standard Go автоматически устанавливает ряд переменных среды. Вы можете посмотреть список здесь.
Вы можете проверить, установлены ли они, а если нет, то ваш код работает локально (или, по крайней мере, не развернут). Или вы можете установитьNODE_ENV
переменная среды для development
на вашем компьютере (в вашей оболочке, где вы запускаете приложение локально, а не в файле app.yaml) и проверьте его значение. Он будет установлен наproduction
при работе в App Engine.
Это звучит сложно, но я обнаружил, что сервер метаданных также отвечает стандарту движка приложений.
Furthur, я использовал
cloud.google.com/go/compute/metadata
пакакге
metadata.OnGCE()
в качестве быстрой проверки, находится ли он на моем локальном компьютере или на компьютере Google (да, он возвращает true на движке приложения)