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明白两个依赖都是一样的?
您的项目目录(app.yaml所在的位置)可能位于GOPATH/src中.它不应该.go-app-builder将把app.yaml文件夹(及其下方)中的所有内容都包含在内,并将GOPATH合并到其中,这意味着现在你有两次了.
解决方案是将app.yaml移出GOPATH/src文件夹.此外,你会发现,goapp test从工作方式不同goapp serve而goapp 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)并将整个内容检查到版本控制中.
我使用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编译器将尝试构建供应商依赖项,从而可能导致编译错误.
我设法使用 govendor 而不是 Godeps 解决了这个错误。根本原因似乎是 Godeps 未正确解析具有自己的供应商引用的供应商引用。
Su-Au Hwang 提供的答案也是正确的 - 您必须将 app.yaml 与源分开。
| 归档时间: |
|
| 查看次数: |
3140 次 |
| 最近记录: |