256

Looking how actively golang packages grow and improve I wonder how the problem with package versions is solved?

I see that one way is to store third-party packages under a project folder.

But what if I install it with go get?

shalakhin
  • 4,586
  • 5
  • 25
  • 30

9 Answers9

394

go get will install the package in the first directory listed at GOPATH (an environment variable which might contain a colon separated list of directories). You can use go get -u to update existing packages.

You can also use go get -u all to update all packages in your GOPATH

For larger projects, it might be reasonable to create different GOPATHs for each project, so that updating a library in project A wont cause issues in project B.

Type go help gopath to find out more about the GOPATH environment variable.

Michael M
  • 8,185
  • 2
  • 35
  • 51
tux21b
  • 90,183
  • 16
  • 117
  • 101
97

@tux answer is great, just wanted to add that you can use go get to update a specific package:

go get -u full_package_name
Salvador Dali
  • 214,103
  • 147
  • 703
  • 753
25

Since the question mentioned third-party libraries and not all packages then you probably want to fall back to using wildcards.

A use case being: I just want to update all my packages that are obtained from the Github VCS, then you would just say:

go get -u github.com/... // ('...' being the wildcard). 

This would go ahead and only update your github packages in the current $GOPATH

Same applies for within a VCS too, say you want to only upgrade all the packages from ogranizaiton A's repo's since as they have released a hotfix you depend on:

go get -u github.com/orgA/...
Altenrion
  • 764
  • 3
  • 14
  • 35
dtx
  • 626
  • 1
  • 7
  • 12
14

The above answeres have the following problems:

  1. They update everything including your app (in case you have uncommitted changes).
  2. They updated packages you may have already removed from your project but are already on your disk.

To avoid these, do the following:

  1. Delete the 3rd party folders that you want to update.
  2. go to your app folder and run go get -d
Aus
  • 1,183
  • 11
  • 27
11

To specify versions, or commits:

go get -u otherpackage@1.2.3

go get -u otherpackage@git-sha

See https://github.com/golang/go/wiki/Modules#daily-workflow

Luke W
  • 8,276
  • 5
  • 44
  • 36
6

Since this is one of the top hits when googling, I just wanted to add that for 1.17 "installing executables with 'go get' in module mode is deprecated".

  • go get -d
    • For dependencies of the current module
  • go install
    • For requirements of the current module
  • go install <with_version>
    • To install ignoring the current module, i.e: 'go install example.com/cmd@latest'

https://golang.org/doc/go-get-install-deprecation

Jaroslaw
  • 636
  • 3
  • 8
Toid
  • 61
  • 1
  • 1
4

go 1.13

(exec from module root directory)

Update specified dependencies:

go get -u <package-name>

Update all direct and indirect dependencies to latest minor or patch upgrades (pre-releases are ignored):

go get -u ./...
# or
go get -u=patch ./...

Reference:

https://github.com/golang/go/wiki/Modules#daily-workflow

go help get

F566
  • 475
  • 4
  • 8
  • What is the actual difference between `go get -u` and `go get -u ./...` In theory it should be the same but in practice `go get -u ./...` recursively updates all the dependencies of dependencies (major versions) in my project and can cause a bunch of errors. – JCMS Jan 25 '21 at 19:59
3

If you want to upgrade a version from a specific branch, you can use:

go get -u <path-to-repo>@<branch>
Zerta
  • 85
  • 6
2

Go to path and type

go get -u ./...

It will update all require packages.

kiki_ygn
  • 85
  • 3