我今天开始使用Google App Engine,因此希望答案对有经验的人来说是显而易见的。在简单地按照this method使App Engine与Cloud SQL接口之后,我遇到了一个令人沮丧的问题: goapp部署成功,但 goapp服务失败了(使用云外壳)。
这是错误:
XXXX@cloudshell:~/src/XXXX/app-engine (XXXX)$ goapp serve app.yaml
INFO 2018-06-21 07:29:08,115 devappserver2.py:764] Skipping SDK update check.
INFO 2018-06-21 07:29:08,235 api_server.py:268] Starting API server at: http://0.0.0.0:60628
INFO 2018-06-21 07:29:08,305 dispatcher.py:199] Starting module "default" running at: http://0.0.0.0:8080
INFO 2018-06-21 07:29:08,306 admin_server.py:116] Starting admin server at: http://0.0.0.0:8000
ERROR 2018-06-21 07:29:12,254 go_runtime.py:181] Failed to build Go application: (Executed command: /google/go_appengine/goroot/bin/go-app-builder -app_base /home/XXX/app-engine -arch 6 -dynamic -goroot /google/go_appengine/goroot -gopath /home/XXX/gopath:/google/gopath -nobuild_files ^^$ -incremental_re
build -unsafe -binary_name _go_app -extra_imports appengine_internal/init -work_dir /tmp/tmpT1RTRMappengine-go-bin -gcflags -I,/google/go_appengine/goroot/pkg/linux_amd64_appengine -l
dflags -L,/google/go_appengine/goroot/pkg/linux_amd64_appengine hello.go)
/home/XXX/gopath/src/github.com/go-sql-driver/mysql/connection.go:12: can't find import: "context"
2018/06/21 07:29:09 Can't find package "context" in $GOPATH: cannot find package "context" in any of:
/google/go_appengine/goroot/src/context (from $GOROOT)
/home/XXX/gopath/src/context (from $GOPATH)
/google/gopath/src/context
2018/06/21 07:29:12 go-app-builder: build timing: 0×skip (3ms total), 9×compile (2.731s total), 0×link (0 total)
2018/06/21 07:29:12 go-app-builder: failed running compile: exit status 2
我怀疑使用的go版本是错误的。声明的版本是1.6.3,但据我了解,“上下文”需要1.7。这是相关的Cloud Shell输出:
XXXX@cloudshell:~ (XXX)$ goapp version
go version go1.6.3 (appengine-1.9.48) linux/amd64
XXXX@cloudshell:~ (XXX)$ go version
go version go1.10 linux/amd64
但是,尽管我尽了最大的努力,但我仍然找不到任何有关如何操纵“ goapp” go版本的资源。
我的app.yaml包括:
runtime: go
api_version: go1.8
然后 goapp get 产生以下结果:
XXXX@cloudshell:~/src/XXX/app-engine (XXX)$ goapp get
package context: unrecognized import path "context" (import path does not begin with hostname)
go文件本身是上面链接中演示的精确副本。
答案 0 :(得分:1)
根据comment on the question的确认,解决方案使用的是dev_appserver.py
,而不是goapp serve
。
goapp
是处理GAE任务的旧工具。现在建议使用dev_appserver.py
进行本地开发,并使用gcloud app
命令执行云中的任务(例如,用gcloud app deploy
代替goapp deploy
)。
请注意,goapp
并未被弃用,但是dev_appserver.py
为本地开发人员提供了更大的灵活性,而gcloud app
使用了正确记录且非常有用的App Engine Admin API(不同于旧版工具),以便在部署出现问题时简化调试。
答案 1 :(得分:0)
在Google App Engine中,如果您需要获取上下文,则可能应在HTTP请求期间将google.golang.org/appengine.NewContext()
用作上下文,或者将google.golang.org/appengine.BackgroundContext()
用于请求之外。两者都返回context.Context
,这与通过context
包创建上下文所获得的结果相同,但是具有准备在GAE中使用的上下文。
这不能告诉您为什么导入无法正常工作(goapp
似乎使用1.6除外),但是可以解决此问题,避免您导入任何context
软件包。