当前位置: 首页 > 知识库问答 >
问题:

如何在子包中部署Go Google云功能?

鲁弘厚
2023-03-14

我有以下设置,我试图创建一个多功能GCP云功能项目,但我未能部署任何功能,因为一个“通用”错误,这一点都不太有帮助。

我的项目结构是这样的,为了保持简单,我只写了函数1,但是有一个函数2,等等。

使用Cloud Functionsgo 1.13支持和go mod支持

项目结构:

.
├── go.mod
├── function1
│   └── function1.go
├── common
│   └── common.go // Contains struct GCSEvent see https://cloud.google.com/functions/docs/calling/storage#functions-calling-storage-go
└── main.go

代码片段:

// go.mod
module github.com/me/myproject

go 1.13
// function1/function1.go
package function1

import (
    "github.com/me/myproject/common"
    // Other imports
)

func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    // Do Stuff
}
// common/common.go
package common

// See https://cloud.google.com/functions/docs/calling/storage#functions-calling-storage-go
type GCSEvent struct {
    // ...
}
// main.go
package main

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
    // Other imports
)

func main() {
    // Call Function1 from the command line for manual testing
    event := common.GCSEvent{/*...*/}
    function1.Function1(context.Background(), event)
}

function1。转到referencescommon。go使用GCP应该能够解析的go模块导入语法。

要部署我称之为gCloud的函数,请从项目的根目录:

gcloud functions deploy Function1 --runtime=go113 <more arguments...>

我收到的错误是

错误:(gcloud.functions.deploy)操作错误:代码=3,消息=生成失败:生成错误详细信息不可用

我提到的一点帮助都没有。

共有1个答案

越鸿才
2023-03-14

为了解决第一个错误

错误:(gcloud.functions.deploy)操作错误:代码=3,消息=生成失败:生成错误详细信息不可用

为了解决这个问题,我在一个新文件functions中创建了一个代理函数。进入项目的根目录。

// functions.go DO NOT USE SEE BELOW
// functions.go DO NOT USE SEE BELOW
// functions.go DO NOT USE SEE BELOW
package main // Please note that this package is _wrong_ which will become clear further down in the answer

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
)

// Proxy function to the real Function1 in package function1
func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    return backupdelegate.Function1(ctx, gcsEvent)
}

部署这个似乎是成功的,直到我得到了一个新的错误消息,有点不那么令人困惑,但仍然令人困惑:

错误:(gcloud.functions.deploy)操作错误:code=3,message=Build失败:go:下载github。com/GoogleCloudPlatform/functions framework go v0。3

我检查了我的go。mod开始。sum,但它们不包含对函数的任何引用。这是GCP“为我”下载的东西,而不是仅仅告诉我我做错了什么。

直到我阅读了Google CloudPlatform/functions framework go的描述,我才意识到它可能与我代码的主要功能有关。

在测试了一些东西后,我得出结论:

  • 代理功能1不得位于名为main
  • 保持主要的。go文件可执行文件我不得不将其移动到另一个目录
.
├── go.mod
├── function1
│   └── function1.go
├── common
│   └── common.go
├── testing
│   └── main.go
└── functions.go
// functions.go
// THIS IS THE CORRECT VERSION OF THE PROXY FUNCTION(S)
package functions

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
)

// Proxy function to the real Function1 in package function1
func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    return backupdelegate.Function1(ctx, gcsEvent)
}

正如你从项目结构中看到的,我不得不将main.go移动到一个子文件夹中,因为go只允许每个文件夹一个包。

在上一次更改之后,成功部署了函数。

这个答案帮助我构建了子包,去给它一些爱:我如何在谷歌云功能上使用子包?

最后,我想对GCP Cloud Functions文档进行一些修改,该文档缺少一些高级示例,并且没有非常清楚地说明包命名、函数放置等内容,至少对于Go项目是如此。

 类似资料:
  • 我正在试验Firebase的云功能,并在functions-samples repo中部署了一个示例,并使用将其链接到一个现有项目。 由于我只是在玩,这些文件没有添加到我的版本控制中,我不再有权访问执行此操作的机器。我想在这个函数的基础上构建或创建新的函数,但我不确定如何1)修改和重新部署原来的函数,或者2)取消-并重新开始。我在我的firebase控制台中看到这个函数,但没有“delete”或“

  • 我让我的函数在本地工作,然后当我部署它们时,会出现如下错误: 结果:失败异常:ModuleNotFoundError:没有名为“azure.cosmosdb”的模块。故障排除指南:https://aka.ms/functions-modulenotfound 堆栈:文件“/azure functions host/workers/python/3.8/LINUX/X64/azure\u funct

  • 我尝试使用my console在谷歌云平台上部署云功能。我使用的命令是, 但我得到了这个错误, 错误:(gcloud.functions.deploy)操作错误:代码=3,消息=Build failed:无法解析存储源:googleapi:错误404:未找到,未找到 我试着在谷歌上搜索,但似乎以前没有人遇到过这个错误消息。我也尝试过改变项目,部署效果很好。 如果有人知道是什么导致了这个错误,以及我

  • 当我运行gcloud函数deploy gcp_test——trigger resource xxx-test-123——trigger event google时。存储对象我发现语法错误。 错误:(gcloud.functions.deploy)操作错误:code=3,message=Function load错误:文件索引中的代码。无法加载js。你的代码中有语法错误吗?详细堆栈跟踪:/user\

  • 我在谷歌云上部署了Kafka,我把监听器改为 我可以拿到经纪人的话题。然而,当我试图生成消息给Kafka经纪人时 sudo./bin/kafka-console-producer.sh--broker-list[外部IP地址]:9092--topic test 出现以下错误: 向主题测试发送消息时出现错误,键:null,值:5字节,错误:(org.apache.kafka.clients.prod