Introduction : La peur familière de chaque débutant en Go
\n\nVous venez de commencer à apprendre Go. L'inspiration vous submerge, vous écrivez votre premier Hello, World!, vous lancez go run main.go — et au lieu d'un message de bienvenue, vous voyez un mur de texte rouge. La phrase clé qui glace le cœur : "go: go.mod file not found in current directory or any parent directory; see 'go help modules'".
Cela vous dit quelque chose ? Ne vous inquiétez pas, cette erreur, tous ceux qui ont commencé à travailler avec Go après la version 1.11 l'ont vue. Ce n'est pas un bug du compilateur ni une malédiction des dieux anciens. C'est un mécanisme strict mais juste du système de modules Go. Aujourd'hui, nous ne montrerons pas seulement comment la corriger (même si nous le ferons aussi). Nous allons regarder "sous le capot" : comprendre pourquoi Go exige go.mod, comment il le cherche et ce qui se passe si le fichier est absent.
À la fin de cet article, non seulement vous vous débarrasserez de l'erreur, mais vous comprendrez aussi la philosophie même de la gestion des dépendances en Go. C'est parti !
\n\nQu'est-ce que go.mod et pourquoi Go en a-t-il besoin ?
\n\nImaginez que go.mod est le passeport de votre projet. Dans ce fichier, Go stocke trois éléments clés :
- \n
- Le nom du module (par exemple,
example.com/monprojet) — un identifiant unique. \n - La version de Go avec laquelle le projet est écrit. \n
- La liste des dépendances — les paquets externes que vous utilisez et leurs versions exactes. \n
Avant l'apparition des modules (dans les versions Go < 1.11), tout était différent. Le code devait être stocké strictement dans le dossier $GOPATH/src. C'était peu pratique : vous ne pouviez pas simplement cloner un dépôt dans n'importe quel dossier et l'exécuter. Le système de modules (Go modules) a résolu ce problème, rendant les projets portables et isolés.
Désormais, Go considère go.mod comme la frontière du projet. Si le fichier est absent, Go considère que vous travaillez en dehors du projet et refuse d'exécuter le code. C'est la racine de notre erreur.
Comment Go cherche go.mod : l'algorithme "ascendant"
\n\nLorsque vous tapez go run main.go, Go lance la recherche de go.mod selon l'algorithme suivant :
- \n
- Commence par le répertoire courant. Si dans le dossier où se trouve
main.go, il y ago.mod— parfait, on travaille. \n - Sinon, remonte d'un niveau (vers le dossier parent). Vérifie à nouveau. \n
- Répète l'étape 2 jusqu'à atteindre la racine du système de fichiers (
/sur Linux/Mac ouC:\\sur Windows). \n - Si on arrive à la racine sans trouver go.mod — affiche l'erreur
"go.mod file not found in current directory or any parent directory". \n
Cet algorithme s'appelle "walk up the directory tree". Il vous permet d'exécuter du code depuis n'importe quel sous-dossier à l'intérieur du projet. Par exemple, si votre projet se trouve dans /home/utilisateur/monapp/ et que vous allez dans /home/utilisateur/monapp/cmd/ et lancez go build, Go trouvera go.mod dans /home/utilisateur/monapp/.
Exemple pratique : reproduisons l'erreur
\n\nSimulons la situation. Créons un fichier simple sans module :
\n\n// main.go\npackage main\n\nimport "fmt"\n\nfunc main() {\n fmt.Println("Bonjour du monde sans go.mod !")\n}\n\nEssayons maintenant de l'exécuter :
\n$ go run main.go\ngo: go.mod file not found in current directory or any parent directory; see 'go help modules'\n\nLa voilà, notre erreur. Go a parcouru honnêtement tous les dossiers du courant jusqu'à la racine, mais n'a pas trouvé go.mod. La solution est évidente : il faut créer ce fichier.
Comment corriger correctement l'erreur
\n\nMéthode 1 : Démarrage rapide avec go mod init
\n\nLa manière la plus correcte est d'initialiser le module :
\n$ go mod init example.com/mapremiereapp\ngo: creating new go.mod: module example.com/mapremiereapp