Как заставить golang gin работать с движком приложения Google?
Моя ГОПАТА $HOME/go
Я поместил исходный код моего проекта в $HOME/go/src/myproj
и есть два файла:
app.yaml:
application: hello
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
и привет.
package hello
import (
"net/http"
"github.com/gin-gonic/gin"
)
func ping(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}
func init() {
r := gin.Default()
api := r.Group("/api")
{
api.GET("/ping", ping)
}
http.Handle("/", r)
}
Тогда я бегу dev_appserver.py .
Оно работает,
curl http://127.0.0.1:8080/api/ping
{"message":"pong"}
Тогда я решил разделить hello.go так:
новый hello.go
package hello
import (
"net/http"
"github.com/gin-gonic/gin"
"./api"
// "myproj/api" // does not work too
)
func init() {
r := gin.Default()
api.addRoute()
http.Handle("/", r)
}
и api
папка и api/api.go
файл
package api
import (
"github.com/gin-gonic/gin"
)
func ping(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}
func addRoute() {
api := r.Group("/api")
{
api.GET("/ping", ping)
}
}
Тогда я бегу dev_appserver.py .
еще раз, но получил эту ошибку:
ОШИБКА 2018-09-28 05:17:47,653 instance_factory.py:229] Не удалось создать приложение Go: (Выполненная команда: /Users/gaco/.google-cloud-sdk/platform/google_appengine/goroot-1.9/bin/go -app-builder -app_base / Users / gaco / go / src / myproj -api_version go1 -arch 6 -dynamic -goroot /Users/gaco/.google-cloud-sdk/platform/google_appengine/goroot-1.9 -nobuild_files ^^ $ -incremental_rebuild -unsafe -print_extras_hash hello.go api / api.go)
2018/09/28 14:17:47 go-app-builder: Сбой при разборе ввода: файл приложения api.go конфликтует с тем же файлом, импортированным из GOPATH
ПРЕДУПРЕЖДЕНИЕ 2018-09-28 05:17:47,654 instance.py:297] Не удалось получить PID экземпляра ERROR 2018-09-28 05:17:47,654 instance.py:300] '_GoBuildFailureRuntimeProxy' объект не имеет атрибута _process '
В чем проблема? Как я могу решить это?
1 ответ
Я только что понял, что это проблема, которая у меня когда-то была в моем собственном проекте App Engine. Проблема в том, что потому что ваш api
папка находится под вашим myproject
папка. SDK плохо справляется с импортом, и все заканчивается рекурсивным импортом, поэтому 2018/09/28 14:17:47 go-app-builder: Failed parsing input: app file api.go conflicts with same file imported from GOPATH
ошибка.
По сути, вы должны убедиться, что вы никогда не импортируете что-либо в каталог, что действительно раздражает.
Чтобы решить эту проблему, учитывая приведенную здесь информацию, вам необходимо разбить ее на более плоскую структуру каталогов. Что-то вроде этого:
myproject/main // or however you want to name it
myproject/api
Ни с чем в голом myproject
папка. Тогда нет возможности его рекурсивного включения.
Для справки, у моего собственного проекта есть веб-сайт, api, db и сторонние api-структуры, поэтому моя структура такая, как вы ожидаете, учитывая упомянутое решение. например
project/website
project/api
project/db
project/external
Обратите внимание, что и мой веб-сайт, и API - это отдельные сервисы, поэтому у них обоих есть свои app.yaml
в соответствующих каталогах. Вы бы просто иметь один. Также в моем примере оба проекта импортируются db
а также external
,