在App Engine Standard上进行销售

时间:2018-05-14 16:07:58

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

我知道这个话题已经被引用了几次。不幸的是,我仍然无法为我的用例找到可行的解决方案。

我似乎无法在App Engine Standard上为我的Go应用程序工作。我使用dep进行销售。

我正在建立一个GraphQL API,这是我的文件夹结构:

/GOPATH
└──/src
   └──/acme
      ├──/app
      |   ├── app.yaml
      |   └── app.go
      ├──/src
      |   ├── /mutations/
      |   ├── /queries/
      |   └── /types/
      └──/vendor/

在Cloud Shell上运行goapp serve app/app.yaml失败并显示

INFO     2018-05-14 15:42:08,386 devappserver2.py:764] Skipping SDK update check.
INFO     2018-05-14 15:42:08,471 api_server.py:268] Starting API server at: http://0.0.0.0:47213
INFO     2018-05-14 15:42:08,600 dispatcher.py:199] Starting module "default" running at: http://0.0.0.0:8080
INFO     2018-05-14 15:42:08,601 admin_server.py:116] Starting admin server at: http://0.0.0.0:8000
ERROR    2018-05-14 15:42:13,983 go_runtime.py:181] Failed to build Go application: (Executed command: /google/go_appengine/goroot/bin/go-app-builder -app_base /home/xxx/gopath/src/acme/app -arch 6 -dynamic -goroot /google/go_appengine/goroot -gopath /home/xxx/gopath:/google/gopath -nobuild_files ^^$ -incremental_rebuild -unsafe -binary_name _go_app -extra_imports appengine_internal/init -work_dir /tmp/tmpbt8DA2appengine-go-bin -gcflags -I,/google/go_appengine/goroot/pkg/linux_amd64_appengine -ldflags -L,/google/go_appengine/goroot/pkg/linux_amd64_appengine app.go)
/home/xxx/gopath/src/acme/vendor/github.com/graphql-go/graphql/definition.go:4: can't find import: "context"

2018/05/14 15:42:09 Can't find package "context" in $GOPATH: cannot find package "context" in any of:
        /home/xxx/gopath/src/acme/vendor/context (vendor tree)
        /google/go_appengine/goroot/src/context (from $GOROOT)
        /home/xxx/gopath/src/context (from $GOPATH)
        /google/gopath/src/context

看起来问题可能是某个供应商未使用" context"的完整依赖项名称。 (编辑:可能不是这种情况,因为我使用的是1.8)

有没有人曾设法使用vendoring在App Engine Standard上成功部署?一整天都在拉我的头发。

3 个答案:

答案 0 :(得分:1)

万一其他人都在努力解决这个问题,这就是我采用的方法似乎对我有用。

目录结构如下所示:

/GOPATH
├──/appengine
|  ├──/.git/
|  ├──/project1
|  |  ├── app.yaml
|  |  └── app.go
|  └──/project2
|     ├── app.yaml
|     └── app.go
└──/src
   ├──/project1
   |  ├──/.git/
   |  ├──/mutations/
   |  ├──/queries/
   |  ├──/types/
   |  ├──/vendor/
   |  └──/main.go
   └──/project2
      ├──/.git/
      ├──/foo/
      ├──/bar/
      ├──/vendor/
      └──/main.go

appengine文件夹下的每个 app.go 文件都包含:

package projectX

import "projectX"

func init() {
    projectX.Run()
}

src / projectX下面的每个 main.go 文件都包含:

package projectX

import (
    // Import whatever you need
    "google.golang.org/appengine"
)

func Run() {
    // Do whatever you need
    appengine.Main()
}

似乎确实需要在$ GOPATH / src之外包含 app.yaml 的文件夹。

如果您需要让每个项目都使用自己的git repo进行版本控制而不是拥有一个monolyth repo,那么这对于版本控制来说也不是理想的。我通过对每个项目进行版本控制以及单独对appengine文件夹进行版本化来解决这个问题。

答案 1 :(得分:1)

我遇到了问题,花了很多年的时间四处张望,试图弄清为什么它不起作用。这个答案有点晚了,但希望对其他遇到此问题的人有用。

我更新为使用我认为不受支持的Go 1.11(在github上使用here找到了一个GCP示例)

runtime: go111中设置app.yaml,它将支持供应商并为您提供指向正确构建日志的链接。

现在我的目录结构如下。

/GOPATH └──/src ├──/project1 | ├──/.git/ | ├──/whateverCode/ | ├──/vendor/ | └──/main.go | └──/app.yaml

我认为,如果它支持Go 1.11,我们也可以使用Modules进行版本控制,但我尚未对此进行研究。

答案 2 :(得分:0)

context包将位于$GOROOT内(不在vendor目录中)。可能你的Go Appengine SDK已经过时了,不支持Go 1.8。

将SDK更新到最新版本。 $GOROOT应该与/path/to/somewhere/goroot-1.8

类似