3
votes

Comment charger des actifs locaux dans une fonction cloud GCP?

Je crée une minuscule fonction cloud GCP dans Golang qui renvoie un fichier PNG généré lors de son appel via HTTP. J'ai déployé mon code via ZIP-Upload dans la console Google Cloud. Actuellement, il est appelé correctement et le code est compilé, etc. Mais dans mon code, je dois charger plusieurs fichiers locaux - une police et une image .png. J'ai regroupé ceux-ci dans le fichier ZIP que j'ai téléchargé et les fichiers sont visibles dans la vue source de GCP. Tous les fichiers (images, polices et go-files) sont dans le même répertoire.

Lors de l'appel de la fonction cloud, le journal indique ce qui suit:

import "github.com/fogleman/gg"


func main() {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    executableDir := filepath.Dir(ex)

    img, err :=gg.LoadPNG(path.Join(executableDir, "./english.png"))
    if err != nil {
        log.Fatal(err)
    }
}

J'ai essayé de changer la façon dont je construis le chemin d'accès au fichier dans go. J'ai déjà utilisé /german.png statiquement, utilisé plusieurs tentatives pour créer le chemin de manière dynamique.

Je ne suis pas sûr à 100% si c'est la voie à suivre, mais c'est ma première expérience avec "sans serveur" et je suis prêt à le faire de la "bonne" façon.

2019/01/21 14:59:31 open /english.png: no such file or directory

Actuellement, le fichier ne peut être trouvé dans aucune tentative que j'ai faite. Peut-être que le chemin dans lequel les images sont «déployées» est différent de celui que j'ai essayé - je n'ai trouvé aucune note à ce sujet dans la documentation. Je m'attendais évidemment à ce qu'il soit chargé correctement.


0 commentaires

3 Réponses :


3
votes

J'ai créé des fonctions http avec la structure suivante:

package api

import (
    "io/ioutil"
    "net/http"
)

// FileTest func
func FileTest(w http.ResponseWriter, r *http.Request) {
    content, err := ioutil.ReadFile("./test.txt")
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        w.Write([]byte(err.Error()))
        return
    }

    w.Write(content)
}

Et j'ai écrit une fonction simple pour répondre avec le contenu du fichier:

api
|--test.txt
|--api.go

Il renvoie le contenu du fichier sans aucun problème. https://us-central1-clickshield24m.cloudfunctions.net/api p >

Donc, dans votre cas, j'essaierais de changer le chemin en gg.LoadPNG("./english.png")


4 commentaires

Mhm. J'ai déjà essayé cette approche (comme la première), mais cela n'a pas fonctionné. Étrange. J'essaierai encore, merci!


Quelques informations supplémentaires pour la prochaine personne qui la recherchera: On dirait que le chemin binaire de la fonction d'exécution GCF Go 1.11 est / start et les actifs / fichiers sont situés dans le répertoire / srv / files qui est également le répertoire de travail actuel (les chemins relatifs devraient donc fonctionner comme indiqué dans cette réponse). L'utilisation du chemin de l'exécutable pour localiser les actifs est incorrect car l'exécutable se trouve à la racine du système de fichiers.


Avec go 1.13, j'obtiens "aucun fichier ou répertoire de ce type".


@maclir avec go 1.13 mon seul moyen était de passer de la racine vers le haut comme: ./src/my_function/assets/my_asset.html



4
votes

Pour le Go 1.13 selon la documentation , à partir du aujourd'hui (juillet 2020), le code source se trouve dans le répertoire ./serverless_function_source_code .

Une bonne référence à suivre est la buildback < / a>.


0 commentaires

0
votes

./serverless_function_source_code ne fonctionnait pas pour moi en utilisant le runtime go113 avec vendoring. Je voulais localiser un fichier dans le répertoire du fournisseur.

Ma structure de fichiers est:

cd myfn
go mod vendor
gcloud functions deploy MyFunction --runtime go113 --set-env-vars "PATH_FILES=./src/myfn/vendor/static"

Mes étapes de déploiement sont:

myfn
|- main.go
|- go.mod
|- .gcloudignore


0 commentaires