【问题标题】:Google App Engine goapp "deploy" works but "serve" fails, what's going on?Google App Engine goapp“部署”工作但“服务”失败,这是怎么回事?
【发布时间】:2018-11-30 11:41:30
【问题描述】:

我今天开始使用 Google App Engine,因此希望对有经验的人来说答案是显而易见的。在简单地按照this method 让 App Engine 与 Cloud SQL 交互之后,我遇到了一个令人沮丧的问题:goapp deploy 成功但 goapp serve 失败(使用云外壳) .

这是错误:

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。这是相关的云外壳输出:

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 文件本身是上面链接中演示的精确副本。

【问题讨论】:

  • 当您使用dev_appserver.py 而不是goapp serve 时会发生什么?文档似乎建议 dev_appserver.py 为您提供更好的控制,就像部署一样,推荐的方法是 gcloud app deploy 而不是 goapp deploy
  • 感谢您提出使用 dev_appserver.py 的建议,该建议没有问题!我使用的是 goapp serve,因为这是我创建 App Engine 时教程中出现的命令。
  • 我已添加评论作为答案,以便为问题的未来访问者提供更好的可见性。我没有编辑另一个答案,因为我认为它在某些情况下可能是相关的。

标签: google-app-engine go google-cloud-platform google-cloud-sql


【解决方案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(与旧工具不同),使得在以防您的部署出现问题。

【讨论】:

    【解决方案2】:

    在 Google App Engine 中,如果您需要获取上下文,您可能应该在 HTTP 请求期间使用 google.golang.org/appengine.NewContext() 作为上下文,或者在请求之外使用 google.golang.org/appengine.BackgroundContext()。两者都返回context.Context,这与通过context 包创建上下文所获得的结果相同,但上下文已准备好在GAE 中使用。

    这并不能告诉您为什么导入不起作用(goapp 似乎使用 1.6 除外),但只会解决避免您导入任何 context 包的问题。

    【讨论】:

    • 感谢您的提示,不幸的是,在我的情况下,这无关紧要,因为我没有直接使用上下文,因此它必须连接到其中一个导入,所有这些都是标准的或提供的由谷歌提供。
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多