我们也遇到了这个问题。 @TylerBui-Palsulich (https://stackoverflow.com/a/54255486/2307346) 提供的 go.mod 方法不起作用,因为我们还必须从私有存储库下载依赖项。
来自 Google 文档:
如果您的函数的依赖项托管在不可公开访问的存储库中,则必须在部署函数之前使用供应商目录来获取您的依赖项
(https://cloud.google.com/functions/docs/writing/specifying-dependencies-go#using_a_vendor_directory)
给定以下包结构:
cloudfunctions.go
sharedpackage
-> shared.go
go.mod
在我们的go.mod 文件中,我们定义了以下命名空间:module some/namespace
cloudfunctions.go 文件具有以下包定义和导入
package foobar
import (
"bitbucket.org/some/private/dependency"
"some/namespace/sharedpackage"
)
由于私有依赖,我们不能使用 go.mod 文件。相反,我们提供了一个vendor 目录。
警告:如果您的项目根目录下同时有 go.mod 文件和供应商目录,则在云中构建函数时,供应商目录的内容将被忽略。为确保使用您的供应商目录,您必须在部署之前从项目的源代码中排除 go.mod 文件。如果您使用的是 gcloud 命令行工具,则可以通过使用 .gcloudignore 确保 go.mod 不上传。
(https://cloud.google.com/functions/docs/writing/specifying-dependencies-go#using_a_vendor_directory)
gcloud deploy 如果找到 go.mod 将忽略供应商目录,我们使用具有以下内容的 .gloudignore 文件修复此问题:
go.mod
go.sum
最后我们有以下文件结构:
cloudfunctions.go
sharedpackage
-> shared.go
go.mod
vendor
.gcloudignore
最后一步,修复找不到包错误
在运行部署步骤时,您仍然会遇到类似以下的错误:
(gcloud.functions.deploy) OperationError: code=3, message=Build failed: /tmp/sgb/gopath/src/serverlessapp/vendor/some/namespace/cloud_functions.go:5:2: cannot find package "some/namespace/sharedpackage" in any of:...
这是因为包含模块名称的go.mod 文件被忽略了。现在 Go 编译器不再知道 some/namespace/sharedpackage 指的是本地的 sharedpackage 目录。
我们设法通过更改模块名称以匹配包名称来使其工作:
将go.mod 中的模块名称更改为module foobar
将cloudfunctions.go 中的导入更改为:"foobar/sharedpackage":
package foobar
import (
"bitbucket.org/some/private/dependency"
"foobar/sharedpackage"
)
现在 Go 编译器能够检测到 foobar/sharedpackage 是 foobar 包的子包。