忽略供应商目录

go ignoring vendor directory

我读到的关于供应商目录的所有内容都让我明白,如果我有一个目录:

$GOPATH/src/vendor

并将我的依赖项放在那里(我正在使用 godeps),在执行 go run 时,go 应该首先检查该目录。

如果我 运行 我的代码在我拥有的 Docker 图像中,则可以正常工作。然而,现在我尝试在我的 Windows 机器上 运行 相同的代码,go 只是忽略了 vendor/ 目录,并且找不到依赖项。

我做错了什么?

main.go:7:2: cannot find package "gopkg.in/alecthomas/kingpin.v2" in any of:
        C:\Go\src\gopkg.in\alecthomas\kingpin.v2 (from $GOROOT)
        C:\Users\js\dev\my_project\rest\src\gopkg.in\alecthomas\kingpin.v2 (from $GOPATH)
        C:\Users\js\dev\go\src\gopkg.in\alecthomas\kingpin.v2

我尝试做时的输出是:

go run main.go

此目录中存在目录 vendor/

go version go1.7 windows/amd64

确切的命令我运行(在windowscmd.exe)

> cd C:\Users\js\dev\my_project\rest\
> set GOPATH=C:\Users\js\dev\my_project\rest\;c:\Users\js\dev\go

> cd src
> dir
...
2016-09-01  23:20             2 923 main.go
...
2016-09-03  01:27    <DIR>          vendor

> go run main.go

你的GOPATH好像不对? GOPATH 应指定工作区的位置,即在其根目录下包含 srcpkgbin 目录的目录。

试试

set GOPATH=C:\Users\js\dev\my_project\rest\;c:\Users\js\dev\go

更多详细信息:https://golang.org/doc/code.html

首先要了解的是 godep save 只是将依赖项从 $GOPATH 复制到项目中的 vendor 目录。

您必须先 go get 您的依赖项。在$GOPATH中有了它们之后,您可以执行godep save将当前版本复制到您的项目中,并确保即使$GOPATH中的版本发生变化,您也将拥有一个固定的项目中的版本,直到您通过 godep.

明确更改它

所以,如果我有一个 /home/me/go_workspace 的 $GOPATH,和一个名为 $GOPATH/src/github.com/project_x 的项目,其依赖项为 github.com/you/xyz,那么我会做 go get github.com/you/xyz,并且godep save 来自我的项目目录。这将创建一个 vendor 文件夹,其中包含当前提交时的依赖项。

这不起作用的原因是您不应该将任何代码直接放入 $GOPATH/src/ 目录。

解决方案是将您的项目放入子目录中,如下所示:

$GOPATH/src/app/*.go