При развертывании функций Gcloud не обнаруживаются файлы шаблонов Golang - PullRequest
0 голосов
/ 16 июня 2020

Я написал код Golang, который работает при тестировании на моем локальном компьютере. Когда я развертываю это как функцию Google Cloud, он терпит неудачу, потому что не может открыть файл шаблона. Строка кода с ошибкой:

    t, err := template.New("list.gohtml").ParseFiles("list.gohtml")

После этого вызова err устанавливается в open list.gohtml: no such file or directory

Файл находится в том же каталоге, что и исходный файл go, и не указан в .gcloudignore или .gitignore. В документации по функциям gcloud говорится, что все файлы в каталоге будут загружены, если они не указаны в одном из этих игнорируемых файлов, и если я запустил gcloud meta list-files-for-upload, то файл list.gohtml будет включен в отображаемый список.

Есть ли какой-нибудь макет папки magi c, чтобы это работало, или опция для команды gcloud functions deploy?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Основываясь на ответе @ DazWilkin, теперь я вызываю функцию, указанную ниже, в начале функции обслуживания.

Вместо того, чтобы жестко указывать путь в именах файлов шаблона (что может привести к сбою при локальном тестировании) это просто проверяет наличие каталога исходных файлов Gcloud под текущим каталогом и, если он есть, делает его рабочим каталогом, поэтому разрешение файлов теперь будет происходить точно так же, как при локальном тестировании.

import "os"

const gcloudFuncSourceDir = "serverless_function_source_code"

func fixDir() {
    fileInfo, err := os.Stat(gcloudFuncSourceDir)
    if err == nil && fileInfo.IsDir() {
        _ = os.Chdir(gcloudFuncSourceDir)
    }
}
1 голос
/ 16 июня 2020

Я создал функцию, которая перечисляет загруженные файлы:

func L(w http.ResponseWriter, r *http.Request) {
    var files []string

    err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
        files = append(files, path)
        return nil
    })
    if err != nil {
        panic(err)
    }
    for _, file := range files {
        fmt.Fprintln(w, file)
    }
}

Она выводит:

.
go.mod
go.sum
main.go
serverless_function_source_code
serverless_function_source_code/f.go
serverless_function_source_code/go.mod
serverless_function_source_code/test.tmpl

Переписывание функции с использованием шаблона:

tmpl, err := template.New("test.tmpl").ParseFiles("serverless_function_source_code/test.tmpl")

Работает!

Однако это недокументировано и является хакерским приемом: - (

Альтернативой является встраивание шаблонов в виде строк в файлы Golang.

Я рекомендую отправить запрос функции в Google Issue Tracker для Cloud Functions

...