Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does golang have a central repository for the downloaded third-party packages?

Tags:

package

go

I'm new to Golang. As I understand, when you want to create a new Go project, we just need to create a directory. Then we point the environment variable GOPATH to this directory. Inside this directory, we create three subdirectories pkg, src and bin. Then when we execute go get ..., the third-party package will be installed in the pkg subdirectory. Later if I want to create another Go project, I create a new dir called project2 and point GOPATH to project2. At this time go get ... will download third-party package in the pkg subdirectory of project2. My question is, whether Go has a central repository? If not, the same package will be downloaded twice if they are used in two different projects. Is that true?

like image 915
user130268 Avatar asked Jul 26 '16 17:07

user130268


4 Answers

Later if I want to create another Go project, I create a new dir called project2 and point GOPATH to project2 … My question is, whether Go has a central repository? If not, the same package will be downloaded twice if they are used in two different projects. Is that true?

No, there is no central repository for Go code. However, it is also not true that the packages will always be downloaded twice.

The misconception here is that GOPATH points to an individual project: it does not. Instead, GOPATH points to an environment where all of your packages live; it is where go get will download packages, and where go build will look for packages when building.

Instead of changing GOPATH for every project, you should set GOPATH once and put all of your projects in $GOPATH/src/ (your projects don't contain an src/ directory, they go in the src/ directory).

So for example, the entire tree might look like:

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

Update

It is worth noting that this answer is no longer correct. Now that Go Modules are the normal versioning mechanism for Go code and $GOPATH is being phased out, a central proxy has been setup that routes all requests for packages through Google servers where the various tagged versions of the package can be cached. A separate checksum database keeps hashes for every package that are audit-able and can help you detect if a package author has changed an already released tag. All of this isn't a central repository in the same sense that PyPi (in the Python world) or NPM (for JavaScript) are a repo: the packages are still fetched from their source control, but because all packages are routed through the proxy by default it serves a similar purpose. For more information see https://proxy.golang.org/

like image 29
Sam Whited Avatar answered Nov 06 '22 05:11

Sam Whited


Recently, a new site that collects information about Go packages has emerged: https://go.dev/.

go.dev is the hub for Go users providing centralized and curated resources from across the Go ecosystem.

It is an official companion website to golang.org. It does not qualify for a repository, such as cpan, nmpjs, nuget or crates. For external packages, it simply links to their respective Github pages.

Go.dev is currently in MVP status. We’re proud of what we’ve built and excited to share it with the community. We hope you find value and joy in using go.dev. Go.dev only has a small portion of features we intend to build, and we are actively seeking feedback

But as is written it the about page, it is still in early development. Maybe one day (hopefully) it shall become a fully featured code repository.

like image 154
Jan Bodnar Avatar answered Nov 06 '22 05:11

Jan Bodnar


I guess now there is https://gocenter.jfrog.com/ More info in this blog https://jfrog.com/blog/go-at-full-speed-with-gocenter

like image 22
elig Avatar answered Nov 06 '22 03:11

elig


There is no central repository of go packages. Go always is looking for packages either in GOPATH or GOROOT. go get simply downloads packages using git or mercurial. I recommend you to read https://golang.org/doc/code.html and https://peter.bourgon.org/go-best-practices-2016/#repository-structure

GOPATH simply tells go compiler where to search for src, pkg directories.

like image 31
Sławosz Avatar answered Nov 06 '22 05:11

Sławosz