登录
首页 >  Golang >  Go问答

无法在 AppEngine 上部署 Go 包

来源:stackoverflow

时间:2024-03-21 16:39:30 230浏览 收藏

部署 Go 包到 AppEngine 时遇到问题,错误提示无法找到模块依赖项。原因可能是由于重构导致共享代码被移动到服务目录之外,导致 AppEngine 无法在构建过程中找到 go.mod 文件。解决方法是: * 每个微服务都需要有自己的 go.mod 文件,并与 app.yaml 位于同一目录。 * 使用 go mod edit 命令告诉编译器在本地查找依赖项。 * 使用 vendoring 将所有依赖项捆绑在与 app.yaml 相同的目录中。

问题内容

我在 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 被统一。

我不清楚的是,当我运行 glcoud 应用程序部署 时,appengine 是否在我的本地计算机上构建 go 二进制文件,或者是否捆绑所有内容并在云构建中运行它。

  1. appengine 部署是如何工作的?
  2. 如何部署 appengine 来查找我的 go.mod 文件?
  3. 如何捆绑依赖项? (如果它在 cloudbuild 上运行,那么它肯定无法访问私有存储库)


解决方案


我为其他遇到同样问题的人提供的解决方案。 尽管文档对此有些含糊不清,但似乎存在一些事实。 docs 说:

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 编译器在本地查找而不是尝试通过互联网获取。
  4. vendoring 用于将所有依赖项捆绑在与 app.yaml 相同的目录中,以便将它们部署到 appengine。

关于本地导入的一些信息

go 似乎首先在依赖项缓存/路径中查找所有内容,然后完全在互联网上查找。 如果我使用 go mod init shared 创建本地包,则其模块名称为“shared”。 要告诉 go 您想要本地导入而不是使用互联网,请调用 go mod edit -replace=shared=../../shared/, 你应该看到你的 go.mod 得到一行像 replace shared => ../../shared 。 如果您正在使用 goland 并且它仍然无法编译,请尝试 file>invalidate caches/restart...

关于供应商的一些信息

go.mod 文件夹中的 go modvendor 将捆绑所有依赖项,包括本地依赖项,以便 appengine 可以部署它们。这也是处理私有存储库的好方法,因此您不需要 git cloud build 访问您的存储库。

要回答您的问题:

appengine 部署如何工作?

  • 您的源文件已上传到 google cloud storage。 cloud build 会构建您的应用并将其部署到 app engine。

如何部署 appengine 来查找我的 go.mod 文件?

  • 将模块的 go.mod 文件放置在与 app.yaml 文件相同的目录中。

依赖项是如何捆绑的?

  • 它确实正在运行 cloud build。 app engine 无法在构建过程中下载您的私有依赖项,因此您必须在部署时将它们包含在您的应用程序代码中。详细信息可以在“指定依赖项”文档页面的 Using private dependencies 段落中找到。

关于文件结构的重构:文件结构需要遵守第Structuring your files段中给出的规定:

  • go-app/:go 1.11 服务的目录。
    • app.yaml:您的服务的配置设置。
    • main.go:您的应用程序代码。

以上就是《无法在 AppEngine 上部署 Go 包》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>