8

我正在使用 GVM 来管理我的 go 安装和路径,一切似乎都运行良好——我可以运行测试并生成构建。我现在正在尝试生成代码覆盖率文件并且遇到了一些困难。

我的包定义在/home/bill/dev/server/model.

当我运行时:

$ go test -cover -coverprofile cover.out

测试成功运行并生成了一个覆盖文件。但是,coverage 文件中的路径如下所示:

_/home/bill/dev/server/model/activity.go:19.34,21.2 1 1

当我尝试创建 html 封面文件时出现以下错误:

$ go tool cover -html=cover.out

cover: can't find "activity.go": cannot find package "_/home/bill/dev/server/model/" in any of:
    /home/bill/.gvm/gos/go1.2/src/pkg/_/home/bill/dev/server/model (from $GOROOT)
    /home/bill/.gvm/pkgsets/go1.2/global/src/_/home/bill/dev/server/model (from $GOPATH)

我该如何解决?

额外细节

~ gvm use go1.2
Now using version go1.2

~ echo $GOPATH
/home/bill/.gvm/pkgsets/go1.2/global

~ echo $GOROOT
/home/bill/.gvm/gos/go1.2

我尝试手动设置我的 $GOPATH 但这并没有改变 cover.out 文件。我也尝试手动编辑 cover.out 文件,但我无法弄清楚它真正想要的路径。在上面显示的默认配置中,运行go test按预期运行。

尝试修复 GOPATH

~ export GOPATH=/home/bill/dev/
~ ln -s /home/bill/dev/server /home/bill/.gvm/gos/go1.2/src

~ go test
cannot find package "code.google.com/p/go.crypto/pbkdf2" in any of:
/home/bill/.gvm/gos/go1.2/src/pkg/code.google.com/p/go.crypto/pbkdf2 (from $GOROOT)
/home/bill/dev/src/code.google.com/p/go.crypto/pbkdf2 (from $GOPATH)
../util/log.go:4:2: cannot find package "github.com/kr/pretty" in any of:
/home/bill/.gvm/gos/go1.2/src/pkg/github.com/kr/pretty (from $GOROOT)
/home/bill/dev/src/github.com/kr/pretty (from $GOPATH)

这些是我之前使用go get. 它们最终位于 $GOPATH 曾经指向的 /home/bill/.gvm/pkgsets/go1.2/global/src 中。所以我改变了GOPATH

~ export GOPATH=/home/bill/dev/:/home/bill/.gvm/pkgsets/go1.2/global

这样测试再次运行,但 cover.out 文件中仍然有相同的目录并且仍然给我同样的错误。

4

4 回答 4

12

这是获得 GVM 的所有优势的方法,而无需破坏此处描述的理想 Go 开发环境,也无需求助于笨拙的特殊情况符号链接黑客。

假设我已经根据标准设置了我的所有开发~/go(所以foo我的 github 中的包将在~/go/github.com/gepoch/foo

首先,我们将创建一个特殊用途的 pkgset,它可以愉快地引用我们的开发环境。只需运行:

$ gvm pkgset create dev

这将添加 pkgset。接下来,我们可以对 go 路径的确切位置进行一些自定义。跑:

$ gvm pkgenv dev

您应该会看到您最喜欢的文本编辑器弹出并带有一堆环境变量定义。只需更改GOPATH条目以包含您的开发根!例如,我改变这个:

export GOPATH; GOPATH="$GVM_ROOT/pkgsets/go1.2/dev"

进入这个:

export GOPATH; GOPATH="$GVM_ROOT/pkgsets/go1.2/dev:$HOME/go"

此外,通过更改以下内容让 gvm 正确设置您的路径:

export PATH; PATH="${GVM_ROOT}/pkgsets/go1.2/global/bin:${GVM_ROOT}/gos/go1.2/bin:${GVM_OVERLAY_PREFIX}/bin:${GVM_ROOT}/bin:${PATH}"

进入这个:

export PATH; PATH="${GVM_ROOT}/pkgsets/go1.2/global/bin:${GVM_ROOT}/gos/go1.2/bin:${GVM_OVERLAY_PREFIX}/bin:${GVM_ROOT}/bin:${PATH}:$HOME/go/bin"

重启你的终端,就是这样!无论何时运行$ gvm pkgset use dev,您都可以轻松访问您的开发环境。

这意味着(除其他外)这可以按预期工作:

$ go test -coverprofile=coverage.out github.com/gepoch/foo
$ go tool cover -html=coverage.out

您可以将其添加到您希望的任何 pkgset 环境中,以便轻松访问开发树。

于 2014-02-20T03:10:59.567 回答
10

一个月前我遇到了同样的问题。我通过使用以下步骤解决了它。

我的包名叫做alpaca

我的工作目录(代码)是/home/pksunkara/coding/alpaca

$ gvm use go1.2
Now using version go1.2

$ echo $GOPATH
/usr/local/lib/gvm/pkgsets/go1.2/global

$ echo $GOROOT
/usr/local/lib/gvm/gos/go1.2

为了解决这个问题,我这样做了

$ mkdir -p $GOPATH/src/github.com/pksunkara
$ ln -s /home/pksunkara/coding/alpaca $GOPATH/src/github.com/pksunkara/alpaca

基本上我必须将当前工作文件夹链接到该$GOPATH/src文件夹​​中,并且生成的包路径alpacagithub.com/pksunkara/alpaca.

现在,go test & cover 的工作方式如下

$ go test -coverprofile=coverage.out github.com/pksunkara/alpaca
$ go tool cover -html=coverage.out

这个很重要

我绊倒了很多来解决这个问题。我已经尝试过各种事情,包括你尝试过的事情。我通过阅读 golang 中的代码组织来理解这个问题,这对于使用 go 的每个人来说都是必读的。

这里提到的代码组织对于使用 golang 非常重要。

包路径对于 golang 很重要。在 golang 中导入时,您永远不应该使用本地路径。它们会起作用,但不建议这样做。

假设您的包名是model. 您可以简单地将model目录链接到$GOPATH/src/model,然后您将拥有一个名为的包路径model,您可以使用import "model". 但为避免冲突,go 建议使用更大的包路径名。

我建议您将其链接到$GOPATH/src/bill.com/server/model并将其导入为import "bill.com/server/model". 同样./query./util你有。

如果您仍有疑问,请询问。我将尝试解释更多。

于 2014-01-21T17:47:50.543 回答
2

您是否尝试在 gvm 的开发人员站点中提出问题?https://github.com/moovweb/gvm(我不确定这是不是主要站点)

于 2014-01-21T09:33:11.087 回答
0

仔细检查gvm$GOPATH设置的 的值。

我会尝试$GOPATH手动设置仅用于测试/home/bill(使用 symlink src->dev),只是为了查看 go test -cover 是否生成文件中包含正确文件路径的 cover.out。

于 2014-01-19T09:47:23.367 回答