8

我正在尝试将一个小型测试应用程序部署到 Google App Engine(标准)。如果我包含任何供应商库,我会收到错误消息。

这是我尝试部署时遇到的错误

% gcloud app deploy
Services to deploy:

descriptor:      [/Users/matt/work/appenginetest1/src/hello/default/app.yaml]
source:          [/Users/matt/work/appenginetest1/src/hello/default]
target project:  REDACTED
target service:  [default]
target version:  [20170709t220721]
target url:      REDACTED


Do you want to continue (Y/n)?  y

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 0 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
go-app-builder: build timing: 2×compile (210ms total), 0×link (0s total)
go-app-builder: failed running compile: exit status 2

main.go:6: can't find import: "github.com/julienschmidt/httprouter"

在某些情况下,这是 $GOPATH 的树

% tree $GOPATH
/Users/matt/work/appenginetest1
└── src
    └── hello
        ├── default
        │   ├── app.yaml
        │   └── main.go
        ├── glide.lock
        ├── glide.yaml
        └── vendor
            └── github.com
                └── julienschmidt
                    └── httprouter
                        ├── path.go
                        ├── router.go
                        └── tree.go

通过 dev_appserver.py 运行本地服务器工作正常。看起来不像是应用引擎在运行后找不到供应商目录的情况

% rm -rf ~/work/appenginetest1/src/hello/vendor/github.com

它甚至在推送到云之前就出错了

% gcloud app deploy
ERROR: (gcloud.app.deploy) Staging command [/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/goroot-1.6/bin/go-app-stager /Users/matt/work/appenginetest1/src/hello/default/app.yaml /var/folders/nx/8w2_6q551cl50h3ff6lmy9s40000gn/T/tmp97Kiis/tmpe0MHQ0] failed with return code [1].

------------------------------------ STDOUT ------------------------------------
------------------------------------ STDERR ------------------------------------
2017/07/09 22:12:52 failed analyzing /Users/matt/work/appenginetest1/src/hello/default: cannot find package "github.com/julienschmidt/httprouter" in any of:
    /Users/matt/work/appenginetest1/src/hello/vendor/github.com/julienschmidt/httprouter (vendor tree)
    ($GOROOT not set)
    /Users/matt/work/appenginetest1/src/github.com/julienschmidt/httprouter (from $GOPATH)
GOPATH: /Users/matt/work/appenginetest1
--------------------------------------------------------------------------------

如果我将 github.com 目录从供应商移动到 src,则部署工作没有问题。

应用程序.yaml

service: default
runtime: go
api_version: go1


handlers:
- url: /.*
  script: _go_app

main.go

package hello

import (
  "fmt"
  "net/http"
  "github.com/julienschmidt/httprouter"
)

func init() {
  router := httprouter.New()
  router.GET("/hello/:name", Hello)
  http.Handle("/", router)
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  fmt.Fprintf(w, "Hello, %s!", ps.ByName("name"))
}

如果在运行 glide install 后将 github.com 目录从供应商移动到 src,我可以部署这个项目。

4

2 回答 2

1

您可以通过使用$GOPATH变量来解决这个问题。请注意,您的$GOPATH环境变量实际上可以是多个位置的列表(有关更多信息,请参见https://golang.org/cmd/go/#hdr-GOPATH_environment_variable):

GOPATH 环境变量列出了查找 Go 代码的位置。在 Unix 上,该值是一个冒号分隔的字符串。在 Windows 上,该值是以分号分隔的字符串。在计划 9 中,值是一个列表。

与其将 github.com 目录从 vendor 移动到 src,不如编写一个脚本,将vendor/github.com目录临时添加到$GOPATH环境变量中,执行部署,然后将其从环境变量中删除。

于 2018-02-12T19:30:22.067 回答
0

根据 rudolph1024 的回答,我用来将项目推送到应用引擎标准的一种方法是在 make 文件中添加几行。最简单的例子是:

GOPATH=./vendor gcloud app deploy

这样做的好处是允许您从这里使用 go 社区标准 repo 布局,而不是这里的 google布局

应用引擎标准喜欢将 app.yaml 放在根目录中,并且将使用其下的所有 go 文件。所以你可以做类似的事情

cp -r cmd/ ../../cmd  && cd ../../cmd && GOPATH=./vendor gcloud app deploy 

有很多方法可以清理它,但这很有效,并给出了该方法的总体思路。

于 2018-08-16T12:19:19.193 回答