Specifica le dipendenze

Le app che vengono eseguite nel runtime standard Go 1.12+ possono utilizzare qualsiasi pacchetto compatibile con linux/amd64.

App Engine richiede che tutte le istruzioni di importazione nel codice Go specifichino percorsi assoluti. Ad esempio, utilizza:

import "github.com/example/mypackage"

Utilizzare i moduli Go

Ti consigliamo di utilizzare i moduli Go per gestire le dipendenze nella tua app Go. Puoi continuare a utilizzare la modalità GOPATH precedente se non sei pronto per la migrazione ai moduli Go.

A partire dalla versione 1.22 di Go e successive:

  • Non puoi utilizzare go get al di fuori di un modulo nella modalità GOPATH precedente (GO111MODULE=off). Per ulteriori informazioni, consulta Strumenti.

  • Go consiglia di utilizzare un file go.mod per la gestione delle dipendenze. Per installare le dipendenze durante il deployment, includi un file go.mod nella stessa cartella del file app.yaml. Per ulteriori informazioni sulle versioni di Go e sulla gestione delle dipendenze per le directory dei fornitori, consulta GOPATH e Moduli.

Quando esegui il deployment dell'app, App Engine utilizza il comando go build per creare l'app e corrisponde al comportamento di Go stesso. Per assicurarti che la tua app utilizzi la modalità module-aware nell'ambiente di sviluppo:

  • Crea il file go.mod del modulo nella stessa directory del file app.yaml. App Engine cerca la directory corrente e le directory principali successive finché non trova un file go.mod.

    Se App Engine non trova un file go.mod, segue la modalità GOPATH.

  • Se imposti la variabile di ambiente GO111MODULE, assicurati che il valore della variabile attivi la modalità module-aware. Quando esegui il deployment dell'app, App Engine controlla l'ambiente per GO111MODULE e corrisponde al comportamento di Go stesso. App Engine applica l'impostazione della variabile GO111MODULE solo se hai incluso un file go.mod per la tua app.

  • Per Go 1.12, non individuare la directory dell'app nella cartella $GOPATH/src. Se la tua app Go 1.12 si trova in un punto qualsiasi dell'albero di directory $GOPATH/src, App Engine segue la modalità GOPATH anche se hai definito un file go.mod per la tua app.

    Per Go 1.13 e versioni successive, App Engine utilizza la modalità module-aware per impostazione predefinita, a meno che GO111MODULE non sostituisca l'impostazione predefinita o non esista un file go.mod nella directory dell'app.

Dipendenze di vendoring

Il vendoring copia i pacchetti utilizzati dall'app nella directory dell'applicazione anziché scaricare i moduli dalle relative origini durante il processo di compilazione. Go fornisce il comando go build per vendere i pacchetti necessari all'app in una directory denominata vendor nella directory principale dell'app.

In Go 1.14 e versioni successive, se la directory principale dell'app contiene una directory denominata vendor, il comando go build e il processo di deployment di App Engine utilizzano i pacchetti nella directory del fornitore anziché scaricare i moduli.

In Go 1.13 e versioni precedenti, il vendoring è disponibile solo se configuri il tuo ambiente per utilizzare la modalità GOPATH.

Utilizzare dipendenze private

App Engine non può scaricare le dipendenze private durante il processo di build, pertanto devi includerle nel codice dell'applicazione al momento del deployment.

Utilizza la direttiva replace nel file go.mod per dichiarare le dipendenze private. L'esempio seguente presuppone che l'app si trovi nella directory /myapp/:

  1. Passa alla directory dell'app:

    cd /myapp
    
  2. Crea una directory contenente le dipendenze private:

    mkdir private
    

    Assicurati che la dipendenza privata si trovi nella directory private. Un approccio consiste nel creare un collegamento simbolico:

    mkdir private/private.example.com
    ln -s /path/to/private.example.com/foo private/private.example.com/foo
    
  3. Aggiorna il file go.mod in modo che utilizzi la direttiva replace per utilizzare la directory private per la dipendenza:

    go mod edit -replace=private.example.com/foo=./private/private.example.com/foo
    

    Il file go.mod dovrebbe ora avere il seguente aspetto:

    File go.mod finale

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
    replace private.example.com/foo => ./private/private.example.com/foo
    

    File go.mod originale

    module private.example.com/myapp
    
    require private.example.com/foo v1.2.3
    
  4. Non modificare la modalità di importazione e utilizzo del pacchetto privato. L'istruzione import dovrebbe avere il seguente aspetto:

    import "private.example.com/foo"
    
  5. Includi la dipendenza privata nel deployment eseguendo il deployment dell'app:

    gcloud app deploy