Specifica delle dipendenze in Go

Cloud Functions in Go deve fornire tutte le sue dipendenze tramite moduli Go con un file go.mod o una directory vendor. La funzione non può specificare le dipendenze utilizzando contemporaneamente i moduli Go e una directory vendor.

Il runtime Go include una serie di pacchetti di sistema nell'ambiente di esecuzione. Se la funzione utilizza una dipendenza che richiede un pacchetto di sistema non incluso nell'elenco, puoi richiedere un pacchetto.

I contenuti di questo documento si applicano sia a Go 1.11 che a Go 1.13.

Utilizzo dei moduli Go

Cloud Functions supporta la funzionalità dei moduli sperimentali di Go, che consente di specificare le dipendenze in un file go.mod alla base del progetto. Quando esegui il deployment della funzione, le dipendenze specificate nel file go.mod verranno recuperate e create automaticamente.

Il comportamento dei moduli Go varia a seconda che si stia sviluppando all'interno o all'esterno di GOPATH. Per stabilire se ti trovi all'interno di GOPATH:

  1. Accedi alla directory del progetto.

  2. Per trovare il dispositivo GOPATH esegui il comando:

    go env GOPATH
    

    Genera una riga simile alla seguente:

    GOPATH=YOUR_GOPATH
    
  3. Per trovare la directory di lavoro corrente:

    pwd
    

Se la directory di lavoro inizia con YOUR_GOPATH, si trova in GOPATH. In questo caso, genera il file go.mod eseguendo i tre comandi seguenti:

export GO111MODULE=on
go mod init
go mod tidy

Se la directory di lavoro non inizia con YOUR_GOPATH, sei fuori da GOPATH. In questo caso, genera il file go.mod eseguendo i comandi:

go mod init MODULE
go mod tidy

Nell'esempio precedente, MODULE è il nome del modulo. Ad esempio, il nome del modulo potrebbe essere example.com/myproject (tieni presente che il nome di dominio è obbligatorio). Il comando go rileva automaticamente il nome del modulo quando ti trovi in GOPATH.

Dopo aver creato un file go.mod, puoi utilizzare il comando go get per recuperare le dipendenze e aggiungerle automaticamente al progetto. Ad esempio:

go get DEPENDENCY

Nell'esempio precedente, DEPENDENCY è una dipendenza che vuoi aggiungere alla funzione. Ad esempio, il comando go get cloud.google.com/go/storage aggiunge la libreria client di Cloud Storage alla tua funzione.

Utilizzo di una directory vendor

Cloud Functions ti consente inoltre di includere le dipendenze tramite una directory vendor. Nella maggior parte dei casi, le directory vendor vengono gestite con un gestore delle dipendenze. Puoi utilizzare qualsiasi gestore delle dipendenze che ti piace. Ad esempio, puoi utilizzare la funzionalità Moduli di Go per creare una directory vendor dal file go.mod.

L'utilizzo di una directory vendor è utile se la dipendenza non è disponibile tramite un dipendente o se l'accesso a Internet nell'ambiente Cloud Functions è limitato.

Dopo aver configurato la directory vendor, potresti dover eseguire passaggi aggiuntivi per garantire che i relativi contenuti vengano rispettati, a seconda della versione di Go utilizzata:

Go versione 1.16 o successiva

Se utilizzi Go 1.16 o versioni successive, puoi lasciare la directory vendor così com'è. Quando il modulo principale contiene una directory vendor di primo livello e il suo file go.mod specifica Go 1.16 o versioni successive, il comando go viene impostato su -mod=vendor per le operazioni che accettano quel flag.

Versione Go precedente alla 1.16

Se utilizzi una versione di Go precedente alla 1.16, devi eseguire quanto segue affinché i contenuti della directory vendor vengano rispettati.

Per le versioni precedenti a 1.16, se hai un file go.mod e una directory vendor, la directory vendor verrà ignorata quando esegui il deployment della funzione. Puoi utilizzare un file .gcloudignore per evitare di caricare i file go.mod e go.sum:

  1. Crea un file .gcloudignore nella directory principale del progetto con i seguenti contenuti:

    go.mod
    go.sum
    
    # Also ignore Git directories. Delete the following two lines if you want to
    # upload them.
    .git
    .gitignore
    
  2. Crea una directory vendor utilizzando i contenuti del file go.mod eseguendo il comando seguente:

    go mod vendor
    

Quando utilizzi l'interfaccia a riga di comando di Google Cloud per eseguire il deployment della funzione, puoi assicurarti che go.mod non venga caricato utilizzando .gcloudignore.

Utilizzo delle dipendenze private

Se le dipendenze della tua funzione sono ospitate in un repository non pubblicamente accessibile, devi utilizzare una directory vendor per recuperare le dipendenze prima di eseguire il deployment della funzione. Se prevedi di utilizzare un file go.mod, consulta le istruzioni in alto per evitare potenziali conflitti tra il file go.mod e la directory vendor.