我想用Go语言编写的deploy a Google Cloud Function,其代码结构包含一个子目录,如下所示:
function
├── module1
│ ├── go.mod
│ └── module1.go
├── go.mod
└── entrypoint.go
但是当我部署该功能时,请使用GCP控制台或gcloud
命令:
# from function/ directory
gcloud functions deploy myfunction --runtime go111 [...]
仅上传go.mod
和entrypoint.go
(我在GCP控制台中的功能详细信息的源选项卡上选中了)。因此,该功能无法部署,因为显然entrypoint.go
使用了module1/module1.go
中的方法。
如果源是Google Cloud Storage上的.zip
(包含多个目录),也会发生同样的情况:
gcloud functions deploy myfunction \
--runtime go111 \
--source gs://${BUCKET}/function.zip [...]
是否可以使用带有子目录的代码结构来部署功能?我不知道其他运行时(Python,NodeJS)是否也会发生同样的情况,或者该问题是否特定于Go。
我尝试遵循本指南:https://cloud.google.com/functions/docs/writing/#functions-writing-file-structuring-go(第二点:项目根目录下的一个程序包,该程序包从子程序包导入代码并导出一个或多个函数),根据评论中的建议,但没有成功。这是我使用的结构(在本地工作):
.
├── function.go
├── go.mod
└── shared
├── go.mod
└── shared.go
go.mod
module testcloudfunction
require testcloudfunction/shared v0.0.0
replace testcloudfunction/shared => ./shared
function.go
package function
import (
"fmt"
"testcloudfunction/shared"
)
func HelloWorld(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, shared.Hello())
}
共享/go.mod
module testcloudfunction/shared
shared / shared.go
package shared
func Hello() string {
return "Hello World!"
}
答案 0 :(得分:1)
好。进行一些更改后,它对我有用。
我正在使用 GOPATH
,所以以GO111MODULE=on
为前缀。如果您不在GOPATH
之外,我认为您可以删除GO111MODULE=on
环境设置。
仅从目录和.go
文件开始(没有.mod
文件)。
我的路径是github.com/DazWilkin/cloudfuncs
。
IIUC,您将需要-最低限度地-为模块路径加上example.com
前缀。
package function
import (
"fmt"
"net/http"
"github.com/DazWilkin/cloudfuncs/shared"
)
func HelloFreddie(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, shared.Hello())
}
然后,从我的cloudfuncs
目录中:
GO111MODULE=on go mod init github.com/DazWilkin/test
产生go.mod
:
module github.com/DazWilkin/cloudfuncs
go 1.11
go.mod
中没有 .../cloudfuncs/shared
个文件。
然后我使用以下方法进行部署:
gcloud functions deploy HelloFreddie \
--region=us-central1 \
--entry-point=HelloFreddie \
--runtime=go111 \
--source=$PWD/cloudfuncs \
--project=${PROJECT} \
--trigger-http
您可以在此处查看结果: https://us-central1-dazwilkin-190225-54842789.cloudfunctions.net/HelloFreddie