Как вызвать функцию Go Cloud из другой функции Go Cloud в GCP - PullRequest
0 голосов
/ 06 ноября 2019

Цель: Я хочу повторно использовать многие функции Go из двух функций Go с HTTP-триггерами.

Что я пробовал и шаги по воспроизведению проблемы:

  1. В GCP создайте новую облачную функцию Go 1.11, триггер HTTP
  2. Назовите ее: MyReusableHelloWorld
  3. В function.go, вставьте:
package Potatoes

import (   
    "net/http"
)


// Potatoes return potatoes
func Potatoes(http.ResponseWriter, *http.Request) {

}
В go.mod, вставьте это: module example.com/foo В функцию для выполнения вставьте это: Potatoes Нажмите на развертывание. Это работает. Создайте еще одну безсерверную функцию Go в GCP В функции. иди, вставь это:
// Package p contains an HTTP Cloud Function.
package p

import (
    "encoding/json"
    "fmt"
    "html"
    "net/http"
    "example.com/foo/Potatoes"
)

// HelloWorld prints the JSON encoded "message" field in the body
// of the request or "Hello, World!" if there isn't one.
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    var d struct {
        Message string `json:"message"`
    }
    if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
        fmt.Fprint(w, "error here!")
        return
    }
    if d.Message == "" {
        fmt.Fprint(w, "oh boy Hello World!")
        return
    }
    fmt.Fprint(w, html.EscapeString(d.Message))
}
В go.mod, вставьте это: module example.com/foo В функцию для выполнения вставьте это: HelloWorld Нажмите на развертывание. Не работает. У вас есть ошибка: unknown import path "example.com/foo/Potatoes": cannot find module providing package example.com/foo/Potatoes

Я также перепробовал все виды комбинаций для модуля / пакетов для импорта,Я пробовал без example.com/ part.

Другая небольшая проблема: Все функции, которые я хочу использовать, могут находиться в одном файле и на самом деле не требуют триггера, ноне похоже, что без триггера невозможно.

Связанные вопросы и документация, с которыми я не смог достичь своей цели:

  1. Какя могу использовать подпакеты с Go в облачных функциях Google?
  2. https://github.com/golang/go/wiki/Modules, раздел go.mod

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019

Вы смешиваете вещи: управление пакетами и развертывание функций.

Когда вы развертываете облачную функцию, если вы хотите (повторно) использовать ее, вам нужно вызвать if с пакетом http.

Если вы создаете пакет, который хотите включить в свой исходный код, вы должны полагаться на менеджер пакетов. С Go, Git-репозиторий, как и Github, является лучшим способом достижения этого (не забудьте выпустить релиз и назвать его, как и ожидалось в моде Go: vX.YZ)

Здесь ваш код может 'я не могу работать без дополнительной разработки и публикации / управления пакетами.

Я добиваюсь того же, но с помощью Dockerfile, и я сожалею о своем коде в Cloud Run (я рекомендую вас, если вы не ориентированы на события и ориентированы только на HTTP)Я написал сравнение на Medium )

  • Root
    • go.mod
    • pkg / foo.go
    • pkg / go.mod
    • service / Helloworld.go
    • service / go.mod

В моем helloworld.go я могуповторно использовать пакет foo. Для этого я делаю это в моем service/go.mod файле

module service/helloworld

go 1.12

require pkg/foo v0.0.0

replace pkg/foo v0.0.0 => ../pkg

Затем, когда вы строите свой контейнер, вы запускаете go build service/Helloworld.go из корневого каталога.

0 голосов
/ 06 ноября 2019

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

Итак, если вы хотите развернуть функцию с зависимостью, которую нельзя загрузить изменеджер пакетов, вам нужно собрать код, например здесь и развернуть его с помощью CLI

0 голосов
/ 06 ноября 2019

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

https://cloud.google.com/functions/docs/writing/#structuring_source_code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...