Я только что собрал пакет Go, который станет частью довольно большой системы с большим количеством общих пакетов. Я смог заставить его скомпилировать, написав свой Makefile так, чтобы компилятор вызывался с флагами -I:
include $(GOROOT)/src/Make.inc
TARG=foobar
GOFILES=\
foobar.go\
foobar:
$(GC) -I$(CURDIR)/../intmath -I$(CURDIR)/../randnum foobar.go
include $(GOROOT)/src/Make.pkg
Он отлично компилируется, и, будучи хорошим мальчиком, я написал полный набор тестов. Однако, когда я пытаюсь запустить тесты с gotest
, я получаю ошибку компиляции:
$ gotest
rm -f _test/foobar.a
8g -o _gotest_.8 foobar.go foobar_test.go
foobar.go:4: can't find import: intmath
make: *** [_gotest_.8] Error 1
gotest: "C:\\msys\\bin\\sh.exe -c \"gomake\" \"testpackage\" \"GOTESTFILES=foobar_test.go\"" failed: exit status 2
Итак, сам файл Go будет компилироваться, когда я использую флаги -I
, чтобы указать ему, где искать пакеты intmath и randnum, но gotest
, похоже, не использует Makefile.
Отвечая на вопрос peterSO:
Раздел импорта foobar.go выглядит так:
import (
"intmath"
"randnum"
"container/vector"
)
И компиляция работает нормально, пока у меня есть флаги -I
, идущие к компилятору. Я пытался использовать относительные пути, как это:
import (
"../intmath"
"../randnum"
"container/vector"
)
но это, похоже, не работает.
РЕДАКТИРОВАТЬ: отвечая на дальнейшие вопросы peterSO:
GOROOT установлен в C:\Go
каталог, в котором у меня установлены все компоненты Go - кроме моего исходного кода -. Я ожидал, что относительный путь будет относительно каталога, в котором находится исходный файл.
Мое исходное дерево выглядит так:
server/
foobar/
randnum/
intmath/
Итак, хотя я открыт для другой, более идиоматической структуры каталогов, мой инстинкт состоит в том, чтобы упорядочить их как одноранговые.
Можно ли как-нибудь подтолкнуть gotest
к компиляции foobar.go с необходимыми флагами?