首页 > 解决方案 > 使用 go.mod 灵活部署到谷歌应用引擎失败,因为它正在 GOPATH 中寻找依赖库

问题描述

我从这里获得了 helloworld 应用程序,并进行了一些修改。

  1. 我使用过 logrus(引入对外部库的依赖)
  2. 我使用 go mod init 添加了一个 go.mod
  3. 我在我的 GOPATH 之外签出了这段代码。

一切都在本地主机上运行。我可以在 localhost:8080 上看到 hello 消息。当我尝试执行 gcloud app deploy 时,出现以下错误:

staging for go1.11
Staging Flex app: failed analyzing /home/.../code/app-engine-gomod: cannot find package "github.com/sirupsen/logrus" in any of:
    ($GOROOT not set)
    /home/.../go/src/github.com/sirupsen/logrus (from $GOPATH)
GOPATH: /home/.../go

我试过有没有go mod vendor没有帮助。我究竟做错了什么?

标签: goapp-engine-flexiblego-modules

解决方案


我有一个解决方法给你——它不漂亮。我不知道为什么应用程序引擎不尝试使用 go 模块解决依赖关系,而是只在 $GOPATH 中查找。

我的解决方法是将 go modules 缓存中的相应文件夹复制回 Go Path。我很想知道是否有人有更好的解决方案。

你的模组缓存应该在$GOPATH/pkg/mod

将您需要的依赖项复制到您的$GOPATH/src文件夹中,您应该一切顺利。

相关问题,希望这对某人有所帮助。这让我陷入了困境,因为我最近切换到 Go 模块,而 GAE 抱怨依赖项中的一个错误,该错误已在其较新版本中得到修复。我多次更新了依赖项,它在本地测试中运行良好,但在app deploy. 最终我意识到发生了什么:在本地运行代码时,Go 从 go 模块缓存中正确组装了依赖项 - 应用程序引擎从 Go 路径的“旧”位置获取它。启用 Go 模块go get后,只会更新 mod 缓存。


推荐阅读