忽略供应商目录
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
应指定工作区的位置,即在其根目录下包含 src
、pkg
和 bin
目录的目录。
试试
set GOPATH=C:\Users\js\dev\my_project\rest\;c:\Users\js\dev\go
首先要了解的是 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
我读到的关于供应商目录的所有内容都让我明白,如果我有一个目录:
$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
应指定工作区的位置,即在其根目录下包含 src
、pkg
和 bin
目录的目录。
试试
set GOPATH=C:\Users\js\dev\my_project\rest\;c:\Users\js\dev\go
首先要了解的是 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