我可以制作gotest pass编译器标志吗?

时间:2011-07-26 20:13:58

标签: go

我刚刚整合了一个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的问题: foob​​ar.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?

1 个答案:

答案 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.afoobar.a包文件将位于$GOROOT\pkg\windows_386\serverC:\Go\pkg\windows_386\server)目录中。