GOBIN non impostato: impossibile eseguire go install


86

Sto cercando di installare il mio pacchetto personalizzato per il mio file main.go. Tuttavia, quando ho corso

go install custom.go

Ho ricevuto questo errore

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

Come imposto GOBIN?


16
BTW: questo è un modo completamente sbagliato per installare un pacchetto. Questo non funzionerà mai. go installinstalla pacchetti non singoli file. Si prega di leggere tutto golang.org/cmd/go e vedere come impostare i file.
Volker

Grazie per il testa a testa!
user3918985

2
Penso che tu stia cercando di costruire.
bunnybare

2
Non sono sicuro di essere d'accordo che sia completamente sbagliato. Quando è impostato GOBIN, ci sono due comportamenti distinti: Quando si utilizza go build <gofile.go>, l'eseguibile viene creato nella stessa cartella. Quando si utilizza go install <gofile.go>, l'eseguibile viene creato in GOBIN.
Erez A. Korn

2
FWIW: i documenti predefiniti per iniziare consigliano di fare esattamente questo. golang.org/doc/install
Mike Buckbee

Risposte:


46

Aggiornamento 2020: a partire dal Go 1.11 e dall'introduzione dei moduli Go , GOPATHnon è più necessario per progetto e il valore predefinito è~/go per gli strumenti / progetto globali che vorresti go get.

Go 1.16 (Q1 2020) dovrebbe essere impostato GOBINcome GOPATH[0]/bin predefinito .

Ma per ora, per qualsiasi progetto che utilizza i moduli, non avresti più un messaggio di errore come " go install: no install location ...".


Risposta originale 2014:

Controlla la tua GOPATHvariabile.
Assicurarsi:

  • le tue fonti sono sotto GOPATH/src
  • hai una bincartella all'interno della tua cartella GOPATH.

Vedi la variabile d'ambiente GOPATH (dove 'DIR' è una GOPATHcartella):

La bindirectory contiene i comandi compilati.
Ogni comando prende il nome dalla sua directory di origine, ma solo l'elemento finale, non l'intero percorso. Cioè, il comando con source in DIR/src/foo/quuxè installato in DIR/bin/quux, not DIR/bin/foo/quux. Il foo/prefisso " " viene rimosso in modo da poterlo aggiungere DIR/binal tuo PATHper ottenere i comandi installati.

Se la GOBINvariabile d'ambiente è impostata, i comandi vengono installati nella directory che nomina invece di DIR/bin. GOBINdeve essere un percorso assoluto.


Ad esempio, questo thread illustra cosa succede nel caso in cui una build go viene eseguita al di fuori di GOPATH/src:

Sembra che il tuo GOPATHsia impostato su ~/goma hai eseguito il go installcomando su~/dev/go

Vedi Go Build

Il percorso Go è un elenco di alberi di directory contenenti il ​​codice sorgente di Go. Viene consultato per risolvere le importazioni che non possono essere trovate nell'albero Go standard.

Se lo hai fatto go build, puoi anche provare un go install(no custom.go): vuoi installare il pacchetto, non un singolo file.


vuoi dire questo? Ho echo $ PATH e ho ottenuto questo: / 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

Ho impostato il percorso GOBIN e ha funzionato per me

export GOBIN=[WorkspacePath]/bin

2
sì, questa è la risposta corretta. basta creare / bin in quel GOPATH
swdev

7
Dopo il percorso di esportazione, ho ricevuto l'errore cannot install, GOBIN must be an absolute path:(
lee

@lee Hai usato ..o ~nel percorso che hai specificato? Ho ricevuto quell'errore e sono passato a un percorso assoluto come /home/ben/bin/o anche $HOME/bin/. Il mio comando completo era (in fishshell, vai v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan

40

Come principiante, mi sono imbattuto in questo errore mentre stavo provando vari comandi go (build, run e install). In breve, non puoi installare un file nomefile.go . Puoi installare solo un pacchetto.

Questo creava confusione, perché avevo imparato che:

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

funziona alla grande. Ma non sono riuscito a capire perché l' installazione non avrebbe funzionato:

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)

Non importa in quale directory mi trovassi:

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)

Questa confusione è dovuta al fatto che go run funziona solo con i file sorgenti di Go (nomi di file che terminano con .go) e go install accetta solo pacchetti. I pacchetti vengono denominati in base ai percorsi di importazione o al percorso del file system. Quindi:

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

funzionano tutti alla grande. Il primo si riferisce al pacchetto tramite il percorso di importazione, (dato che $ GOPATH = "/ home / nate / work", gli strumenti go cercano il codice sorgente in / home / nate / work / src), gli altri sono interpretati come file system percorsi a causa dei periodi principali.

Vedi anche i documenti GOPATH .


1
questa è la vera soluzione IMO. go installfunziona sulle directory e se si specifica un particolare file go, può causare questo particolare problema.
senseiwu

13

In realtà ci sono 2 diversi tipi di comportamento.

go install <package>

questo è documentato in Compilare e installare pacchetti e dipendenze Non è necessario GOBIN se si imposta GOPATH correttamente.

go install <gofile>

questo non è documentato e in questa modalità è necessaria la variabile env GOBIN.


1
go install <gofile>è documentato, go help packagesa cui go install --helpfa riferimento. Il problema è che go install(in 1.9.2 e precedenti) ha un comportamento incoerente, in un caso richiede e in altri non richiede che GOBIN sia impostato esplicitamente.
Stevo Slavić

7

Come le risposte precedenti hanno sottolineato, se il tuo GOPATH env è impostato correttamente sul tuo spazio di lavoro non è necessario impostare la variabile GOBIN env.

Per favore controlla le tue variabili d'ambiente go eseguendo $ go env | grep -i "^ GO" e cerca GOROOT e GOPATH per verificare se GOROOT punta alla tua installazione sorgente GO e GOPATH punta al tuo spazio di lavoro.

Se tutto è corretto, vai alla sottodirectory in cui risiede yourpkg.go quindi esegui $ go build (senza nome file) prima e $ go install (di nuovo senza nome file) secondo, se non vedi alcun messaggio di errore sullo schermo il tuo pacchetto è pronto nella tua area di lavoro / pkg / youros /../ yourpackage.a


7

Su Windows con cygwin sembra essere una buona idea impostare GOBIN su $ GOPATH / bin.

e ricorda di uscire correttamente dal separatore del nome del file di 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

5

Per il *nixsistema, guarda dove goè installato, eseguendo il seguente comando:

$ which go

quale uscita diciamo:

/usr/local/go/bin/go

quindi aggiungi le seguenti voci in ~/.bash_profileo in ~/.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: non dimenticare di fonte ~/.bash_profileo ~/.zshrc, come segue:

$ source ~/.bash_profile

5
Vuoi davvero inserire gli eseguibili di sviluppo /usr/local/go/bin?
Dolph

1

Per quanto riguarda l'impostazione della GOBINversione variabile non richiederla e fare affidamento solo su GOPATH:

  1. GOBINè richiesto se non abbiamo un pacchetto, cioè il file è direttamente nella GOPATHdirectory. Questo è probabile quando proviamo le funzionalità Go come studenti

  2. Per i progetti Go tipici, i file si trovano nelle directory dei pacchetti. Per questi, GOPATHè abbastanza buono.

  3. In altre parole, entrambe le soluzioni seguenti funzionerebbero: a. Impostato GOBINesplicitamente come $ GOPATH / bin [solo per scopi di apprendimento, può evitare] b. Crea una sottodirectory che sarebbe il nome del tuo pacchetto e sposta i file .go su di essa

  4. Immagino che le utilità Go dovrebbero rimuovere l'errore precedente e gestire meglio lo scenario, a seconda che l'argomento sia una directory o un file di origine


1

Per gli utenti WINDOWS

Apri un prompt dei comandi ( Win+ rquindi digita cmd) o una finestra PowerShell ( Win+ xquindi digita i).

Impostazione del GOPATH

NOTA: GOPATH non deve essere lo stesso percorso dell'installazione di Go.

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

Maggiori dettagli nel link sottostante https://github.com/golang/go/wiki/SettingGOPATH#windows

Impostazione di GOBIN

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

Consiglio di controllare l'esempio di codice fornito da golang. Mi ha aiutato molto. https://golang.org/doc/code.html#Command


1

In Windows:

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

Confermare con il go envcomando che GOBIN sia impostato, quindi il go installcomando salva correttamente l'eseguibile correttamente nella directory bin.


1

Anch'io ho avuto lo stesso problema (GOBIN non deve essere impostato separatamente), assicurati di avere quanto segue

  1. GOPATH è impostato (questo imposta automaticamente anche GOBIN come $ GOPATH / bin)
  2. GOPATH ha le seguenti directory bin, pkg, src
  3. custom.go si trova sotto src / <your_module>
  4. quindi corri go install <your_module>
  5. puoi trovare il controllo per il binario compilato (<your_module>) nella cartella bin

0

Non hai bisogno di $ GOBIN se hai impostato correttamente un $ GOPATH . In tal caso, ricontrolla semplicemente se il tuo progetto risiede nella cartella $ GOPATH / src .


0

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

GOBIN La directory in cui 'go install' installerà un comando.

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

Se la variabile di ambiente GOBIN è impostata, i comandi vengono installati nella directory che nomina invece di DIR / bin. GOBIN deve essere un percorso assoluto.

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

In modalità module-aware, GOPATH non definisce più il significato delle importazioni durante una compilazione, ma memorizza comunque le dipendenze scaricate (in GOPATH / pkg / mod) e i comandi installati (in GOPATH / bin, a meno che non sia impostato GOBIN).

Quindi, sembra fondamentalmente che tu possa usare GOBIN per sovrascrivere temporaneamente o permanentemente la posizione di installazione binaria predefinita (cioè $GOPATH/bin). Ho avuto successo installando uno "script" da 1 file usando env GOBIN=$HOME/bin/ go install testfile.go. Questo è stato fatto usando go v1.11.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.