Как заставить golang gin работать с движком приложений google?

У меня GOPATH $HOME/go, я поместил исходный код своего проекта в $HOME/go/src/myproj

и есть два файла:

app.yaml:

application: hello
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

и hello.go

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 экземпляра ОШИБКА 2018-09-28 05: 17: 47,654 instance.py:300] Объект '_GoBuildFailureRuntimeProxy' не имеет атрибута '_process'

В чем проблема? Как я могу это решить?


person gacopu    schedule 28.09.2018    source источник


Ответы (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.

person RayfenWindspear    schedule 28.09.2018