2012-11-03 13 views
59

Anche se ho GOPATH impostato correttamente, non riesco ancora a ottenere "go build" o "go run" per trovare i miei pacchetti. Che cosa sto facendo di sbagliato? Grazie mille!Go build: "Impossibile trovare il pacchetto" (anche se GOPATH è impostato)

$ 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 
+0

Io incontro lo stesso problema quando vado a ottenere https://github.com/adonovan/gopl.io/tree/master/ch1/helloworld Il motivo deve essere che non ha file di nome helloworld.go. go get funziona abbinando il nome del pacchetto e il nome del file. –

risposta

78

Non funziona perché il file di origine foobar.go non è in una directory chiamata foobar. go build e go install tenta di far corrispondere le directory, non i file di origine.

  1. Impostare $GOPATH in una directory valida, ad es. export GOPATH="$HOME/go"
  2. Spostare foobar.go a $GOPATH/src/foobar/foobar.go e l'edificio dovrebbe funzionare correttamente.

Ulteriori passi consigliati:

  1. Aggiungi $GOPATH/bin al vostro $PATH da: PATH="$GOPATH/bin:$PATH"
  2. Spostare main.go in una sottocartella di $GOPATH/src, per esempio $GOPATH/src/test
  3. go install test ora dovrebbe creare un file eseguibile in $GOPATH/bin che può essere chiamato digitando test nel terminale.
+0

Non è un bug? Il mio 'GOPATH =/usr/local/go-pkgs', quindi Go controlla in'/usr/local/go-pkgs/src/ 'per il sorgente, ma' go get' lo mette in '/ usr// go-pkgs/src/gopkg.in/ locale '. Perché dovrei spostare manualmente tutti i miei pacchetti dopo l'installazione? È semplicemente sciocco. – josiah

+1

'go get' normalmente colloca i pacchetti in' $ GOPATH/src/'quindi se chiami' go get domain.com/path/to/package' finirà in '$ GOPATH/src/domain.com/path/a/package'. Immagino tu provi a recuperare un pacchetto da 'gopkg.in'? Se è così che è un comportamento assolutamente intenzionale e dovresti semplicemente importarli con il loro nome completo; per esempio. 'importa" gopkg.in/yaml.v1 "' come anche [descritto nei documenti] (https://gopkg.in/yaml.v1). – fasmat

+0

Ahhhh, capisco. Grazie per aver dissipato la mia ignoranza. – josiah

6

Edit: dal momento che si intende GOPATH, vedere fasmat s' answer (upvoted)

Come accennato in "How do I make go find my package?", è necessario mettere un pacchetto xxx in una directory xxx.

Vedere il Go language spec:

package math 

Un insieme di file che condividono lo stesso modulo PackageName l'attuazione di un pacchetto.
Un'implementazione potrebbe richiedere che tutti i file di origine per un pacchetto abitino la stessa directory.

Il Code organization menzioni:

Quando si costruisce un programma che importa il pacchetto "widget" il comando go cerca src/pkg/widget all'interno della radice Go, e poi, se la sorgente del pacchetto non viene trovato -le ricerche per src/widget all'interno di ogni area di lavoro nell'ordine.

(un "spazio di lavoro" è una voce di percorso nel GOPATH: questa variabile può fare riferimento a percorsi multipli per il vostro 'src, bin, pkg' essere)


(risposta originale)

È inoltre impostare GOPATH in ~/go, non GOROOT, come illustrato in "How to Write Go Code".

Il percorso Vai viene utilizzato per risolvere le istruzioni di importazione. È implementato e documentato nel pacchetto go/build.

La variabile di ambiente GOPATH elenca i posti in cui cercare il codice Go.
Su Unix, il valore è una stringa separata da due punti.
Su Windows, il valore è una stringa separata da punto e virgola.
Nel piano 9, il valore è un elenco.

che è diversa da GOROOT:

Le distribuzioni binarie Go supporre che saranno installati in /usr/local/go (o c:\Go in Windows), ma è possibile installarli in una posizione diversa.
Se si esegue questa operazione, sarà necessario impostare la variabile di ambiente GOROOT in quella directory quando si utilizzano gli strumenti Vai.

+3

C'è anche un [breve video introduttivo] (https://www.youtube.com/watch?feature=player_embedded&v=XCsL89YtqCs&noredirect=1) per configurare GOPATH –

+0

Spiacente, ho modificato la domanda originale. Ovunque dicessi GOROOT I * significava * GOPATH. – MitchellSalad

-2

Hai provato aggiungendo la directory assoluto di andare al 'percorso'?

export PATH=$PATH:/directory/to/go/ 
0

TL; DR: Seguire le convenzioni di Go! (lezione appresa nel modo più duro), verifica le versioni precedenti e remove. Installa l'ultima

Per me la soluzione era diversa. Ho lavorato su un server Linux condiviso e dopo aver verificato il mio GOPATH e altre variabili di ambiente diverse volte non funzionava ancora. Ho riscontrato diversi errori tra cui "Impossibile trovare il pacchetto" e "percorso di importazione non riconosciuto". Dopo aver provato a reinstallare con la soluzione this tramite le istruzioni su golang.org (inclusa la parte uninstall) si sono verificati ancora problemi.

ho messo del tempo per rendersi conto che c'è ancora una vecchia versione che non è stato disinstallato (in esecuzione go version poi di nuovo which go ... dahh), che mi ha fatto this domanda e finalmente risolto.

Problemi correlati