尝试使用 go 模块在 Go 1.11 中部署 Google 云函数时出错

Error when trying to deploy Google cloud function in Go 1.11 using go modules

我在尝试使用 Go mod 规则在 Go 1.11 中部署 Google 云函数时遇到问题。我的 GOPATH:

中有以下代码结构
└── example
    ├── models
    │   ├── go.mod
    │   └── models.go
    └── load
        ├── fn.go
        ├── go.mod
        ├── go.sum
        └── vendor
            └── ....

load/go.mod 如下所示:

module github.com/example/load

require (
    github.com/example/models v0.0.0
)

replace github.com/example/models => ../models

当我尝试使用命令部署函数时

gcloud functions deploy load-data --entry-point GCSNewFileTrigger --runtime go111 --trigger-resource new_data --trigger-event google.storage.object.finalize

我收到以下错误:

Deploying function (may take a while - up to 2 minutes)...failed.                                                                                                                                                                     
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: go: parsing /models/go.mod: open /models/go.mod: no such file or directory
go: error loading module requirements

命令 go mod vendorgo mod verify 运行 在本地成功,我可以在 load[=20 的供应商文件夹中看到我的本地包 models =]

建造者比供应商更喜欢模块。如果有 go.mod,将使用模块。当您上传您的函数时,它仅包含您的函数位于根目录的目录,而不包含任何上一级目录。所以,当有一个 go.mod 并且你有一个指向上一级的替换指令时,它将不起作用。

解决方案是供应商而不是上传 go.mod/go.sum 文件。使用 gcloud 时,您可以创建一个 .gcloudignore 文件来为您执行此操作。有关详细信息,请参阅 https://cloud.google.com/functions/docs/concepts/go-runtime#specifying_dependencies

免责声明:我在 Google 工作并开发此产品。