naf*_*fmo 5 google-app-engine go gcloud
我正在编译一个GO应用程序,我想在Google云端平台上传和运行.我正在导入appengine/datastore包,并且遇到了包装的问题.由于我想提供稳定的构建,我希望在源代码树中拥有尽可能多的依赖项,但是当我供应商时,appengine/datastore我遇到了运行问题gcloud app deploy:
OperationError:错误响应:[9]部署包含无法编译的文件:编译失败:2017/09/19 01:07:31 go-app-builder:解析输入失败:包"vendor/google.golang.org/appengine/search"无法导入内部包"google.golang.org/appengine/internal/search"
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
2017/09/19 01:07:31 go-app-builder: Failed parsing input: package "vendor/google.golang.org/appengine/search" cannot import internal package "google.golang.org/appengine/internal/search"
Run Code Online (Sandbox Code Playgroud)
我可以正常运行dev_appserver.py脚本,应用程序在本地运行顺利,并go test成功编译并运行所有模块测试.
如果我尝试删除任何appengine包的销售,而是使用go get在版本控件之外安装它们,dev_appserver.py不再运行,抱怨重复的包:
rm -rf ../vendor/google.golang.org/appengine
go get google.golang.org/appengine
dev_appserver.py app.yaml
[....]
2017/09/19 10:20:10 go-app-builder: Failed parsing input: package "golang.org/x/net/context" is imported from multiple locations: "/home/peter/src/myproject/go/src/myproject/vendor/golang.org/x/net/context" and "/home/peter/src/myproject/go/src/golang.org/x/net/context"
Run Code Online (Sandbox Code Playgroud)
而gcloud app deploy反过来抱怨根本找不到包裹:
[...]
File upload done.
Updating service [default]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
Compile failed:
2017/09/19 01:22:13 go-app-builder: build timing: 7×compile (1.749s total), 0×link (0s total)
2017/09/19 01:22:13 go-app-builder: failed running compile: exit status 2
myproject/vendor/golang.org/x/text/unicode/norm/normalize.go:15: can't find import: "golang.org/x/text/transform"
$ find .. -name transform
../vendor/golang.org/x/text/transform
Run Code Online (Sandbox Code Playgroud)
编辑:解决方法:我发现我可以gcloud通过将销售目录(github.com和golang.org)符号链接到应用程序目录(ln -s ../vendor/* .)并手动下载appengine包(go get google.golang.org/appengine)来编译它.但是,我需要删除能够运行的符号链接dev_appserver.py,因此这不是最佳选择.
发生这种情况的原因是 App Engine 构建 Go 应用程序的方式不同。
由于 App Engine 标准环境安全沙箱和容器模型,他们禁止 Go 代码导入任何可能会干扰其系统的包,例如unsafe。google.golang.org/appengine/internal/whatever出于同样的原因,它们还阻止直接导入内部 appengine 包 ( )。
对于此项目,您已在本地供应了依赖项。不过,对于应用程序引擎应用程序构建器来说,这看起来与您刚刚在应用程序中创建另一个子包并将依赖项放入其中没有什么不同。appengine/search它的功能与您刚刚复制并直接粘贴到项目中的效果相同。
因为appengine/search导入其相应的内部包 ,appengine/internal/search并且 Go 应用程序构建器并没有真正区分应用程序代码中的内容和目录中的内容vendor,因此构建失败。对于 App Engine,看起来您导入了appengine/internal/search,这是安全模型所禁止的。它不知道如何appengine/internal/search使用,因为它不控制 中的内容vendor,因此为了保持沙箱的安全,它不允许您导入它。
基本上,这个问题的解决方案是不提供依赖项。
appengine/whatever如果您从 中删除所有包vendor,那么 App Engine 构建器将在 Google 的构建服务器上而不是在您的项目中查找它们。应用程序生成器信任其自己的appengine库的本地副本不会出现异常行为,因此允许它们导入appengine/whatever/internal包。
(顺便说一句,如果您还没有这样做,请确保gcloud所有相关组件都是最新的。这有时可以解决棘手的依赖问题)
| 归档时间: |
|
| 查看次数: |
1078 次 |
| 最近记录: |