Для решения первой ошибки
ОШИБКА: (gcloud.functions.deploy) OperationError: code = 3, message = Ошибка сборки: подробности ошибки сборки недоступны
Я должен был понять, что облачные функции могут быть развернуты только (?) Из каталога root проекта, но моя облачная функция была в подпакете function1/
Чтобы решить эту проблему, я создал функцию прокси в новом файле functions.go
в root проекта.
// 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) OperationError: code = 3, message = Ошибка сборки: go: загрузка github.com/GoogleCloudPlatform/functions-framework-go v0.3.0
Я проверил go.mod
и go.sum
, но они не содержали ссылок на functions-framework-go
. Это было то, что GCP скачивал «для меня», вместо того, чтобы просто сказать, что я делаю неправильно.
Так было до тех пор, пока я не прочитал описание GoogleCloudPlatform / functions-framework- go что я понял, что это, вероятно, связано с основной функцией моего кода.
После тестирования нескольких вещей я пришел к выводу, что:
- Proxy Function1 не должен находиться в пакете с именем
main
- Чтобы сохранить исполняемый файл 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 допускает только один пакет на папку.
После этих последних изменяет успешно развернутые функции.
Этот ответ помог мне с структурированием подпакетов, go подарил ему немного любви: Как я могу использовать подпакеты с Go в облачных функциях Google?
В качестве последней заметки я хотел бы немного выделить документацию по облачным функциям GCP, в которой отсутствуют некоторые сложные примеры и которая не дает четкого представления о наименовании пакетов, размещении функций и т. Д. по крайней мере для Go проектов.