user130268
user130268

Reputation: 1361

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

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?

Upvotes: 12

Views: 8460

Answers (5)

rsp
rsp

Reputation: 111366

2024 Update

There is now an official registry of Go packages:

The packages are still hosted in a decentralized way, e.g. on GitHub.

pkg.go.dev allows for searching inside of both the standard library and third party packages, shows licenses, documentation, links to repositories. The older godoc.org now redirects to pkg.go.dev.

See also:

Upvotes: 0

Jan Bodnar
Jan Bodnar

Reputation: 11647

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.

Upvotes: 3

user1087001
user1087001

Reputation:

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/

Upvotes: 3

elig
elig

Reputation: 441

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

Upvotes: 8

Sławosz
Sławosz

Reputation: 11687

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.

Upvotes: 7

Related Questions