go - AppEngine 部署找不到 Go 包
问题描述
我在 monorepo 中有一个 AppEngine 微服务设置,服务之间有共享代码,所以我已经重构以统一我的 go 模块(它们非常相似)。重构在本地工作,构建并运行,Goland 编译愉快。我的问题是 AppEngine 部署不再起作用,收到错误,例如:
Error message: cmd/main.go:4:2: cannot find package "github.com/gin-gonic/gin" in any of:
/usr/local/go/src/github.com/gin-gonic/gin (from $GOROOT)
/layers/google.go.appengine_gopath/gopath/src/github.com/gin-gonic/gin (from $GOPATH)
cmd/main.go:5:2: cannot find package "mymodulename/customer/internal/mypkg" in any of:
/usr/local/go/src/mymodulename/customer/internal/cauth (from $GOROOT)
/layers/google.go.appengine_gopath/gopath/src/mymodulename/customer/internal/mypkg (from $GOPATH)
原始结构
> svc1
> cmd/main.go
> internal
>utils/shared.go
>mypkg
> go.mod
> app.yaml
> svc2
> cmd/main.go
> internal
>utils/shared.go
>mypkg
> go.mod
> app.yaml
重构后
> svc1
> cmd/main.go
> internal
>mypkg
> app.yaml
> svc2
> cmd/main.go
> internal
>mypkg
> app.yaml
> internal (common shared stuff)
> utils/shared.go
go.mod
重点是 utils/shared.go 移到了各个服务目录之外,统一了 go.mod。
我不清楚的是 AppEngine 是否在我运行时在我的本地计算机上构建 go 二进制文件,glcoud app deploy
或者是否捆绑所有内容并在云构建中运行它。
- AppEngine 部署如何工作?
- 如何让 AppEngine 部署找到我的 go.mod 文件?
- 依赖项是如何捆绑的?(如果它在 CloudBuild 上运行,它肯定无权访问私有存储库)
解决方案
回答您的问题:
AppEngine 部署如何工作?
- 您的源文件已上传到 Google Cloud Storage。Cloud Build 构建您的应用并将其部署到 App Engine。
如何让 AppEngine 部署找到我的 go.mod 文件?
- 您将模块的 go.mod 文件放在与 app.yaml 文件相同的目录中。
依赖项是如何捆绑的?
- 它确实在运行 Cloud Build。App Engine 无法在构建过程中下载您的私有依赖项,因此您必须在部署时将它们包含在您的应用程序代码中。详细信息可在“指定依赖项”文档页面的使用私有依赖项段落中找到。
关于文件结构的重构:文件结构需要遵守结构化文件段落中给出的规定:
- go-app/:Go 1.11 服务的目录。
- app.yaml:你的服务的配置设置。
- main.go:您的应用程序代码。
推荐阅读
- javascript - 使用 Ajax 将 Javascript 数组发送到 PHP(无法从 PHP 中回显数组)
- python - 本地模块导入不起作用 - 未解决的参考
- laravel - 用 Blade 组件替换 Vue 组件,完全可以吗?
- php - 增加 Woocommerce 属性值长度
- xamarin - ContentView 作为具有自己 ViewModel 的控件
- scala - Scala递归头尾模式匹配
- jenkins - 詹金斯:无论结果如何,在作业结束时执行shell脚本
- mapbox - 显示集群中的累积属性
- javascript - 等待所有 url 完成写入
- glsl - 是否可以做一个 RGBA 来浮动和返回往返并读取 WebGL GLSL ES 1.0 中的像素?