我刚刚整合了一个Go包,它将成为一个包含大量共享包的相当大的系统的一部分。我能够通过编写Makefile来编译它,以便使用-I flags调用编译器:
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
因此,当我使用-I
标志告诉它在哪里找到intmath和randnum包时,Go文件本身会编译,但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/
所以,虽然我对另一个更具有Go-idiomatic的目录结构持开放态度,但我的直觉是将它们安排为同伴。
是否有某种方法可以轻率gotest
使用所需的标志编译foobar.go?
答案 0 :(得分:1)
创建Windows源代码目录结构:
C:\server
C:\server\foobar
C:\server\intnum
对于intnum.go:
package intnum
func IntNum() int {
return 42
}
生成文件:
include $(GOROOT)/src/Make.inc
TARG=server/intnum
GOFILES=\
intnum.go\
include $(GOROOT)/src/Make.pkg
执行命令
$ cd c/server/intnum
$ make install
对于foobar.go:
package foobar
import (
"math"
"server/intnum"
)
func FooBar() float64 {
return float64(intnum.IntNum()) * math.Pi
}
生成文件:
include $(GOROOT)/src/Make.inc
TARG=server/foobar
GOFILES=\
foobar.go\
include $(GOROOT)/src/Make.pkg
执行命令
$ cd /c/server/foobar
$ make install
安装完成后,intnum.a
和foobar.a
包文件将位于$GOROOT\pkg\windows_386\server
(C:\Go\pkg\windows_386\server
)目录中。