golang有用于下载的第三方软件包的中央存储库吗?

问题描述 投票:7回答:3

我是Golang的新手。据我了解,当您要创建一个新的Go项目时,我们只需要创建一个目录即可。然后,我们将环境变量GOPATH指向该目录。在此目录内,我们创建三个子目录pkgsrcbin。然后,当我们执行go get ...时,第三方软件包将安装在pkg子目录中。稍后,如果我要创建另一个Go项目,则创建一个名为project2的新目录,并将GOPATH指向project2。此时go get ...将在project2的pkg子目录中下载第三方软件包。我的问题是,Go是否具有中央存储库?否则,如果在两个不同的项目中使用相同的软件包,它们将被下载两次。是真的吗?

go package
3个回答

4
投票

没有go软件包的中央存储库。 Go总是在GOPATH或GOROOT中寻找软件包。只需使用git或mercurial下载软件包即可。我建议你阅读https://golang.org/doc/code.htmlhttps://peter.bourgon.org/go-best-practices-2016/#repository-structure

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


2
投票

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

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

这里的误解是GOPATH指向单个项目:不是。相反,GOPATH指向您的所有程序包所在的environmentgo get将在其中下载软件包,go build将在构建时在其中寻找软件包。

而不是更改每个项目的GOPATH,您应该设置一次GOPATH,然后将所有项目放入$GOPATH/src/(您的项目不包含src/目录,它们进入in src/目录)。

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

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

更新

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

© www.soinside.com 2019 - 2024. All rights reserved.