Même si j'ai GOPATH
correctement configuré, je ne peux toujours pas obtenir "go build" ou "go run" pour trouver mes propres paquets. Qu'est-ce que je fais mal?
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
$ go help gopath
Réponses:
Cela ne fonctionne pas car votre
foobar.go
fichier source ne se trouve pas dans un répertoire appeléfoobar
.go build
etgo install
essayez de faire correspondre les répertoires, pas les fichiers source.$GOPATH
sur un répertoire valide, par exempleexport GOPATH="$HOME/go"
foobar.go
vers$GOPATH/src/foobar/foobar.go
et la construction devrait fonctionner très bien.Étapes supplémentaires recommandées:
$GOPATH/bin
à votre$PATH
par:PATH="$GOPATH/bin:$PATH"
main.go
vers un sous-dossier de$GOPATH/src
, par exemple$GOPATH/src/test
go install test
devrait maintenant créer un exécutable$GOPATH/bin
qui peut être appelé en tapanttest
dans votre terminal.la source
GOPATH=/usr/local/go-pkgs
, alors Go cherche/usr/local/go-pkgs/src/<package-name>
la source, mais lago get
met/usr/local/go-pkgs/src/gopkg.in/<package-name>
. Pourquoi devrais-je déplacer manuellement tous mes packages après l'installation? C'est juste idiot.go get
met normalement des paquets dedans$GOPATH/src/
donc si vous appelez,go get domain.com/path/to/package
il finira dans$GOPATH/src/domain.com/path/to/package
. Je suppose que vous essayez de récupérer un colisgopkg.in
? Si c'est le cas, c'est le comportement absolument prévu et vous devez simplement les importer avec leur nom complet; par exemple,import "gopkg.in/yaml.v1"
comme également décrit dans la documentation .Edit: depuis que vous vouliez dire GOPATH, voir fasmat de » réponse (upvoted)
Comme mentionné dans " Comment faire pour que je trouve mon paquet? ", Vous devez mettre un paquet
xxx
dans un répertoirexxx
.Voir les spécifications de langue Go :
L' organisation du Code mentionne:
(un «espace de travail» est une entrée de chemin dans votre
GOPATH
: cette variable peut référencer plusieurs chemins pour que votre «src, bin, pkg
» soit)(Réponse originale)
Vous devez également définir
GOPATH
~ / go, nonGOROOT
, comme illustré dans " Comment écrire du code Go ".C'est différent de
GOROOT
:la source
TL; DR: Suivez les conventions de Go! (leçon apprise à la dure), vérifiez les anciennes versions de go et supprimez- les. Installez le dernier.
Pour moi, la solution était différente. J'ai travaillé sur un serveur Linux partagé et après avoir vérifié
GOPATH
plusieurs fois mes variables d'environnement et d'autres, cela ne fonctionnait toujours pas. J'ai rencontré plusieurs erreurs, notamment "Impossible de trouver le package" et "Chemin d'importation non reconnu". Après avoir essayé de réinstaller avec cette solution en suivant les instructions sur golang.org (y compris la partie de désinstallation ), des problèmes ont encore été rencontrés.Il m'a fallu un certain temps pour se rendre compte qu'il ya encore une ancienne version qui n'a pas été désinstallés ( en cours d' exécution ,
go version
puis àwhich go
nouveau ... DAHH) qui m'a fait cette question et enfin résolu.la source
Bien que la réponse acceptée soit toujours correcte concernant la nécessité de faire correspondre les répertoires avec les noms de package, vous devez vraiment migrer vers les modules Go au lieu d'utiliser GOPATH. Les nouveaux utilisateurs qui rencontrent ce problème peuvent être confus sur les mentions d'utilisation de GOPATH (comme je l'étais), qui sont maintenant obsolètes. Je vais donc essayer de résoudre ce problème et de fournir des conseils associés à la prévention de ce problème lors de l'utilisation des modules Go.
Si vous êtes déjà familiarisé avec les modules Go et que vous rencontrez ce problème, passez à mes sections plus spécifiques ci-dessous qui couvrent certaines des conventions Go qu'il est facile d'oublier ou d'oublier.
Ce guide présente les modules Go: https://golang.org/doc/code.html
Organisation de projet avec les modules Go
Une fois que vous avez migré vers les modules Go, comme mentionné dans cet article, organisez le code du projet comme décrit:
Vous pouvez initialiser votre module comme ceci:
Votre code n'a pas besoin d'être localisé sur github.com pour qu'il soit généré. Cependant, il est recommandé de structurer vos modules comme s'ils allaient éventuellement être publiés.
Comprendre ce qui se passe lorsque vous essayez d'obtenir un colis
Il y a un excellent article ici qui parle de ce qui se passe lorsque vous essayez d'obtenir un package ou un module: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 Il explique où le package est stocké et sera vous aider à comprendre pourquoi vous pourriez obtenir cette erreur si vous utilisez déjà des modules Go.
Assurez-vous que la fonction importée a été exportée
Notez que si vous rencontrez des difficultés pour accéder à une fonction à partir d'un autre fichier, vous devez vous assurer que vous avez exporté votre fonction. Comme décrit dans le premier lien que j'ai fourni, une fonction doit commencer par une lettre majuscule pour être exportée et rendue disponible pour être importée dans d'autres packages.
Noms des répertoires
Un autre détail critique (comme cela a été mentionné dans la réponse acceptée) est que les noms de répertoires définissent les noms de vos packages. (Les noms de vos packages doivent correspondre à leurs noms de répertoires.) Vous pouvez en voir des exemples ici: https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc Avec Cela dit, le fichier contenant votre
main
méthode (c'est-à-dire le point d'entrée de votre application) est en quelque sorte exempté de cette exigence.À titre d'exemple, j'ai eu des problèmes avec mes importations lors de l'utilisation d'une structure comme celle-ci:
Je n'ai pas pu importer le code
utils
dans monmain
package.Cependant, une fois que j'ai mis
main.go
dans son propre sous-répertoire, comme indiqué ci-dessous, mes importations ont très bien fonctionné:Dans cet exemple, mon fichier go.mod ressemble à ceci:
Lorsque j'ai enregistré main.go après avoir ajouté une référence à
utils.MyFunction()
, mon IDE a automatiquement extrait la référence à mon package comme ceci:(J'utilise VS Code avec l'extension Golang.)
Notez que le chemin d'importation incluait le sous-répertoire du package.
Gérer un repo privé
Si le code fait partie d'un dépôt privé, vous devez exécuter une commande git pour activer l'accès. Sinon, vous pouvez rencontrer d'autres erreurs. Cet article explique comment faire cela pour les dépôts privés Github, BitBucket et GitLab: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 Ce problème est également abordé ici: Quelle est la bonne façon de «récupérer» un dépôt privé?
la source
Avez-vous essayé d'ajouter le répertoire absolu de go à votre «chemin»?
la source