如何使用Google App Engine进行销售?

emi*_*der 12 google-app-engine go

我试图将Go vendoring(将依赖项存储在一个名为的文件夹中vendor)引入现有的App Engine项目.我已将所有依赖项存储在vendor文件夹中(使用Godep作为帮助程序),它看起来正确,但在本地运行应用程序时出现以下错误:

go-app-builder: Failed parsing input: package "golang.org/x/net/context" is imported from multiple locations: "/Users/erik/go/src/github.com/xyz/abc/vendor/golang.org/x/net/context" and "/Users/erik/go/src/golang.org/x/net/context"

我相信这两个位置应该解析到同一个位置,因为Go应用程序应首先查看该vendor文件夹.有没有办法让Appengine明白两个依赖都是一样的?

Su-*_*ang 9

您的项目目录(app.yaml所在的位置)可能位于GOPATH/src中.它不应该.go-app-builder将把app.yaml文件夹(及其下方)中的所有内容都包含在内,并将GOPATH合并到其中,这意味着现在你有两次了.

解决方案是将app.yaml移出GOPATH/src文件夹.此外,你会发现,goapp test从工作方式不同goapp servegoapp deploy当它涉及到解决依赖关系.

所以这是我一直在使用的解决方案(暂时没有使用golang app引擎),这是我发现的唯一设置,可以正常运行所有goapp命令并govendor正常工作(不确定godep)

/GOPATH
???/appengine
|   ??? app.yaml
|   ??? aeloader.go
???/src
    ??? /MYPROJECT
         ??? main.go
         ??? /handler
         |    ??? handler.go
         ??? /vendor
Run Code Online (Sandbox Code Playgroud)

细节:

file: GOPATH/appengine/aeloader.go (NOTE the init function is necessary, probably a bug though)
package mypackage

import (
    _ "MYPROJECT"
)

func init() {
}
Run Code Online (Sandbox Code Playgroud)

现在运行goapp serve,并goapp deploy../GOPATH/appengine/goapp test ./...来自../GOPATH/src/MYPROJECT

PS我发现全局GOPATH的事情很愚蠢,只需将我的GOPATH设置为当前项目文件夹(在上面的示例中/GOPATH)并将整个内容检查到版本控制中.


Asd*_*ine 7

我使用Makefile将vendor目录移动到临时目录GOPATH:

TMPGOPATH := $(shell mktemp -d)

deploy:
  mv vendor $(TMPGOPATH)/src
  GOPATH=$(TMPGOPATH) gcloud app deploy
  mv $(TMPGOPATH)/src vendor 
Run Code Online (Sandbox Code Playgroud)

我将其存储Makefile在目录附近的服务根vendor目录中,只需用于make deploy手动部署或从CI部署.

它适用于Glide,Godeps或任何尊重Go供应商规范的工具.

请注意,您确实需要将vendor目录移出构建目录,否则GoAppEngine编译器将尝试构建供应商依赖项,从而可能导致编译错误.

  • 这可能是最好的答案.你可以保持你的项目不是apengine特定的,而不仅仅是创建一个这样的预建步骤,让你的项目符合appengine想要的确切格式 (2认同)

emi*_*der 1

我设法使用 govendor 而不是 Godeps 解决了这个错误。根本原因似乎是 Godeps 未正确解析具有自己的供应商引用的供应商引用。

Su-Au Hwang 提供的答案也是正确的 - 您必须将 app.yaml 与源分开。