Go se plaint de go.mod ? Pourquoi cela se produit et comment cela fonctionne

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : La peur familière de chaque débutant en Go

\n\n

Vous 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'".

\n\n

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.

\n\n

À 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\n

Qu'est-ce que go.mod et pourquoi Go en a-t-il besoin ?

\n\n

Imaginez que go.mod est le passeport de votre projet. Dans ce fichier, Go stocke trois éléments clés :

\n
    \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
\n\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.

\n\n

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.

\n\n

Comment Go cherche go.mod : l'algorithme "ascendant"

\n\n

Lorsque vous tapez go run main.go, Go lance la recherche de go.mod selon l'algorithme suivant :

\n
    \n
  1. Commence par le répertoire courant. Si dans le dossier où se trouve main.go, il y a go.mod — parfait, on travaille.
  2. \n
  3. Sinon, remonte d'un niveau (vers le dossier parent). Vérifie à nouveau.
  4. \n
  5. Répète l'étape 2 jusqu'à atteindre la racine du système de fichiers (/ sur Linux/Mac ou C:\\ sur Windows).
  6. \n
  7. Si on arrive à la racine sans trouver go.mod — affiche l'erreur "go.mod file not found in current directory or any parent directory".
  8. \n
\n\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/.

\n\n

Exemple pratique : reproduisons l'erreur

\n\n

Simulons 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\n

Essayons 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\n

La 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.

\n\n

Comment corriger correctement l'erreur

\n\n

Méthode 1 : Démarrage rapide avec go mod init

\n\n

La 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

Blogs

Book Recommendations