使用go.mod灵活部署谷歌应用引擎失败,因为它正在寻找GOPATH中的依赖库

问题描述 投票:2回答:2

我有来自here的helloworld应用程序,并进行了一些修改。

  1. 我已经使用了logrus(将依赖项引入外部库)
  2. 我使用go mod init添加了一个go.mod
  3. 我在GOPATH之外结账了这段代码。

一切都适用于localhost。我能在localhost:8080上看到hello消息。当我尝试进行gcloud app部署时,出现以下错误:

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

go app-engine-flexible go-modules
2个回答
1
投票

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

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

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

将您需要的依赖项复制到$GOPATH/src文件夹中,您应该很高兴。

相关问题,希望这有助于某人。这导致我陷入了一个兔子洞,因为我最近切换到Go模块,并且GAE抱怨一个依赖的错误,这个错误在更新版本中得到修复。我多次更新了依赖项,它在本地测试中运行良好,但我在app deploy上一直遇到同样的错误。最终我意识到发生了什么:在本地运行代码时,从go模块缓存中正确组装依赖项 - 应用程序引擎从Go Path中的“旧”位置获取它。一旦启用Go模块,go get只会更新mod缓存。


0
投票

根据App Engine Standard和Flex的文档,两者都支持Go 1.11运行时。现在,我们知道Go 1.11 introduced对Go模块的实验支持,保持与GOPATH的兼容性。然而,虽然通过go.mod文件使用Go模块是标准的presented方法,但它是用于Flex的not mentioned at all

因此,对于Flex,要么您拥有GOPATH下的所有内容,请遵循文档中的指示,要么坚持使用@shrumm提供的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.