2014-12-09 2 views
5

У меня есть виртуальная машина Linux, где я пытаюсь скомпилировать простой пакет Go. Пакет был возвращен в мой каталог пользователя с мерзавцем:Что заставляет «go build» терпеть неудачу с «неожиданным NUL во вводе»?

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

Я создал GOPATH и сборки:

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

До сих пор так хорошо. Но теперь, когда я пытаюсь построить снова, он терпит неудачу:

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

Удаление файла test.go перед сборкой позволит ему строить. Но это неудобно, потому что такие инструменты, как github.com/codegangsta/gin, которые пытаются перестроить пакет, потерпят неудачу.

ответ

3

Репозиторий был назван [...]/test.go, а каталог контейнера по умолчанию для git clone - это имя репо, поэтому содержащая директория имеет имя test.go\.

От go help build:

Если пакет является основным и предоставляются имена файлов, имя файла происходит от имени файла упоминается, например, f1 для «идти строить f1.go f2.go «; без файлов ('go build'), выходной файл имя является базовым именем содержащего каталога.

В этом случае выход представляет собой файл с именем test.go. Проблема заключается в том:

В каталог, содержащий пакет, .go, .c, .h и .s файлы рассматриваются как часть пакета

Во время go build если вывод из предыдущей сборки, test.go, существует, он будет рассматриваться как исходный файл, инициирующий сообщение «неожиданный NUL in input».

Проблема может быть решена путем переименования каталога, чтобы избежать выхода сборки, имеющего имя, которое будет считаться частью пакета.

Смежные вопросы