Разверните Google Cloud Function, если исходный код содержит несколько уровней / каталогов - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу развернуть облачную функцию Google , написанную на Go, со структурой кода, содержащей подкаталог, например:

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.

То же самое происходит, если источником является .zip (содержащий несколько каталогов) в Google Cloud Storage:

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 (2-й пункт: Пакет в корне вашего проекта, который импортирует код из подпакета и экспортирует одну или несколько функций ), как предлагается в комментариях, но безуспешно.Вот структура, которую я использовал (работает локально):

.
├── 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())
}
shared / go.mod
module testcloudfunction/shared
shared / shared.go
package shared

func Hello() string {
    return "Hello World!"
}

1 Ответ

0 голосов
/ 25 февраля 2019

OK.Он работает для меня с некоторыми изменениями.

Я использую 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

В .../cloudfuncs/shared.

есть нет go.mod файла.Затем я развертываю с помощью:

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

...