L'installation de Go échoue avec une erreur: aucun emplacement d'installation pour le répertoire xxx en dehors de GOPATH

152
~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

Quelle que soit la structure du projet, cela échoue toujours avec le même message. Go build fonctionne parfaitement.

Voici mon go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

Ceci est sur Mac OSX Mountain Lion et go a été installé avec homebrew.

tgandrews
la source

Réponses:

116

Lorsque vous ne fournissez aucun argument à go install, il tente par défaut d'installer le package dans le répertoire actuel. Le message d'erreur vous indique qu'il ne peut pas faire cela, car le répertoire actuel ne fait pas partie de votre $GOPATH.

Tu peux soit:

  • Définissez $GOPATHvotre $ HOME ( export GOPATH=$HOME).
  • Déplacez votre source dans le courant $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

Après l'un ou l'autre, aller dans le go-statsd-clientrépertoire et taper go installfonctionnera, de même que taper go install go-statsd-clientn'importe où dans le système de fichiers. Les binaires construits iront dans $GOPATH/bin.

En tant que suggestion sans rapport, vous voudrez probablement créer un espace de noms pour votre paquet avec un nom de domaine, pour éviter les conflits de noms (par exemple github.com/you/go-statsd-client, si c'est là que vous détenez votre code source).

Gustavo Niemeyer
la source
5
Dans mon cas, cette erreur a été causée par l'absence de $GOPATH/binrépertoire. La création de ce dossier était nécessaire - je n'avais pas besoin de définir GOBINenv var.
xentek
4
@RobertReiz alors que je partage votre frustration, je dois souligner que la plupart des autres langues les utilisent en fait, mais peut-être qu'elles ne sont pas aussi visibles. Par exemple, Python (un langage célèbre pour sa simplicité) a PYTHONHOMEau lieu GOROOTet PYTHONPATHau lieu de GOPATH. Même (GC) C a LIBRARY_PATH, C_INCLUDE_PATHetc.
Hut8
1
export GOPATH=$PWDJ'obtiens cette erreur après (debout à la racine d'un arbre de clonage de Golang), votre réponse ne peut pas expliquer l'erreur dans ce cas.
ulidtko
2
Pour moi, le mettre dans $ GOPATH n'était pas suffisant. Il devait être dans un répertoire sous $ GOPATH / src /
Thomas
9
Je suis sûr qu'il y a une très bonne raison pour justifier l'existence de GOPATH, mais de l'extérieur, en regardant vers l'intérieur, cela semble complètement insensé. Pourquoi dois-je muter les variables d'environnement globales juste pour construire un package localement 🤔
Alexander - Réintégrer Monica
193

Pour tous les utilisateurs d'OS X et pour moi, vous devez également définir GOBINpour éviter ce message déroutant lors de l'installation etgo get

mkdir bin 
export GOBIN=$GOPATH/bin
Benjamin Wootton
la source
4
Vous ne devriez pas avoir besoin de définirGOBIN . Si le paramétrer sur $GOPATH/binfait une différence, alors quelque chose ne va pas avec votre configuration ou vous faites quelque chose que vous ne devriez pas.
Dave C
29
@DaveC J'ai aussi le même problème sur OS X. La configuration du GOBIN l'a corrigé.
nJoshi
2
Merci beaucoup, il semble que quelque chose avec le package officiel OS X ne va pas en effet vous obligeant à définir GOBIN, toujours valable pour 10.11.4 (El Capitan)
Jonas D.
3
C'est également un correctif correct pour Ubuntu 16.04, avec le paquet binaire de http://golang.org/dl/
suside
1
Cela a parfaitement fonctionné sur maOS Sierra 10.12.3 Merci!
Greg Hilston
30

Vous utilisez go install sur un répertoire en dehors du dossier GOPATH. Définissez votre variable d' environnement GOBIN ou déplacez le dossier src dans GOPATH.

GOPATH/
     bin/
     src/
       go-statsd-client/

Plus d'informations: GO BUILD Source code , ligne 296

Andrea Di Persio
la source
J'ai essayé la suggestion ci-dessus (exporter GOPATH = $ HOME), puis déplacé dans mon répertoire approprié (où j'écris mon code) et tapé go install ... même résultat go install: pas d'emplacement d'installation pour le répertoire ....
stian
La ligne 296 n'est qu'une déclaration de retour?
Felix Rabe
1
J'ai oublié de régler mon env GOBIN
cevaris
J'ai opté pour cette solution.
Mihamina Rakotomandimby
19

Vous devez configurer à la fois GOPATHet GOBIN. Assurez-vous d'avoir fait ce qui suit (veuillez le remplacer ~/gopar votre préféré GOPATHet le modifier par la suite GOBIN). Ceci est testé sur Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

La réponse choisie n'a pas résolu le problème pour moi.

Zhenhua
la source
J'ai tous les deux définis dans 16.04 et cela n'a pas fonctionné pour moi.
Catskul
5

Vous voudrez avoir 3 répertoires dans votre répertoire GOPATH choisi.

GOPATH
     /bin
     /src
       /someProgram
        program.go
       /someLibrary
        library.go
     /pkg

Ensuite, vous exécuterez go installde l'intérieur soit someProgram (qui met un exécutable dans bin) ou someLibrary (qui met une bibliothèque dans pkg).

Earl Zedd
la source
1
Cela a fonctionné pour moi après avoir cherché pendant 2 heures sur Internet.
vishalknishad
3

J'ai eu ce problème sous Windows.

Mon problème était que ma %GOPATH%variable d'environnement était définie sur

C:\Users\john\src\goworkspace

au lieu de

C:\Users\john\src\goworkspace\

L'ajout de la barre oblique manquante à la fin l'a corrigé pour moi.

Eckza
la source
1
sainte vache tu viens de me sauver d'un mal de tête potentiellement de plusieurs heures. Je suis sur Ubuntu mais j'ai eu le même problème. Était extrêmement diligent sur les noms de dossiers, la structure des dossiers, préfacé par src / github.com / xyabz / et tout sauf aller installer me donnait des erreurs.
anon58192932
3

Pour ce que ça vaut, voici mon .bash_profile, qui fonctionne bien pour moi sur un mac avec Atom, après avoir installé go avec Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
JRun
la source
2

Dans mon cas (OS X) , il a été parce que j'ai mis GOPATHà /home/username/go(selon le livre) au lieu de/Users/username/go

catamphétamine
la source
2

Je suis sous Windows, et je l'ai obtenu en donnant la commande go help gopathà cmd et en lisant le texte en gras dans l'instruction,

qui est si le code vous WNAT à installer est à ..BaseDir...\SomeProject\src\basic\setl' GOPATH ne doit pas être le même endroit que le code, il doit être juste projet de base DIR: ..BaseDir...\SomeProject.

La variable d'environnement GOPATH répertorie les endroits où rechercher du 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.

Si la variable d'environnement n'est pas définie, GOPATH utilise par défaut un sous-répertoire nommé "go" dans le répertoire personnel de l'utilisateur ($ HOME / go sous Unix,% USERPROFILE% \ go sous Windows), sauf si ce répertoire contient une distribution Go. Exécutez "go env GOPATH" pour voir le GOPATH actuel.

Voir https://golang.org/wiki/SettingGOPATH pour définir un GOPATH personnalisé.

Chaque répertoire répertorié dans GOPATH doit avoir une structure prescrite:

Le répertoire src contient le code source. Le chemin sous src détermine le chemin d'importation ou le nom de l'exécutable.

Le répertoire pkg contient les objets de package installés. Comme dans l'arborescence Go, chaque paire de système d'exploitation et d'architecture cible a son propre sous-répertoire de pkg (pkg / GOOS_GOARCH).

Si DIR est un répertoire répertorié dans le GOPATH, un paquet avec la source dans DIR / src / foo / bar peut être importé en tant que "foo / bar" et sa forme compilée est installée dans "DIR / pkg / GOOS_GOARCH / foo / bar.a ".

Le répertoire bin contient les commandes compilées. Chaque commande est nommée pour son répertoire source, mais uniquement pour l'élément final, pas pour le chemin complet. Autrement dit, la commande avec source dans DIR / src / foo / quux est installée dans DIR / bin / quux, et non dans DIR / bin / foo / quux. Le préfixe «foo /» est supprimé afin que vous puissiez ajouter DIR / bin à votre PATH pour accéder aux commandes installées. Si la variable d'environnement GOBIN est définie, les commandes sont installées dans le répertoire qu'elle nomme au lieu de DIR / bin. GOBIN doit être un chemin absolu.

Voici un exemple de disposition de répertoire:

GOPATH=/home/user/go

/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

..........

si GOPATH a été défini sur Base Project DIR et a toujours ce problème, dans Windows, vous pouvez essayer de définir GOBIN comme Base Project DIR\binou %GOPATH%\bin.

yu yang jian
la source
1

Attention lors de la course

export GOPATH=$HOME

Allez supposer que votre code existe dans des endroits spécifiques liés à GOPATH. Donc, à la place, vous pouvez utiliser docker pour exécuter n'importe quelle commande go:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

Et maintenant, vous pouvez utiliser n'importe quelle commande golang, par exemple:

go test github.com/<organization name>/<repository name> 
Omer Levi Hevroni
la source
0

Dans Windows, ma fenêtre cmd était déjà ouverte lorsque j'ai défini la variable d'environnement GOPATH. J'ai d'abord dû fermer le cmd, puis le rouvrir pour qu'il devienne efficace.

filon
la source
0

Le problème est que vous n'êtes pas dans le répertoire du package contenant le fichier go avec la fonction principale go et que go install ne peut pas trouver la commande (go file avec la fonction principale go) que vous souhaitez installer.

$ cd /path/to/file-with-main-function.go

puis exécutez:

$ go install 
Margach Chris
la source
-1

Sur OSX Mojave 10.14, goest généralement installé à /usr/local/go.

Par conséquent, configurez ces ENV et vous devriez être prêt à partir.

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

Ajoutez-les également à votre bash_profileou zsh_profilesi cela fonctionne.

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

Un pointeur nul
la source