首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AppEngine部署找不到Go包

AppEngine部署找不到Go包
EN

Stack Overflow用户
提问于 2020-09-29 12:35:20
回答 2查看 884关注 0票数 2

我在monorepo中有一个AppEngine微服务设置,服务之间有共享代码,所以我重新分解以统一我的go模块(它们非常相似)。重构在本地工作,构建和运行,Goland愉快地编译。我的问题是,AppEngine部署不再工作,接收诸如:

代码语言:javascript
运行
复制
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)

原始结构

代码语言:javascript
运行
复制
    > 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

重构后的

代码语言:javascript
运行
复制
    > 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是在运行glcoud app deploy时在本地机器上构建go二进制文件,还是在云构建中打包并运行它。

  1. AppEngine如何部署?
  2. 如何使AppEngine部署找到我的go.mod文件?
  3. 依赖关系是如何捆绑的?(如果它在CloudBuild上运行,它肯定无法访问私有的repos)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-30 00:50:46

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

代码语言:javascript
运行
复制
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. dependencies用于将所有依赖项绑定到与app.yaml相同的目录中,以便将它们部署到AppEngine中。

关于本地进口的一点

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

关于销售的一点

您的go mod vendor文件夹中的go.mod将绑定所有依赖项,包括本地依赖项,以便由AppEngine部署它们。这也是一个很好的方式来处理私人回购,所以你不需要git云构建访问你的回购。

票数 1
EN

Stack Overflow用户

发布于 2020-09-29 20:11:20

回答你的问题:

AppEngine如何部署?

  • 您的源文件被上传到。云构建构建您的应用程序并将其部署到app。

如何使AppEngine部署找到我的go.mod文件?

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

依赖关系是如何捆绑的?

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

关于文件结构的重构:文件结构需要尊重构造您的文件段落中给出的处方:

  • Go /:go1.11服务目录。
    • app.yaml:您服务的配置设置。
    • main.go:您的应用程序代码。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64119757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档