Google app engine 如何让golang gin与google应用程序引擎协同工作?

Google app engine 如何让golang gin与google应用程序引擎协同工作?,google-app-engine,go,dev-appserver,google-app-engine-go,dev-appserver-2,Google App Engine,Go,Dev Appserver,Google App Engine Go,Dev Appserver 2,我的GOPATH是$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" )

我的GOPATH是
$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)
}
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)
}
然后运行
dev\u appserver.py。

它起作用了

curl http://127.0.0.1:8080/api/ping
{"message":"pong"}
然后我决定分开你好。走这边:

新建您好。开始

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)
}
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:47653实例_factory.py:229]无法生成Go应用程序:(已执行命令:/Users/gaco/.google cloud sdk/platform/google\u appengine/goroot-1.9/bin/go-app-builder-app\u base/Users/gaco/go/src/myproj-api\u version go1-arch 6-dynamic-goroot/Users/gaco/.google cloud sdk/platform/google\u appengine/goroot-1.9-nobuild\u files^$-增量\u重建-不安全-打印额外文件\u hash hello.go api/api.go)

2018/09/28 14:17:47 go app builder:解析输入失败:app file api.go与从GOPATH导入的同一文件冲突

警告2018-09-28 05:17:47654实例。py:297]无法获取实例的PID 错误2018-09-28 05:17:47654 instance.py:300]“\u GoBuildFailureRuntimeProxy”对象没有属性“\u进程”


问题是什么?我如何解决它?

我刚刚意识到这是我在自己的应用程序引擎项目中遇到过的一个问题。问题是因为你的
api
文件夹嵌套在你的
myproject
文件夹下。SDK不能很好地处理导入,结果是递归导入的,因此出现了
2018/09/28 14:17:47 go app builder:解析输入失败:app file api.go与从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

可能重复的