GOBIN non défini: impossible d'exécuter go install

86

J'essaye d'installer mon package personnalisé pour mon fichier main.go. Cependant, quand j'ai couru

go install custom.go

J'ai cette erreur

go install: no install location for .go files listed on command line (GOBIN not set)

Comment configurer GOBIN?

user3918985
la source
16
BTW: C'est une manière complètement fausse d'installer un paquet. Cela ne fonctionnera jamais. go installinstalle des packages et non des fichiers individuels. Veuillez lire l'intégralité de golang.org/cmd/go et voir comment configurer vos fichiers.
Volker
Merci pour l'information!
user3918985
2
Je pense que vous cherchez à construire.
bunnybare
2
Je ne suis pas sûr d'être d'accord pour dire que c'est complètement faux. Lorsque GOBIN est défini, il existe deux comportements distincts: Lors de l'utilisation de go build <gofile.go>, l'exécutable est créé dans le même dossier. Lors de l'utilisation de go install <gofile.go>, l'exécutable est créé dans GOBIN.
Erez A. Korn
2
FWIW - les documents par défaut pour commencer vous recommandent de faire exactement cela. golang.org/doc/install
Mike Buckbee

Réponses:

46

Mise à jour 2020: depuis Go 1.11 et l' introduction des modules Go , GOPATHn'est plus nécessaire par projet, et par défaut~/go pour les outils / projets globaux que vous auriez go get.

Go 1.16 (Q1 2020) doit être défini par défaut GOBINsur GOPATH[0]/bin .

Mais pour l'instant, pour tout projet utilisant des modules, vous n'auriez plus de message d'erreur comme " go install: no install location ...".


Réponse originale 2014:

Vérifiez votre GOPATHvariable.
Assure-toi:

  • vos sources sont sous GOPATH/src
  • vous avez un bindossier dans votre dossier GOPATH.

Voir la variable d'environnement GOPATH (où 'DIR' est un GOPATHdossier):

Le binrépertoire 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 in DIR/src/foo/quuxest installée dans DIR/bin/quux, non DIR/bin/foo/quux. Le foo/préfixe " " est supprimé afin que vous puissiez l'ajouter DIR/binà votre PATHpour accéder aux commandes installées.

Si la GOBINvariable d'environnement est définie, les commandes sont installées dans le répertoire qu'elle nomme à la place DIR/bin. GOBINdoit être un chemin absolu.


Par exemple, ce fil illustre ce qui se passe dans le cas où une construction go est effectuée en dehors de GOPATH/src:

On dirait que votre GOPATHest réglé sur ~/gomais vous avez exécuté la go installcommande~/dev/go

Voir Go Build

Le chemin Go est une liste d'arborescences de répertoires contenant le code source Go. Il est consulté pour résoudre les importations introuvables dans l'arborescence Go standard.

Si vous avez fait go build, vous pouvez également essayer un go install(non custom.go): vous voulez installer le package, pas un seul fichier.

VonC
la source
Est-ce que tu veut dire ça? J'ai fait echo $ PATH et j'ai obtenu ceci: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / go / bin: / usr / local / mysql / bin
user3918985
76

J'ai tracé la voie de GOBIN et cela a fonctionné pour moi

export GOBIN=[WorkspacePath]/bin
Pratik Goenka
la source
2
oui, c'est la bonne réponse. il suffit de créer / bin dans ce GOPATH
swdev
7
Après le chemin d'exportation, j'ai eu l'erreur cannot install, GOBIN must be an absolute path:(
lee
@lee Avez-vous utilisé ..ou ~dans le chemin que vous avez spécifié? J'ai eu cette erreur et je suis juste passé à un chemin absolu tel que /home/ben/bin/ou même $HOME/bin/. Ma commande complète était (dans Fishshell, allez v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan
40

En tant que débutant, j'ai rencontré cette erreur lorsque j'essayais diverses commandes go (construire, exécuter et installer). Bref, vous ne pouvez pas aller installer un filename.go . Vous ne pouvez installer qu'un package.

C'était déroutant, car j'avais appris que:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

fonctionne très bien. Mais je ne pouvais pas comprendre pourquoi l' installation ne fonctionnerait pas:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Quel que soit le répertoire dans lequel je me trouvais:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Cette confusion est parce que l' exécution de go ne fonctionne avec les fichiers sources Go (noms de fichiers qui se terminent par .go) et aller installer uniquement accepte les paquets. Les packages sont nommés par leur chemin d'importation ou le chemin du système de fichiers. Donc:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

tout fonctionne très bien. Le premier fait référence au package par chemin d'importation, (étant donné que $ GOPATH = "/ home / nate / work", les outils go recherchent le code source dans / home / nate / work / src), les autres sont interprétés comme un système de fichiers chemins en raison des périodes de pointe.

Voir aussi la documentation GOPATH .

Nate Green
la source
1
c'est la vraie solution IMO. go installfonctionne sur les répertoires et si vous spécifiez un fichier go particulier, cela peut causer ce problème particulier.
senseiwu
13

En fait, il existe 2 types de comportement différents.

go install <package>

ceci est documenté dans Compiler et installer des packages et des dépendances. Vous n'avez pas besoin de GOBIN si vous définissez GOPATH correctement.

go install <gofile>

cela n'est pas documenté et vous avez besoin de la variable d'environnement GOBIN dans ce mode.

PickBoy
la source
1
go install <gofile>est documenté, go help packagesauquel go install --helpfait référence. Le problème est que go install(dans la version 1.9.2 et les versions antérieures) a un comportement incohérent, dans un cas, il nécessite et dans l'autre, il ne nécessite pas que GOBIN soit explicitement défini.
Stevo Slavić
7

Comme les réponses précédentes l'ont souligné, si votre env GOPATH est correctement défini sur votre espace de travail, vous n'avez pas besoin de définir la variable d'environnement GOBIN.

Veuillez vérifier vos variables d'environnement go en exécutant $ go env | grep -i "^ GO" et recherchez GOROOT et GOPATH pour vérifier si GOROOT pointe vers votre installation source GO et GOPATH pointe vers votre espace de travail.

Si tout est correct, accédez au sous-répertoire où réside votre pkg.go, puis exécutez d'abord $ go build (sans nom de fichier) et $ go install (encore une fois sans nom de fichier) ensuite, si vous ne voyez aucun message d'erreur à l'écran, votre package est prêt dans votre espace de travail / pkg / youros /../ yourpackage.a

user42754
la source
7

Sur Windows avec cygwin, il semble être une bonne idée de configurer GOBIN sur $ GOPATH / bin.

et n'oubliez pas d'échapper correctement au séparateur de nom de fichier Windows:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin
Reliure Carl
la source
5

Pour le *nixsystème, regardez où goest installé, en exécutant la commande suivante:

$ which go

quelle sortie disons:

/usr/local/go/bin/go

puis ajoutez les entrées suivantes dans ~/.bash_profileou dans ~/.zshrc:

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PS: n'oubliez pas de vous procurer ~/.bash_profileou ~/.zshrc, comme suit:

$ source ~/.bash_profile
Arpit Aggarwal
la source
4
Voulez-vous vraiment insérer des exécutables de développement /usr/local/go/bin?
Dolph
1

En ce qui concerne la configuration de la GOBINversion de la variable ne l'exigeant pas et se basant simplement sur GOPATH:

  1. GOBINest nécessaire si nous n'avons pas de package, c'est-à-dire que le fichier est directement dans le GOPATHrépertoire. Cela est probable lorsque nous essayons les fonctionnalités Go en tant qu'apprenants

  2. Pour les projets Go classiques, les fichiers se trouvent dans les répertoires du package. Pour ceux-ci, GOPATHc'est assez bien.

  3. En d'autres termes, les deux solutions suivantes fonctionneraient: a. Définir GOBINexplicitement comme $ GOPATH / bin [uniquement à des fins d'apprentissage, peut éviter] b. Créez un sous-répertoire qui serait le nom de votre package et déplacez-y les fichiers .go

  4. Je suppose que les utilitaires Go devraient supprimer l'erreur ci-dessus et mieux gérer le scénario - selon que l'argument est un répertoire ou un fichier source

pr-pal
la source
1

Pour les utilisateurs de WINDOWS

Ouvrez une invite de commande ( Win+ rpuis tapez cmd) ou une fenêtre PowerShell ( Win+ xpuis tapez i).

Réglage du GOPATH

REMARQUE: GOPATH ne doit pas être le même chemin que votre installation Go.

go env -w GOPATH=c:\your-go-work

Plus de détails dans le lien ci-dessous https://github.com/golang/go/wiki/SettingGOPATH#windows

Réglage de GOBIN

go env -w GOBIN=C:\somewhere\else\bin

Je recommande de vérifier l'exemple de code fourni par golang. Cela m'a beaucoup aidé. https://golang.org/doc/code.html#Command

Henri
la source
1

Sous Windows:

go env -w GOBIN=C:\Users\yourname\go\bin

Confirmez avec la go envcommande que GOBIN est défini, puis la go installcommande enregistre correctement l'exécutable correctement dans le répertoire bin.

Frankie Wong
la source
1

J'ai aussi eu le même problème (GOBIN n'a pas besoin d'être réglé séparément), assurez-vous d'avoir les éléments suivants

  1. GOPATH est défini (cela définit également automatiquement GOBIN comme $ GOPATH / bin)
  2. GOPATH a les répertoires suivants bin, pkg, src
  3. custom.go est placé sous src / <your_module>
  4. puis courir go install <your_module>
  5. vous pouvez trouver la vérification du binaire compilé (<votre_module>) dans le dossier bin
Manjunath Bhadrannavar
la source
0

Vous n'avez pas besoin de $ GOBIN si vous avez correctement défini un $ GOPATH . Si tel est le cas, revérifiez simplement si votre projet réside dans le dossier $ GOPATH / src .

theVoogie
la source
0

Depuis https://golang.org/cmd/go/#hdr-Environment_variables :

GOBIN Le répertoire où «go install» installera une commande.

et https://golang.org/cmd/go/#hdr-GOPATH_environment_variable :

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.

et https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

En mode module-aware, GOPATH ne définit plus la signification des importations lors d'une construction, mais il stocke toujours les dépendances téléchargées (dans GOPATH / pkg / mod) et les commandes installées (dans GOPATH / bin, sauf si GOBIN est défini).

Donc, il semble que vous pouvez utiliser GOBIN pour remplacer temporairement ou définitivement l'emplacement d'installation binaire par défaut (ie $GOPATH/bin). J'ai réussi à installer un "script" à 1 fichier en utilisant env GOBIN=$HOME/bin/ go install testfile.go. Cela a été fait en utilisant go v1.11.

Benny Jobigan
la source
0

Essayer

export GOROOT=""

export PATH=$PATH:$GOROOT/bin

Thiên Trần
la source