Introduzione alla gestione delle dipendenze in Go
La gestione delle dipendenze è un aspetto critico di qualsiasi progetto software, in quanto aiuta a gestire le versioni delle librerie e dei pacchetti su cui il progetto si basa. In Go (Golang), la gestione delle dipendenze garantisce la riproducibilità e la manutenibilità dei progetti Go, facilitando la risoluzione dei problemi di versionamento, il mantenimento della compatibilità con altri pacchetti e la semplificazione del processo di sviluppo complessivo.
Prima di Go Modules, la gestione delle dipendenze in Go era meno snella. Gli sviluppatori ricorrevano spesso a strumenti come dep
, glide
o govendor
per gestire le dipendenze. Sebbene questi strumenti fossero utili, non facevano parte del progetto ufficiale di Go e quindi creavano attriti nell'adozione di Go come linguaggio per alcuni sviluppatori.
L'era dei moduli Go
Nel 2018, il team Go ha introdotto il concetto di "moduli", un nuovo standard per la gestione delle dipendenze nei progetti Go. I moduli sono raccolte di pacchetti correlati che vengono versionati insieme, fornendo tutte le dipendenze necessarie per la base di codice. Con l'introduzione di Go Modules in Go 1.11, la gestione delle dipendenze è diventata più semplice, versatile e ufficialmente supportata dal progetto Go. Go Modules ha introdotto funzionalità quali:
- Il versioning delle dipendenze tramite il Semantic Versioning (SemVer)
- Comandi di gestione delle dipendenze semplificati (ad esempio,
go get
,go mod tidy
) - generazione automatica di un file manifest
(go.mod
) contenente informazioni dettagliate sulle dipendenze - Download automatico e memorizzazione nella cache delle dipendenze necessarie
Con Go Modules, non è più necessario posizionare il codice all'interno della directory $GOPATH
, che in precedenza era un vincolo per lo sviluppo di Go. Questo nuovo sistema consente una struttura di progetto più flessibile, facilitando il lavoro sui progetti Go quando si passa da un repository all'altro.
Impostazione del progetto di moduli Go
Iniziare a lavorare con i moduli Go è semplice. Seguite i passi seguenti per impostare un nuovo progetto Go Modules.
- Innanzitutto, assicurarsi di aver installato Go versione 1.11 o successiva sul proprio sistema. È possibile verificare la versione di Go eseguendo
go version
nel terminale. - Andare nella posizione desiderata e creare una nuova cartella di progetto con un nome descrittivo, ad esempio
my-go-project
. - Navigare nella cartella appena creata nella riga di comando.
- Inizializzare un nuovo modulo Go eseguendo il comando
go mod init
, seguito dal percorso del modulo. Per esempio, si può eseguirego mod init github.com/your-username/my-go-project
se si intende ospitare il progetto su GitHub. Questo comando genera un nuovo file chiamatogo.mod
nella cartella del progetto.
Il file go.mod
è il cuore del progetto Go Modules. Contiene metadati sul modulo, come il suo nome, ed elenca tutte le dipendenze necessarie. Si interagisce con il file go.mod
durante tutto il ciclo di vita del progetto Go per gestire le dipendenze. Ora che il progetto Go Module è stato configurato, si è pronti per iniziare ad aggiungere e gestire le dipendenze utilizzando il sistema Go Modules.
Gestione delle dipendenze nei moduli Go
I moduli Go forniscono un approccio semplice ed efficace per gestire le dipendenze del progetto. Permettono di aggiungere, aggiornare o rimuovere versioni specifiche di dipendenze, aiutandovi a mantenere il controllo sul vostro progetto e sulle sue interazioni con altri pacchetti. Questa sezione vi guiderà attraverso il processo di gestione delle dipendenze nel vostro progetto Go Modules.
Aggiunta di una dipendenza
Per aggiungere una nuova dipendenza, è sufficiente importare il pacchetto desiderato nel codice Go. Per esempio, se volete aggiungere github.com/gorilla/mux
al vostro progetto, importatelo in questo modo:
import ( "github.com/gorilla/mux" )
La prossima volta che si esegue go build
o go test
, Go scaricherà automaticamente il pacchetto richiesto, aggiornerà i file go.mod
e go.sum
e configurerà il progetto per utilizzare il pacchetto specificato. In alternativa, si può usare il comando go get
per aggiungere esplicitamente una nuova dipendenza:
go get github.com/gorilla/mux
Questo non solo recupera il pacchetto, ma aggiorna anche i file go.mod
e go.sum
del progetto.
Aggiornare una dipendenza
Per aggiornare una dipendenza specifica a una nuova versione, utilizzate il comando go get
seguito dal percorso di importazione del pacchetto e dal numero di versione desiderato:
go get github.com/gorilla/[email protected]
Questo comando aggiorna il file go.mod
con la nuova versione del pacchetto e ne scarica il codice sorgente. Si noti che se il pacchetto aggiornato introduce modifiche di rottura, potrebbe essere necessario modificare il codice di conseguenza.
Rimozione di una dipendenza
Per rimuovere una dipendenza dal progetto, occorre innanzitutto eliminare le corrispondenti dichiarazioni di importazione dal codice sorgente. Successivamente, eseguire il comando go mod tidy
per ripulire il file go.mod
:
go mod tidy
Questo comando rimuove tutte le dipendenze inutilizzate dal file go.mod
e assicura che il progetto rimanga pulito e organizzato.
Il versionamento semantico e i moduli Go
Il Semantic Versioning (SemVer) è un sistema di versioning ampiamente adottato che assegna numeri di versione univoci alle versioni del software. Utilizza un formato di numerazione in tre parti: Major.Minor.Patch (ad esempio, 1.2.3). In SemVer:
- I cambiamenti di versione maggiori indicano cambiamenti di rottura e richiedono modifiche manuali del codice.
- I cambiamenti di versione minori introducono nuove funzionalità, pur rimanendo compatibili con le versioni precedenti.
- I cambiamenti di versione includono correzioni di bug e miglioramenti minori delle prestazioni, anch'essi compatibili con le versioni precedenti.
Go Modules incorpora il Semantic Versioning per gestire il versioning delle dipendenze, consentendo agli sviluppatori di gestire più facilmente gli aggiornamenti, la retrocompatibilità e le modifiche di rottura. Quando si specificano le versioni delle dipendenze con Go Modules, si possono usare intervalli di versioni o numeri di versione specifici. Per esempio: - Per ottenere l'ultima versione stabile di un pacchetto, usare il percorso di importazione del pacchetto senza il numero di versione: go get github.com/gorilla/mux
. - Per recuperare una versione specifica, aggiungere il numero di versione dopo il simbolo @
: go get github.com/gorilla/[email protected].
- Per ottenere l'ultimo aggiornamento minore o di patch all'interno di una specifica versione maggiore, usare il simbolo ^
(caret): go get github.com/gorilla/mux@^v1.0.0
.
Comandi comuni dei moduli Go e loro utilizzo
Ecco alcuni dei comandi di Go Modules più comunemente usati e i loro scenari di utilizzo:
go mod init
go mod init
inizializza un nuovo progetto Go Modules nella directory corrente. Genera un file go.mod
, che contiene informazioni sul modulo, sulle sue dipendenze e sui vincoli di versione.
go mod init example.com/myproject
Sostituire example.com/myproject
con il percorso del modulo.
go get
go get
è un comando versatile usato per aggiungere, aggiornare o rimuovere una dipendenza. Fornisce il percorso di importazione del pacchetto, seguito facoltativamente da un numero di versione o da un intervallo.
go get github.com/gorilla/[email protected]
Questo comando aggiunge o aggiorna il pacchetto github.com/gorilla/mux
alla versione v1.8.0.
go mod tidy
go mod tidy
rimuove le dipendenze inutilizzate dal file go.mod
e lo aggiorna per riflettere le dichiarazioni di importazione nel codice sorgente del progetto.
go mod tidy
Eseguire questo comando dopo aver rimosso le dichiarazioni di importazione delle dipendenze indesiderate.
go mod graph
go mod graph
visualizza l'albero delle dipendenze del progetto, mostrando le dipendenze dirette e indirette in un formato leggibile. Questo comando può essere utile per il debug di problemi di dipendenza complessi.
go mod graph
go mod verify
go mod verify
controlla l'integrità delle dipendenze elencate nel file go.sum
. Se la somma di controllo di una dipendenza non corrisponde al valore registrato, il comando segnala un errore.
go mod verify
Risolvere i conflitti di dipendenza
I conflitti di dipendenza possono sorgere quando il progetto dipende da più pacchetti con requisiti di versione diversi per le dipendenze condivise. I moduli Go forniscono un meccanismo integrato per gestire questi conflitti utilizzando le direttive replace
ed exclude
nel file go.mod
.
La direttiva replace
La direttiva replace
consente di cambiare la versione di un modulo con una diversa o di mapparla su un percorso locale. Ciò può essere utile in situazioni in cui è necessario testare versioni specifiche, progetti biforcati o modifiche locali prima di eseguire il commit su un repository remoto. Per usare la direttiva replace, aggiungere la seguente riga al file go.mod
:
replace example.com/original/module v1.2.3 => example.com/new/module v1.4.0
In questo modo si sostituisce example.com/original/module
version v1.2.3
con example.com/new/module
version v1.4.0
. È anche possibile sostituire un modulo con un percorso locale:
replace example.com/original/module v1.2.3 => ../local/path/to/new/module
La direttiva Exclude
Si può usare la direttiva exclude
per impedire che versioni specifiche di un modulo vengano usate nel progetto. Questo è utile quando si sa che una particolare versione ha problemi di compatibilità o vulnerabilità di sicurezza. Per escludere una versione del modulo, aggiungete la seguente riga al file go.mod
:
exclude example.com/target/module v1.2.3
Ricordarsi di eseguire go mod tidy
dopo aver applicato queste modifiche per aggiornare il file go.sum
e ricompilare l'albero delle dipendenze.
Moduli Go privati e gestione dei repository
Lavorare con i moduli e i repository Go privati è simile a lavorare con quelli pubblici, ma ci sono alcuni passaggi aggiuntivi per garantire l'autenticazione e la privacy.
Configurazione di GOPRIVATE
Per evitare che i percorsi di importazione trapelino sui server pubblici, configurare la variabile d'ambiente GOPRIVATE
. Questa variabile specifica un elenco separato da virgole di percorsi di importazione per i repository privati.
go env -w GOPRIVATE=example.com/private/path/*
Uso dei token di accesso
Per utilizzare i repository privati, in genere è necessario autenticarsi con il proprio servizio di hosting del codice sorgente, come GitHub o GitLab. Creare un token di accesso personale con permessi adeguati (come ad esempio l'ambito del repo
per GitHub). Per i passaggi specifici per la creazione di un token di accesso, consultare la documentazione del servizio di hosting. Dopo aver ottenuto il token di accesso, configurare la variabile d'ambiente per l'autenticazione. Utilizzare la variabile d'ambiente appropriata in base al proprio servizio VCS.
export GIT_TERMINAL_PROMPT=0 export GITHUB_TOKEN=YOUR_ACCESS_TOKEN
Questo permette al comando go
di scaricare e autenticare i repository privati come moduli Go. Se si lavora con più servizi VCS, è possibile configurare token di accesso individuali per ciascuno di essi, definendo variabili d'ambiente separate.
Migrazione dai precedenti sistemi di gestione delle dipendenze
Prima di Go Modules, esistevano vari sistemi di gestione delle dipendenze, come Dep, Glide o soluzioni di directory di fornitori personalizzate. Se si utilizzano ancora questi sistemi, è ora di migrare a Go Modules per rimanere aggiornati e sfruttare i vantaggi della moderna gestione delle dipendenze di Golang. Per migrare da un precedente sistema di gestione delle dipendenze a Go Modules, seguite questi passaggi:
- Creare un backup del progetto originale per assicurarsi di poter tornare allo stato precedente, se necessario.
- Rimuovere tutti i file di gestione delle dipendenze esistenti (ad esempio,
Gopkg.toml
oGopkg.lock
). - Navigare nella radice del progetto in un terminale ed eseguire
go mod init
per creare un nuovo filego.mod
. Questo tenterà anche di convertire il file delle dipendenze precedente, se presente, in voci di Go Modules. - Eseguire
go mod tidy
per riempire il filego.mod
con le dipendenze del sistema precedente. Questo comando assicura che solo i pacchetti necessari facciano parte dell'albero delle dipendenze. - A questo punto, potrebbe essere necessario apportare modifiche al file
go.mod
per risolvere i conflitti di dipendenza o per applicare versioni specifiche. Utilizzate le direttivereplace
edexclude
, se necessario, per gestire questi problemi. - Verificate che il progetto venga compilato e superi i test come previsto.
Seguendo questi passaggi, il progetto dovrebbe ora funzionare con i moduli Go, semplificando la gestione delle dipendenze e rendendolo più manutenibile a lungo termine. Eventuali problemi persistenti possono essere risolti modificando il file go.mod
o controllando i percorsi di importazione per assicurarsi che seguano il formato corretto.
AppMaster: Accelerare lo sviluppo di applicazioni basate su Golang
Incorporare i moduli Go e le migliori pratiche di gestione delle dipendenze nel vostro flusso di lavoro quotidiano è fondamentale per garantire un progetto di software basato su Golang mantenibile e scalabile. Ma cosa succederebbe se si potesse accelerare l'intero processo di sviluppo di un'applicazione sfruttando la potenza di Golang?
Ecco AppMaster.io, una piattaforma no-code completa che si concentra sulla generazione di applicazioni backend basate su Golang utilizzando un ambiente di sviluppo visuale. Oltre alle applicazioni backend, AppMaster consente di creare applicazioni web e mobili utilizzando un approccio integrato progettato per semplificare il processo di sviluppo.
Con AppMaster, gli utenti possono creare modelli di dati (schema di database), progettare processi aziendali e definire API REST e WebSocket endpoints attraverso un'interfaccia utente visuale. Le applicazioni Web vengono create utilizzando un'interfaccia drag-and-drop insieme a un designer di processi aziendali Web per un'esperienza utente completamente interattiva. Le applicazioni mobili sono progettate in modo simile, con un designer di processi aziendali mobili e una capacità di progettazione dell'interfaccia utente.
AppMasterLa piattaforma di A.S. prende i vostri progetti e genera il codice sorgente per le vostre applicazioni una volta che avete premuto il pulsante "Pubblica". Compila le applicazioni, esegue i test, le impacchetta in container Docker (per le applicazioni di backend) e distribuisce tutto nel cloud, il tutto in pochi secondi.
Le applicazioni di backend sono generate con Golang (Go), beneficiando delle prestazioni, della semplicità e della manutenibilità offerte da Golang. Le applicazioni web sono generate utilizzando il framework Vue3 e JavaScript/TypeScript, mentre le applicazioni mobili utilizzano il framework AppMaster, Kotlin e Jetpack Compose per Android e SwiftUI per le applicazioni iOS.
Grazie alla potente piattaforma AppMaster, anche chi non ha esperienza di codifica può creare una soluzione software completa e scalabile che comprende backend di server, siti web, portali per i clienti e applicazioni mobili native. AppMaster non solo accelera l'intero processo di sviluppo del software, ma elimina completamente il debito tecnico generando applicazioni da zero ogni volta che i requisiti vengono modificati.
Se state pensando di adottare una piattaforma no-code per le vostre esigenze di sviluppo software, in particolare una che sfrutti i vantaggi di Golang, AppMaster dovrebbe essere in cima alla vostra lista. Registratevi per un account gratuito ed esplorate il futuro dello sviluppo di applicazioni con una soluzione 10 volte più veloce e 3 volte più economica.