4

我有一个谷歌云功能,它是存储库中的一个子目录。它使用设置菜单中的“带有源代码的目录”选项。我在部署时不断收到此错误:

Deployment failure:
Build failed: go: parsing /utils/pubsub/go.mod: open /utils/pubsub/go.mod: no such file or directory
go: error loading module requirements

我假设 GCF 不会将整个目录上传到实例,而是只上传文件夹?这破坏了 Go 模块的替换功能。有什么我做错了吗?

回购链接:https ://github.com/FreekingDean/jeffbotgo/tree/5d735cc/slackevent

4

2 回答 2

4

我在 Google 和这个产品上工作。

gcloud仅上传您运行的目录。除了压缩当前目录并上传之外,没有暂存步骤。

值得注意的是,与供应商相比,建造者更喜欢模块。如果有go.mod,将使用模块。当你上传你的函数时,它只包括你的函数在根目录,而不是任何上一级的目录。因此,当有一个go.mod并且您有一个指向上一级的替换指令时,它将不起作用。

目前使用此布局的解决方案是供应商而不是上传go.mod/go.sum文件。使用时gcloud,您可以创建一个.gcloudignore文件来为您执行此操作。有关更多详细信息,请参阅https://cloud.google.com/functions/docs/concepts/go-runtime#specifying_dependencies。或者,修改您的项目以在子目录中包含任何必要的帮助程序包。

于 2019-01-29T22:30:13.247 回答
1

我今天有同样的问题。

在第 8 次阅读文档时,我遇到了“供应商目录”标题下方的警告框。

警告:如果您的项目在项目的根目录下同时具有 go.mod 文件和供应商目录,则在部署期间将忽略供应商目录。您必须使用 .gcloudignore 文件来忽略 go.mod 文件,以确保在部署期间使用您的供应商目录。

所以基本上一旦我添加了一个带有 go.mod 的 .gcloudignore 文件(也会添加 go.sum),一切正常。所以我猜如果你有一个 go.mod 文件,云函数将尝试获取依赖项,而不是使用上传到供应商文件夹中的依赖项。我只是猜测这里很难。

于 2019-01-25T13:04:07.567 回答