Removing packages installed with go get
Asked Answered
D

8

429

I ran go get package to download a package before learning that I needed to set my GOPATH otherwise that package sullies my root Go install (I would much prefer to keep my Go install clean and separate core from custom). How do I remove packages installed previously?

Drummond answered 9/12, 2012 at 21:54 Comment(2)
For those using Go modules #57187205Pulchia
go get example.com/mod@none from go help getChiromancy
G
278

It's safe to just delete the source directory and compiled package file. Find the source directory under $GOPATH/src and the package file under $GOPATH/pkg/<architecture>, for example: $GOPATH/pkg/windows_amd64.

Geminian answered 9/12, 2012 at 22:2 Comment(11)
At first I looked for $GOPATH/pkg/architecture/ which didn't exist. Then I realized that what you were referring to was $GOPATH/pkg/{{architecture}}, example $GOPATH/pkg/windows_amd64.Drummond
The default value of GOPATH is /usr/lib/go.Pensionary
If it is safe and simple, why is there no go subcommand that does it?Unstressed
Just create an alias or a function for it in your shell.Handy
coming from npm, we have so much further to goMendez
On windows: %GOPATH%/pkg/windows_amd64Arthromere
On Mac: $GOPATH = $HOME/goBeckybecloud
The more I learn about go, the more I realize how terrible it is at doing very 'simple', 'native' stuff. I mean, how can you have a command for installing but no command to remove. How???Tungstic
it's still just as safe and simple to delete the original src and package, and then clean up the direct dependencies, and then their dependencies. You will of course need to scan all the imports to determine what dependencies those are. But that's very simple isn't it. /s (lucky if you use go modules :D)Bussard
Yeah, really, what about the dependencies ?Dorothadorothea
It is safe? In ubuntu you have to use sudo... that is not totally safe...Bucko
B
309

A go package can be removed as follows.

go get package@none

Here @none is the version part set as none. Thus removing the package.

Beaner answered 20/5, 2021 at 12:45 Comment(12)
cannot use path@version syntax in GOPATH modeConceive
Can confirm this works for go version go1.16.5 (current date is Aug 2021).Crass
This removed compiled binary from ~/go/bin, but package still remains in ~/go/pkg/mod/github.com/.... Is there another step?Kickback
(osx) didn't remove the binary from ~/go/bin for me. no errors, no output from the command.Berny
@ZachYoung Try go clean -cache -modcache.Monjo
@rodrigocfd, thanks, that definitely cleared everything... I think I'm coming to terms with the fact that go's approach to packages is just different than what I've experienced in the past. I followed the comment on the OP, and am reading up on go mod tidy from the Blog.Kickback
nope, not working - cli still exists (i tried this with ko)Lowndes
After a "go install" it gives "go: can't request version "none" of the main module (hello)". I use asdf to install go and "go clean -i mypackagename" seems to work to remove installe execExplant
This is a weird way to remove a package. Wish it was just uninstallDrainpipe
Works but this apparently doesn't remove related lines from go.sum. Need go mod tidy for itPiperine
I swear, go has some of the weirdest command line APIs out thereSectarianism
Nowadays you have to install global packages using go install, but go install ...@none doesn't work. go install installs just a binary, so rm "$(which package-name)" is enough.Russell
G
278

It's safe to just delete the source directory and compiled package file. Find the source directory under $GOPATH/src and the package file under $GOPATH/pkg/<architecture>, for example: $GOPATH/pkg/windows_amd64.

Geminian answered 9/12, 2012 at 22:2 Comment(11)
At first I looked for $GOPATH/pkg/architecture/ which didn't exist. Then I realized that what you were referring to was $GOPATH/pkg/{{architecture}}, example $GOPATH/pkg/windows_amd64.Drummond
The default value of GOPATH is /usr/lib/go.Pensionary
If it is safe and simple, why is there no go subcommand that does it?Unstressed
Just create an alias or a function for it in your shell.Handy
coming from npm, we have so much further to goMendez
On windows: %GOPATH%/pkg/windows_amd64Arthromere
On Mac: $GOPATH = $HOME/goBeckybecloud
The more I learn about go, the more I realize how terrible it is at doing very 'simple', 'native' stuff. I mean, how can you have a command for installing but no command to remove. How???Tungstic
it's still just as safe and simple to delete the original src and package, and then clean up the direct dependencies, and then their dependencies. You will of course need to scan all the imports to determine what dependencies those are. But that's very simple isn't it. /s (lucky if you use go modules :D)Bussard
Yeah, really, what about the dependencies ?Dorothadorothea
It is safe? In ubuntu you have to use sudo... that is not totally safe...Bucko
L
230

You can delete the archive files and executable binaries that go install (or go get) produces for a package with go clean -i importpath.... These normally reside under $GOPATH/pkg and $GOPATH/bin, respectively.

Be sure to include ... on the importpath, since it appears that, if a package includes an executable, go clean -i will only remove that and not archive files for subpackages, like gore/gocode in the example below.

Source code then needs to be removed manually from $GOPATH/src.

go clean has an -n flag for a dry run that prints what will be run without executing it, so you can be certain (see go help clean). It also has a tempting -r flag to recursively clean dependencies, which you probably don't want to actually use since you'll see from a dry run that it will delete lots of standard library archive files!

A complete example, which you could base a script on if you like:

$ go get -u github.com/motemen/gore

$ which gore
/Users/ches/src/go/bin/gore

$ go clean -i -n github.com/motemen/gore...
cd /Users/ches/src/go/src/github.com/motemen/gore
rm -f gore gore.exe gore.test gore.test.exe commands commands.exe commands_test commands_test.exe complete complete.exe complete_test complete_test.exe debug debug.exe helpers_test helpers_test.exe liner liner.exe log log.exe main main.exe node node.exe node_test node_test.exe quickfix quickfix.exe session_test session_test.exe terminal_unix terminal_unix.exe terminal_windows terminal_windows.exe utils utils.exe
rm -f /Users/ches/src/go/bin/gore
cd /Users/ches/src/go/src/github.com/motemen/gore/gocode
rm -f gocode.test gocode.test.exe
rm -f /Users/ches/src/go/pkg/darwin_amd64/github.com/motemen/gore/gocode.a

$ go clean -i github.com/motemen/gore...

$ which gore

$ tree $GOPATH/pkg/darwin_amd64/github.com/motemen/gore
/Users/ches/src/go/pkg/darwin_amd64/github.com/motemen/gore

0 directories, 0 files

# If that empty directory really bugs you...
$ rmdir $GOPATH/pkg/darwin_amd64/github.com/motemen/gore

$ rm -rf $GOPATH/src/github.com/motemen/gore

Note that this information is based on the go tool in Go version 1.5.1.

Largely answered 27/10, 2015 at 15:58 Comment(3)
How do you find all the projects dependencies?Normalie
To include dependencies use the -r flag. But beware - if a dependency is used by some other package, it will still get deleted.Homespun
Should it work with Go 1.16? Go 1.16 says 'matched no packages' for any installed 'latest' (go install foo@latest) package.Embrey
M
62

You can use go mod tidy to clean unused packages

Madalene answered 9/5, 2021 at 15:8 Comment(1)
This works, but only to remove modules that are no longer being referenced from code in your module, using Go version >= 1.11+. To remove go programs or binaries installed with go get or go install, outside of your go module, then you have to use go cleanLactoscope
B
12
#!/bin/bash

goclean() {
 local pkg=$1; shift || return 1
 local ost
 local cnt
 local scr

 # Clean removes object files from package source directories (ignore error)
 go clean -i $pkg &>/dev/null

 # Set local variables
 [[ "$(uname -m)" == "x86_64" ]] \
 && ost="$(uname)";ost="${ost,,}_amd64" \
 && cnt="${pkg//[^\/]}"

 # Delete the source directory and compiled package directory(ies)
 if (("${#cnt}" == "2")); then
  rm -rf "${GOPATH%%:*}/src/${pkg%/*}"
  rm -rf "${GOPATH%%:*}/pkg/${ost}/${pkg%/*}"
 elif (("${#cnt}" > "2")); then
  rm -rf "${GOPATH%%:*}/src/${pkg%/*/*}"
  rm -rf "${GOPATH%%:*}/pkg/${ost}/${pkg%/*/*}"
 fi

 # Reload the current shell
 source ~/.bashrc
}

Usage:

# Either launch a new terminal and copy `goclean` into the current shell process, 
# or create a shell script and add it to the PATH to enable command invocation with bash.

goclean github.com/your-username/your-repository
Blakley answered 27/4, 2018 at 20:4 Comment(1)
anyone have a working copy of this for zsh ?Obidiah
R
3

I deleted the whole go folder in my home directory and then with go mod tidy I redownloaded all dependencies actually used by my project (I had a bunch of old versions in addition to the actual versions used). I recovered about 3GB of disk space.

Rivy answered 14/5, 2023 at 16:14 Comment(0)
L
2

go clean -modcache will do the trick for you

Leaflet answered 20/1 at 23:35 Comment(2)
Thank you for your interest in contributing to the Stack Overflow community. This question already has quite a few answers—including one that has been extensively validated by the community. Are you certain your approach hasn’t been given previously? If so, it would be useful to explain how your approach is different, under what circumstances your approach might be preferred, and/or why you think the previous answers aren’t sufficient. Can you kindly edit your answer to offer an explanation?Flaunty
@JeremyCaney I think OP lacks the permission to see another duplicate answer, which is already deleted. That answer even has a comment of This cleans the module download cache. Has nothing to do with installed programs or modules. Nevertheless, I agree with you that this answer is low quality in the sense that it lacks explanation and clarity and hence should be deleted.Cytogenetics
R
1

Man, i got same problem yesterday. Could't find anything in $GOPATH/pkg/<architecture> . Then, i realized that there was a go directory in my $HOME. So, i moved to $HOME/<username>/go/pkg/mod/github.com and saw all package i had installed from github by go get

Rodge answered 13/5, 2021 at 10:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.