Spécifier des dépendances en Go

Cloud Functions dans Go doit fournir toutes ses dépendances via des modules Go avec un fichier go.mod ou via un répertoire vendor. Votre fonction ne peut pas spécifier de dépendances utilisant à la fois des modules Go et un répertoire vendor.

L'environnement d'exécution Go inclut un certain nombre de packages système. Si votre fonction utilise une dépendance nécessitant un package système non répertorié, vous pouvez demander un package.

Le contenu de ce document s'applique à Go 1.11 et à Go 1.13.

Utiliser les modules Go

Cloud Functions est compatible avec la fonctionnalité expérimentale Modules de Go, qui permet de spécifier des dépendances dans un fichier go.mod à la racine de votre projet. Lorsque vous déployez votre fonction, les dépendances spécifiées dans le fichier go.mod sont récupérées et compilées automatiquement.

Le comportement des modules Go varie selon que vous développez à l'intérieur ou à l'extérieur de GOPATH. Pour déterminer si vous êtes à l'intérieur de GOPATH, procédez comme suit :

  1. Accédez au répertoire du projet.

  2. Trouvez votre GOPATH en exécutant la commande suivante :

    go env GOPATH
    

    Vous obtenez une ligne semblable à la suivante :

    GOPATH=YOUR_GOPATH
    
  3. Trouvez votre répertoire de travail actuel en exécutant la commande suivante :

    pwd
    

Si le répertoire de travail commence par YOUR_GOPATH, vous êtes dans GOPATH. Dans ce cas, générez le fichier go.mod à l'aide des trois commandes suivantes :

export GO111MODULE=on
go mod init
go mod tidy

Si le répertoire de travail ne commence pas par YOUR_GOPATH, vous n'êtes pas dans GOPATH. Dans ce cas, générez le fichier go.mod à l'aide des commandes suivantes :

go mod init MODULE
go mod tidy

Dans l'exemple ci-dessus, MODULE est le nom de votre module. Par exemple, le nom de votre module peut être example.com/myproject. (Notez que le nom de domaine est obligatoire.) La commande go détecte automatiquement le nom du module lorsque vous êtes dans GOPATH.

Après avoir créé un fichier go.mod, vous pouvez utiliser la commande go get pour récupérer les dépendances et les ajouter automatiquement à votre projet. Exemple :

go get DEPENDENCY

Dans l'exemple ci-dessus, DEPENDENCY est une dépendance que vous souhaitez ajouter à votre fonction. Par exemple, la commande go get cloud.google.com/go/storage ajoute la bibliothèque cliente Cloud Storage à votre fonction.

Utiliser un répertoire vendor

Cloud Functions vous permet également d'inclure vos dépendances via un répertoire vendor. La plupart du temps, les répertoires vendor sont gérés par un gestionnaire de dépendances. Vous pouvez utiliser le gestionnaire de dépendances de votre choix. Par exemple, vous pouvez utiliser la fonctionnalité "Modules" de Go pour créer un répertoire vendor à partir de votre fichier go.mod.

L'utilisation d'un répertoire vendor est utile si votre dépendance n'est pas disponible via un gestionnaire de dépendances ou si l'accès Internet de votre environnement Cloud Functions est limité.

Si vous avez un fichier go.mod et un répertoire vendor, le répertoire vendor sera ignoré lors du déploiement de votre fonction. Vous pouvez utiliser un fichier .gcloudignore pour éviter d'importer vos fichiers go.mod et go.sum. Dans ce cas, le contenu de votre répertoire vendor sera respecté :

  1. Créez un fichier .gcloudignore à la racine du répertoire de votre projet, avec le contenu suivant :

    go.mod
    go.sum
    
    # Also ignore Git directories. Delete the following two lines if you want to
    # upload them.
    .git
    .gitignore
    
  2. Créez un répertoire vendor à partir du contenu de votre fichier go.mod en exécutant la commande suivante :

    go mod vendor
    

Utiliser des dépendances privées

Si les dépendances de votre fonction sont hébergées dans un dépôt qui n'est pas accessible publiquement, vous devez utiliser un répertoire vendor pour récupérer les dépendances avant de déployer votre fonction. Si vous prévoyez d'utiliser un fichier go.mod, suivez les instructions ci-dessus pour éviter tout conflit entre le fichier go.mod et le répertoire vendor.