web-dev-qa-db-fra.com

Comment puis-je résoudre "Impossible de trouver le module pour le chemin X" en important un module Go local?

Dans mon projet Go, je souhaite décomposer certaines fonctionnalités génériques en un module Go, distinct du projet principal. Je fais cela en dehors de GOPATH pour rester dans le futur. Je ne veux pas publier le module sur GitHub ou ailleurs.

Toutes mes tentatives d'importer ce module dans le projet principal aboutissent à:

cannot find module for path X

J'ai couru go mod init X dans le dossier du module. Le contenu de son go.mod le fichier est:

module X

Construire ou installer ce module semble ne rien faire. Je n'en ai trouvé aucun signe dans $GOPATH/pgk/mod.

J'ai essayé une variété d'instructions d'importation:

Aidez-moi!

11
Inigo

Vous avez donc écrit un module "bibliothèque" Go qui:

  • vous ne voulez pas publier sur GitHub ou ailleurs
  • vous souhaitez l'importer et l'utiliser dans votre projet (le module "principal").

Utilisez la directive replace pour résoudre ce problème.

Étant donné le nom du module "X" comme vous l'avez appelé, dans votre module principal, ajoutez les lignes suivantes:

require "X" v0.0.0
replace "X" v0.0.0 => "{local path to the X module}"

Le chemin doit pointer vers le répertoire racine du module et peut être absolu ou relatif.

Pour importer un package , utilisez à partir du module [~ # ~] x [~ # ~] :

import "X/util"

(Vous n'importez pas de modules. Vous importez des packages à partir de modules.)


Explication

Fonctionnalité du module Go est conçu pour les modules publiés publiquement. Normalement, le nom d'un module est à la fois son identifiant unique et le chemin vers son dépôt public. Lorsque votre go.mod déclare une dépendance de module avec la directive require, Go recherche et récupère automatiquement la version spécifiée du module sur ce chemin.

(Voir aussi dans la FAQ Go Modules, Puis-je travailler entièrement en dehors de VCS sur mon système de fichiers local? )

Si, par exemple, votre go.mod le fichier contient require github.com/some/dependency v1.2.3, Go récupérera le module de GitHub sur ce chemin. Mais s'il contient require X v0.0.0, "X" n'est pas un chemin réel et vous obtiendrez l'erreur cannot find module for path X.

La directive replace vous permet de spécifier un chemin de remplacement pour un identifiant et une version de module donnés. Il y a de nombreuses raisons pour lesquelles vous voudriez le faire , par exemple pour tester les modifications d'un module avant de les envoyer au dépôt public. Mais vous pouvez également l'utiliser pour lier un identifiant de module au code local que vous n'avez jamais l'intention de publier.

J'espère que cela t'aides.

19
Hamza Anis