我的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-不安全-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'
出什么问题了?我该怎么解决?
答案 0 :(得分:3)
我刚刚意识到这是我自己的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和3rd party api结构,因此我的结构与您提到的解决方案所期望的一样。例如
project/website
project/api
project/db
project/external
请注意,我的网站和api都是单独的服务,因此它们在各自的目录中都有自己的app.yaml
。您只需一个。同样在我的示例中,两个项目均导入db
和external
。