2014-12-09 6 views
5

Ho una VM Linux in cui sto cercando di compilare un semplice pacchetto Go. Il pacchetto è stato recuperato nella mia directory utente con git:Che cosa fa fallire "go build" con "NUL inaspettato in input"?

$ git clone [...]/test.go 
Cloning into 'test.go'... 
done. 
$ cd test.go/ 
$ ls 
main.go 

Mi è stata GOPATH e costruire:

$ export GOPATH=$PWD; echo $GOPATH 
/home/vagrant/test.go 
$ go build 
$ ls 
main.go test.go* 

Fin qui tutto bene. Ma ora quando provo a costruire di nuovo, non riesce:

$ go build 
can't load package: package .: read /home/vagrant/test.go/test.go: unexpected NUL in input 

L'eliminazione del file test.go prima di costruire le consentirà di costruire. Ma questo è scomodo perché strumenti come github.com/codegangsta/gin che provano a ricostruire il pacchetto falliranno.

risposta

3

Il repository è stato denominato [...]/test.go e la directory contenitore predefinita per git clone è il nome del repository, pertanto la directory che contiene è denominata test.go\.

Da go help build:

Se il pacchetto è principale e nomi dei file sono forniti, il nome del file deriva dal nome del file menzionato, come ad esempio f1 per 'andare costruire f1.go f2.go '; senza file forniti ('go build'), il nome del file di output è il nome di base della directory che lo contiene.

In questo caso, l'output è un file denominato test.go. Il problema è:

Nella directory che contiene il pacchetto, .Vai, .c, .h, e .s file vengono considerati parte del pacchetto

Durante una go build se l'output di una build precedente, test.go, esiste, verrà trattato come un file di origine, attivando il messaggio "NUL inaspettato in ingresso".

Il problema può essere risolto rinominando la directory per evitare che l'output di build abbia un nome che verrà considerato parte del pacchetto.