我是Golang的新手。据我了解,当您要创建一个新的Go项目时,我们只需要创建一个目录即可。然后,我们将环境变量GOPATH
指向该目录。在此目录内,我们创建三个子目录pkg
,src
和bin
。然后,当我们执行go get ...
时,第三方软件包将安装在pkg
子目录中。稍后,如果我要创建另一个Go项目,则创建一个名为project2的新目录,并将GOPATH
指向project2。此时go get ...
将在project2的pkg
子目录中下载第三方软件包。我的问题是,Go是否具有中央存储库?否则,如果在两个不同的项目中使用相同的软件包,它们将被下载两次。是真的吗?
没有go软件包的中央存储库。 Go总是在GOPATH或GOROOT中寻找软件包。只需使用git或mercurial下载软件包即可。我建议你阅读https://golang.org/doc/code.html和https://peter.bourgon.org/go-best-practices-2016/#repository-structure
[GOPATH只是告诉go编译器在哪里搜索src
,pkg
目录。
稍后,如果我想创建另一个Go项目,则创建一个名为project2的新目录,并将GOPATH指向project2…我的问题是,Go是否具有中央存储库?否则,如果在两个不同的项目中使用相同的软件包,它们将被下载两次。是真的吗?
不,没有Go代码的中央存储库。但是,也不总是将软件包下载两次。
这里的误解是GOPATH
指向单个项目:不是。相反,GOPATH
指向您的所有程序包所在的environment; go 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/