我知道这个话题已经被引用了几次。不幸的是,我仍然无法为我的用例找到可行的解决方案。
我似乎无法在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上成功部署?一整天都在拉我的头发。
答案 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