google-app-engine - 如何让 golang gin 与谷歌应用引擎一起工作?
问题描述
我的 GOPATH 是$HOME/go
,我把我的项目的源代码放在$HOME/go/src/myproj
并且有两个文件:
应用程序.yaml:
application: hello
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
和你好.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'
问题是什么?我该如何解决?
解决方案
我刚刚意识到这是我曾经在自己的 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 方 api 结构,所以我的结构与你所期望的一样,给出了提到的解决方案。例如
project/website
project/api
project/db
project/external
app.yaml
请注意,我的网站和 api 都是独立的服务,因此它们在各自的目录中都有自己的服务。你只需要一个。同样在我的示例中,两个项目都导入db
和external
.
推荐阅读
- react-select - react-select 将自定义组件渲染为 SingleValue
- xsd - 在 MarkLogic 中是否有用于查询双时态数据的最佳时间戳格式?
- android - Firebase Crashlytics - 自定义 UncaughtExceptionHandler
- react-native - React-native Run-ios build failed .error 无法构建 iOS 项目。我们运行了“xcodebuild”命令,但它以错误代码 65 退出
- android - WorkManager 唯一工作未执行
- javascript - 如何回到 Ionic 4
- javascript - 正确的 Redux/Saga 分页模式
- python - 如果在 mongoengine 中为空,则更新字段
- python - 如何向我的 Django 模型添加一个字段以动态过滤另一个字段的下拉列表?
- javascript - 如何正确编写这个 window.history.go(-historyCount)