为了账号安全,请及时绑定邮箱和手机立即绑定

AppEngine 部署找不到 Go 包

AppEngine 部署找不到 Go 包

Go
沧海一幻觉 2022-07-04 16:38:14
我在 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 上运行,它肯定无权访问私有存储库)
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我已经为遇到同样问题的其他人提供了解决方案。一些事实似乎存在,尽管文档对此有些模棱两可。文档说:

Create your module's go.mod file in the same directory as your app.yaml file. App Engine searches the current directory, then successive parent directories until it finds a go.mod file.

但这似乎不是真的,事实上,app.yaml 文件上方似乎根本没有复制任何内容。

所以解决方案需要:

  1. 每个微服务都有自己的 go.mod 文件。

  2. 该 go.mod 文件与 app.yaml 位于同一目录中

  3. go mod edit用于告诉 Go 编译器在本地查找,而不是尝试通过 Internet 获取。

  4. 供应商用于将所有依赖项捆绑在与 app.yaml 相同的目录中,以便将它们部署到 AppEngine。

关于本地进口的一点

Go 似乎首先在依赖项缓存/路径中查找所有内容,然后完全在 Internet 上查找。如果我使用创建本地包go mod init shared,则其模块名称为“共享”。要告诉 Go 你想在本地导入而不是使用互联网,调用go mod edit -replace=shared=../../shared/,你应该看到你的 go.mod 得到一个类似的行replace shared => ../../shared。如果您使用的是 Goland,但仍然无法编译,请尝试File>Invalidate Caches/Restart...

关于供应商的一些信息

go mod vendor在您的 go.mod 文件夹中将捆绑所有依赖项,包括本地依赖项,以便它们可以由 AppEngine 部署。这也是处理私有存储库的好方法,因此您无需通过 git Cloud Build 访问您的存储库。


查看完整回答
反对 回复 2022-07-04
?
哔哔one

TA贡献1854条经验 获得超8个赞

回答您的问题:

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:您的应用程序代码。



查看完整回答
反对 回复 2022-07-04
  • 2 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信