1. Principes de Go Modules et de gestion des paquets
Les Go Modules sont le système officiel de gestion des paquets et de contrôle des versions des dépendances pour le langage Go, introduit depuis la version 1.11 et devenant le mécanisme par défaut de gestion des dépendances à partir de la version 1.13. Les Go Modules traitent chaque projet comme un module, incluant le code Go du projet et tous les paquets dont il dépend.
Principe de fonctionnement
Les Go Modules gèrent les dépendances des projets via le fichier go.mod
. Ce fichier se trouve dans le répertoire racine du projet et répertorie toutes les dépendances directes ainsi que leurs versions. Un module peut contenir plusieurs paquets, bien qu'un référentiel soit généralement un module.
Lors de la construction ou de l'exécution d'autres commandes, si le fichier go.mod
n'est pas présent dans le répertoire actuel, l'ensemble d'outils Go recherchera le fichier go.mod
dans le répertoire actuel et ses répertoires parents pour déterminer le contexte du module pour l'opération en cours. S'il est trouvé, il utilisera les informations de dépendance de ce fichier pour récupérer et construire des paquets ; sinon, il utilisera la méthode de gestion des dépendances en mode GOPATH.
Rôle dans le langage Go
- Contrôle des versions: Les Go Modules permettent aux développeurs de spécifier l'utilisation de versions spécifiques de bibliothèques tierces, garantissant la reproductibilité du code.
- Gestion des paquets: Gérer commodément les dépendances du projet et leurs versions.
-
Isolation des modules: Différents projets peuvent dépendre de différentes versions du même paquet sans conflit, chaque projet ayant son propre fichier
go.mod
pour gérer les dépendances.
La gestion des paquets et des modules est un aspect important de tout langage de programmation moderne, car elle facilite des tâches telles que la gestion des dépendances, les mises à niveau des versions de paquets et la reproduction des constructions pour les utilisateurs de paquets en aval. Dans le langage Go, à mesure que les projets et les échelles de dépendances continuent de croître, les Go Modules fournissent un mécanisme nécessaire pour relever efficacement les défis de la gestion des dépendances.
2. Initialiser votre propre Go Module
Initialiser un nouveau module Go est très simple. Vous pouvez exécuter la commande suivante dans le répertoire racine de votre projet :
go mod init <nom-du-module>
Ici, <nom-du-module>
est généralement l'adresse du dépôt de code, telle que github.com/nomutilisateur/depo
.
Objectif du fichier go.mod
Une fois la commande go mod init
exécutée avec succès, un fichier go.mod
sera créé dans le répertoire actuel. Ce fichier définit ce qui suit :
- Le nom du module actuel.
- La version de Go.
- Des informations nécessaires sur toutes les dépendances directes, y compris la version appropriée pour chaque paquet.
Le fichier go.mod
est le composant le plus critique du mécanisme des Go Modules, et il sera automatiquement mis à jour lors de l'ajout ou de la suppression de dépendances.
3. Créer et Structurer des Paquets Go
3.1 Bases de la création de paquets
Dans le langage Go, un paquet est un ensemble de plusieurs fichiers source Go, généralement situés dans le même répertoire, et il contient un ensemble spécifique de fonctionnalités. Chaque fichier Go indique à quel paquet il appartient en utilisant le mot-clé package
.
Pour créer un nouveau paquet, vous devez :
- Créer un dossier pour représenter le répertoire du paquet.
- Créer des fichiers
.go
dans le dossier et spécifierpackage <nom-du-paquet>
à la première ligne du fichier.
Le nom du paquet est généralement lié au nom du répertoire, mais il n'est pas obligatoire d'être cohérent. Le nom du paquet doit être court, clair et de préférence éviter l'utilisation de tirets bas.
3.2 Structure des paquets
Structurer vos paquets Go de manière logique est crucial pour garantir la lisibilité, la maintenabilité et la réutilisabilité du code.
- Structure de répertoire: Diviser les répertoires en fonctionnalités, où chaque répertoire représente un paquet.
-
Conventions de nommage: Les répertoires tels que
_test
contiennent généralement des fichiers de test, le répertoirecmd
est couramment utilisé pour les applications en ligne de commande, et le répertoireinternal
contient du code privé non destiné à un usage externe.
/répertoire-racine
/pkg
/sous-paquet1
souspaquet1.go
/sous-paquet2
souspaquet2.go
/cmd
main.go // répertoire cmd pour les applications en ligne de commande
/internal
aide.go
Cette approche structurée indique clairement la composition du code et facilite sa gestion, son test et sa compilation. De tels paquets bien structurés peuvent être facilement importés et utilisés par d'autres projets.
Le respect des conventions structurelles et de nommage susmentionnées aidera d'autres développeurs à saisir rapidement la composition de la base de code, ce qui conduira à une gestion et à une maintenance plus efficaces des paquets.
4. Importation et Utilisation de Paquets
4.1 Importation de packages internes
Supposons que vous ayez une structure de projet comme suit :
├── src
│ ├── main.go
│ └── mypackage
│ └── mymodule.go
Dans cet exemple, mypackage
est un package interne que vous avez créé, contenant un fichier nommé mymodule.go
. Tout d'abord, assurez-vous que le fichier mymodule.go
déclare le bon nom de package :
// mymodule.go
package mypackage
// SomeFunction est une fonction publique dans mypackage
func SomeFunction() {
// Implémentation de la fonction
}
Maintenant, si nous voulons utiliser la fonction SomeFunction
du package mypackage
dans le fichier main.go
, nous devons l'importer :
// main.go
package main
import (
"fmt"
"project/src/mypackage"
)
func main() {
mypackage.SomeFunction()
fmt.Println("La fonction a été appelée")
}
L'instruction import
ci-dessus importe le package mypackage
dans le fichier main.go
, nous permettant d'appeler des fonctions de ce package en utilisant mypackage.SomeFunction
.
4.2 Utilisation de packages externes
Lorsque vous avez besoin de mettre en œuvre des fonctionnalités plus complexes, vous vous appuyez souvent sur des packages externes. Les packages externes sont écrits et disponibles publiquement par d'autres développeurs, que nous pouvons facilement intégrer dans nos propres projets. Pour trouver des packages externes, vous pouvez visiter des sites Web comme godoc.org ou faire des recherches sur GitHub.
Supposons que vous souhaitiez utiliser gorilla/mux
dans votre projet, qui est une bibliothèque populaire de routage de requêtes HTTP. Vous pouvez l'importer et l'utiliser comme suit :
Tout d'abord, installez le package en utilisant la commande go get
:
go get -u github.com/gorilla/mux
Ensuite, importez et utilisez gorilla/mux
dans votre code :
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter() // Créer une instance de routeur
// Ajouter des règles de route
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
w.Write([]byte("Bienvenue à gorilla/mux !"))
})
// Démarrer le serveur HTTP
http.ListenAndServe(":8000", r)
}
Dans le code ci-dessus, nous importons gorilla/mux
pour créer un routeur HTTP, définissons une fonction de gestionnaire pour le chemin racine, et démarrons enfin le serveur sur le port 8000 en utilisant http.ListenAndServe
.
5. Gestion des dépendances de modules
Dans un projet à grande échelle, la gestion des dépendances de modules devient particulièrement importante. Cela aide à garantir que chaque build ou réplique de projet peut utiliser avec précision les mêmes versions de dépendances pour plus de cohérence.
5.1 Mise à jour des dépendances avec go get
La commande go get
peut non seulement ajouter de nouvelles dépendances de package, mais aussi mettre à jour celles qui existent déjà. Voici quelques options courantes pour go get
:
- Mettre à jour un seul package :
go get -u github.com/some/package
- Mettre à jour toutes les dépendances de ce package :
go get -u github.com/some/package/...
- Mettre à jour toutes les dépendances dans le projet :
go get -u ./...
- Télécharger mais ne pas installer :
go get -d github.com/some/package
Lors de l'exécution des opérations de mise à jour, Go mettra à jour les dépendances à la dernière version mineure ou de révision (selon la sémantique de version), et les modifications seront également reflétées dans le fichier go.mod
.
5.2 Contrôle de version et go.mod
Depuis la version 1.11, Go a fourni un nouveau système de gestion des dépendances appelé Go Modules
. Dans le répertoire racine du projet, le fichier go.mod
enregistre les dépendances des packages.
Le fichier go.mod
comprend les sections suivantes :
- Module déclare le chemin du module pour le projet actuel.
- Require déclare les dépendances et leurs versions spécifiques.
- Replace peut spécifier les chemins et versions de module de remplacement.
- Exclude est utilisé pour exclure des versions spécifiques.
Un exemple de fichier go.mod
pourrait ressembler à ceci :
module github.com/my/awesome-project
go 1.14
require (
github.com/gorilla/mux v1.7.4
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975
)
replace (
github.com/old/dependency => github.com/new/dependency v1.2.3
)
exclude (
github.com/old/dependency v1.1.4
)
Lors de l'exécution de commandes telles que go build
ou go test
dans le projet, Go générera ou mettra à jour automatiquement le fichier go.mod
pour déterminer toutes les dépendances requises pour le projet. La meilleure pratique en matière de contrôle de version est de committer régulièrement les fichiers go.mod
et go.sum
(qui enregistre les empreintes cryptographiques attendues des dépendances).
En gérant à travers le fichier go.mod
, cela garantit que chaque développeur au sein d'une équipe utilise les mêmes versions de dépendances, évitant ainsi la situation gênante du "mais ça marche sur ma machine".