提问者:小点点

Go语言是否有下载的第三方包的中央存储库?


我是Golang新手。据我了解,当你想创建一个新的Go项目时,我们只需要创建一个目录。然后我们将环境变量GOPATH指向这个目录。在这个目录内,我们创建了三个子目录pkgsrcbin。然后当我们执行go get…时,第三方包将安装在pkg子目录中。稍后如果我想创建另一个Go项目,我创建一个名为project ect2的新目录,并将GOPATH指向project ect2。此时go get…会在project ect2的pkg子目录下下载第三方包。我的问题是,Go是否有中央仓库?如果没有,同一个包如果在两个不同的项目中使用,会被下载两次。是这样吗?


共3个答案

匿名用户

没有go包的中央存储库。Go总是在GOPATH或GOROOT中寻找包。go get简单地使用git或mercurial下载包。我建议你阅读https://golang.org/doc/code.html和https://peter.bourgon.org/go-best-practices-2016/#repository-structure

GOPATH只是告诉go编译器在哪里搜索srcpkg目录。

匿名用户

我想现在有https://gocenter.jfrog.com/更多的信息在这个博客https://jfrog.com/blog/go-at-full-speed-with-gocenter

匿名用户

稍后如果我想创建另一个Go项目,我创建一个名为project ect2的新dir,并将GOPATH指向project ect2…我的问题是,Go是否有中央存储库?如果没有,同一个包如果在两个不同的项目中使用,它们将被下载两次。这是真的吗?

不,Go代码没有中央存储库。但是,包总是会下载两次也不是真的。

这里的误解是GOPATH指向一个单独的项目:它没有。相反,GOPATH指向一个所有包都存在的环境;它是go get将下载包的地方,而go build将在构建时查找包的地方。

您不应该为每个项目更改GOPATH,而是应该设置GOPATH一次,并将所有项目放在$GOPATH/src/中(您的项目不包含src/目录,它们位于src/目录中)。

例如,整个树可能看起来像:

$GOPATH/src/bitbucket.org/ (or GitHub, or your website, or whatever)
├── YourProject
└── AnotherProject

值得注意的是,这个答案已经不再正确。现在Go Modules是Go代码的正常版本控制机制,并且$GOPATH正在逐步淘汰,因此已经设置了一个中央代理,通过Google服务器路由所有对包的请求,在该服务器上可以缓存包的各种标记版本。一个单独的校验和数据库为每个可审计的包保留哈希值,并可以帮助您检测包作者是否更改了已经发布的标签。所有这些都不是一个中央存储库,就像PyPi(在Python世界中)或NPM(对于JavaScript)是一个存储库一样:包仍然从它们的源代码控制中获取,但是因为默认情况下所有包都通过代理路由,所以它有类似的目的。有关更多信息,请参阅https://proxy.golang.org/