Objectif: je souhaite réutiliser de nombreuses fonctions Go de deux fonctions Go avec des déclencheurs HTTP.
Ce que j'ai essayé et les étapes pour reproduire le problème: p>
MyReusableHelloWorld
function.go
, collez ceci: // 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
, collez ceci: module example.com/foo
Potatoes
package Potatoes import ( "net/http" ) // Potatoes return potatoes func Potatoes(http.ResponseWriter, *http.Request) { }
go.mod
, collez ceci: module example.com/foo
HelloWorld
chemin d'importation inconnu "example.com/foo/Potatoes": impossible de trouver le module fournissant le package example.com/ foo / Pommes de terre
J'ai également essayé toutes sortes de combinaisons pour le module / les packages à importer. J'ai essayé sans la partie example.com/.
Autre petit problème: Les fonctions que je souhaite réutiliser peuvent toutes être dans le même fichier et n'ont pas vraiment besoin de déclencheur, mais il ne semble pas que le fait de n'avoir aucun déclencheur soit possible.
Questions et documentation connexes je n'ai pas pu atteindre mon objectif:
3 Réponses :
Il est probable que chaque fonction cloud définie dans la console soit indépendante de l'autre. Si vous souhaitez réutiliser le code, il est préférable de le structurer selon le document suivant et de le déployer à l'aide de la commande gcloud.
https://cloud.google.com/functions/docs/writing/ #structuring_source_code
Vous mélangez les choses: gestion des packages et déploiement de fonctions.
Lorsque vous déployez une Cloud Function, si vous souhaitez (ré) utiliser, vous devez appeler if avec le package http.
Si vous créez un package que vous souhaitez inclure dans votre code source, vous devez vous fier au gestionnaire de packages. Avec Go, le dépôt Git, comme Github, est le meilleur moyen d'y parvenir (n'oubliez pas d'effectuer une version et de la nommer comme prévu par Go mod: vX.YZ)
Ici, votre code peut ne fonctionne pas sans plus d'ingénierie et de publication / gestion de packages.
Je réalise les mêmes choses mais avec un Dockerfile et j'ai déploré mon code dans Cloud Run (que je vous recommande si vous n'êtes pas orienté événement et uniquement Orienté HTTP. J'ai écrit un comparaison sur Medium )
Dans mon helloworld.go
, je peux réutiliser le package foo
. Pour cela, j'effectue cela dans mon fichier service / go.mod
module service/helloworld go 1.12 require pkg/foo v0.0.0 replace pkg/foo v0.0.0 => ../pkg
Ensuite, lorsque vous construisez votre conteneur, vous exécutez votre go build service / Helloworld.go
depuis le répertoire racine.
Vous ne pouvez pas invoquer une fonction cloud à partir d'une autre, car chaque fonction est dans son propre conteneur indépendamment.
Donc, si vous souhaitez déployer la fonction avec une dépendance qui ne peut pas être téléchargée à partir d'un gestionnaire de packages, vous devez assembler le code comme ici et déployer à l'aide de CLI