5

我从这里获得了 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没有帮助。我究竟做错了什么?

4

3 回答 3

2

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

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

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

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

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

于 2019-04-19T06:27:47.563 回答
0

根据 App Engine Standard 和 Flex 的文档,两者都支持 Go 1.11 运行时。现在,我们知道 Go 1.11引入了对 Go 模块的实验性支持,保持与 GOPATH 的兼容性。然而,虽然通过文件使用 Go 模块是为 Standard提出go.mod的一种方法,但对于 Flex则根本没有提及。

因此,对于 Flex,要么按照文档中的指示将所有内容都放在 GOPATH 下,要么坚持使用 @shrumm 提供的解决方法。

于 2019-05-14T11:52:58.263 回答
0

为了解决这个问题并更好地控制运行时及其依赖项,我发现使用custom带有提供的 Dockerfile 的运行时效果最好。查看这个github 项目以获取示例设置。

于 2021-11-08T09:59:05.970 回答