web-dev-qa-db-fra.com

Go build: "Impossible de trouver le paquet" (même si GOPATH est défini)

Bien que GOPATH soit correctement défini, je ne parviens toujours pas à obtenir les options "construire" ou "exécuter" pour trouver mes propres packages. 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
107
MitchellSalad

Cela ne fonctionne pas car votre fichier source foobar.go ne se trouve pas dans un répertoire appelé foobar. go build et go install tentent de faire correspondre les répertoires, pas les fichiers sources.

  1. Définissez $GOPATH sur un répertoire valide, par exemple. export GOPATH="$HOME/go"
  2. Déplacez foobar.go vers $GOPATH/src/foobar/foobar.go et le bâtiment devrait fonctionner correctement.

Étapes supplémentaires recommandées:

  1. Ajoutez $GOPATH/bin à votre $PATH de: PATH="$GOPATH/bin:$PATH"
  2. Déplacez main.go dans un sous-dossier de $GOPATH/src, par exemple. $GOPATH/src/test
  3. go install test devrait maintenant créer un exécutable dans $GOPATH/bin pouvant être appelé en tapant test dans votre terminal.
138
fasmat

Edit: puisque vous vouliez dire GOPATH, voir fasmat 's answer (upvoted)

Comme mentionné dans " Comment faire pour trouver mon paquet? ", vous devez mettre un paquet xxx dans un répertoire xxx.

Voir le Go language spec :

_package math
_

Un ensemble de fichiers partageant le même PackageName constitue la mise en œuvre d'un package.
Une implémentation peut nécessiter que tous les fichiers source d’un paquet résident dans le même répertoire.

Le code organisation mentionne:

Lors de la création d'un programme qui importe le package "widget", la commande go recherche _src/pkg/widget_ dans la racine Go, puis, si la source du package n'y est pas trouvée, il recherche src/widget dans chaque espace de travail dans l’ordre.

(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 sur ~/go, et non pas GOROOT, comme illustré dans " Comment écrire un code Go ".

Le chemin d'accès est utilisé pour résoudre les instructions d'importation. Il est implémenté et documenté dans le paquet go/build.

La variable d’environnement GOPATH répertorie les emplacements dans lesquels rechercher le code Go.
Sous Unix, la valeur est une chaîne séparée par deux points.
Sous Windows, la valeur est une chaîne séparée par des points-virgules.
Sur le plan 9, la valeur est une liste.

C'est différent de GOROOT:

Les distributions binaires Go supposent qu'elles seront installées dans _/usr/local/go_ (ou _c:\Go_ sous Windows), mais il est possible de les installer à un autre emplacement.
Si vous procédez ainsi, vous devrez définir la variable d’environnement GOROOT dans ce répertoire lorsque vous utilisez les outils Go.

9
VonC

TL; DR: Suivez les conventions de Go! (Leçon apprise à la dure), vérifiez les anciennes versions de go et supprimez les. Installer la dernière.

Pour moi la solution était différente. J'ai travaillé sur un serveur Linux partagé et après avoir vérifié plusieurs fois ma GOPATH et d'autres variables d'environnement, 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 this solution par les instructions sur golang.org (y compris la désinstallation partie) encore rencontré des problèmes.

Il m'a fallu un peu de temps pour me rendre compte qu'il y avait encore une ancienne version qui n'a pas été désinstallée (en cours d'exécution go version puis which go encore ... DAHH) qui m'a amené à this question et enfin résolu.

3
Moshisho